1. 程式人生 > >利用Bind DLZ MySQL 構建智慧DNS

利用Bind DLZ MySQL 構建智慧DNS

本文來自: IT運維專家網 作者: NetSeek 日期: 2009-3-8 19:52 閱讀: 742 人 列印 收藏

DNS, Bind, DLZ, 智慧, MySQL

作者:NetSeek  http://www.linuxtone.org
日期:2009-3-7 gmail:[email protected]
推薦下載PDF版(方便查閱):http://www.linuxtone.org/project/cdn/bind-dlz-view.pdf
【題 綱】
一、相關述語簡介
二、智慧DNS系統服務規劃
三、安裝配置Bind-DLZ (介紹Bind-dlz具體安裝)


四、新增相關記錄並進行測試
五、後續話題及相關參考.
一、相關術語簡介:
1、智慧DNS(Bind-view)
智慧DNS的原理很簡單:在使用者解析一個域名的時候,判斷一下使用者的IP,然後跟DNS伺服器內部的IP表匹配一下,看看使用者是電信還是網通使用者,然後給使用者返回對應的IP地址。目前的域名服務運營商不提供智慧DNS服務,所以必須自行架設DNS服務或者使用網上免費的智慧DNS服務,如DNSPOD.
2.Bind-DLZ
Bind-DLZ主頁:http://bind-dlz.sourceforge.net/
DLZ(Dynamically Loadable Zones)與傳統的BIND9不同,BIND的不足之處:
* BIND從文字檔案中獲取資料,這樣容易因為編輯錯誤出現問題。
* BIND需要將資料載入到記憶體中,如果域或者記錄較多,會消耗大量的記憶體。
* BIND啟動時解析Zone檔案,對於一個記錄較多的DNS來說,會耽誤更多的時間。
* 如果近修改一條記錄,那麼要重新載入或者重啟BIND才能生效,那麼需要時間,可能會影響客戶端查詢。
而Bind-dlz 即將幫你解決這些問題, 對Zone檔案操作也更方便了,直接對資料庫操作,可以很方
便擴充及開發管理程式。
二、智慧DNS系統服務規劃:

1、NameServer 伺服器註冊(到新網或者萬網後臺新增)
ns1.aim18.com  211.100.72.137
ns2.aim18.com  219.232.244.11
點選檢視原始尺寸

下載 (12.5 KB)

2009-3-8 19:52

2、測試NS記錄是否生效.

  1. #dig ns aim18.com
  2. #dig aim18.com +trace

複製程式碼

更多的命令技巧請參考: http://bbs.linuxtone.org/thread-2021-1-1.html
3、Bind-View規劃
www.aim18.com 網通 (CNC)  210.51.36.116 (NK手機)
www.aim18.com 電信(TELECOM) 221.238.249.178 (CU)
www.aim18.com 教育網(EDU) 202.205.109.207 (教育網)
www.aim18.com 電信通(ANY) 211.103.156.230 (51CTO)
【注】:由於資源問題,在此引用國內一些知名站點的IP做實驗,請見諒~!
即當您是網通使用者的時候,輸入

www.aim18.com智慧DNS伺服器將把你分配到210.51.36.116 (NK手機) 這臺伺服器,其它同例。
View{CNC(網通),TELECOM(電信),EDU(教育網),ANY(其它所有)}

  1. include "/usr/local/bind/etc/cnc_acl.conf";
  2. include "/usr/local/bind/etc/telecom_acl.conf";
  3. include "/usr/local/bind/etc/edu_acl.conf";

複製程式碼

【注】IP庫及ACL,如果你有比較詳細的按城市或者地域的IP庫,在設計BIND-VIEW這個欄位的時候,VIEW就可以以城市或地區來命名和規劃.
三、安裝配置Bind-DLZ
1、編譯安裝MySQL
在此不作介紹,具體的請看http://www.linuxtone.org 相關內容。
注意編譯MySQL的時候禁掉執行緒,相關的引數如下:

  1. --without-server --disable-threads --without-pthread

複製程式碼

2、編譯安裝Bind

  1. #mkdir /usr/local/src/bind-dlz
  2. #cd /usr/local/src/bind-dlz
  3. #wget http://ftp.isc.org/isc/bind9/9.6.0-P1/bind-9.6.0-P1.tar.gz
  4. #tar zxvf bind-9.6.0-P1.tar.gz

複製程式碼

  1. #cd bind-9.6.0-P1
  2. #./configure --with-dlz-mysql --enable-largefile --enable-threads=no --prefix=/usr/local/bind --with-openssl=/usr/local/openssl/

複製程式碼

注:禁掉執行緒;--with-openssl= 你的openssl安裝的相關目錄有可能是/usr

  1. # make && make install

複製程式碼

建立相關配置檔案

  1. cd /usr/local/bind/etc
  2. ../sbin/rndc-confgen >rndc.conf
  3. tail -n10 rndc.conf | head -n9 | sed -e s/#///g >named.conf

複製程式碼

# vi localhost.zone

  1. ttl 86400
  2. @ IN SOA localhost. root.localhost. (
  3. 1997022700 ; Serial
  4. 28800 ; Refresh
  5. 14400 ; Retry
  6. 3600000 ; Expire
  7. 86400 ) ; Minimum
  8. IN NS localhost.
  9. 1 IN PTR localhost.

複製程式碼

# dig > named.root
#vi named.conf 在後面加入如下:

  1. include "/usr/local/bind/etc/cnc_acl.conf"; //網通ACL
  2. include "/usr/local/bind/etc/telecom_acl.conf"; //電信ACL
  3. include "/usr/local/bind/etc/edu_acl.conf"; //教育網ACL
  4. include "/usr/local/bind/etc/view.conf"; //DLZ相關的配置

複製程式碼

#vi /usr/local/bind/etc/view.conf //建立view相關的配置檔案
#cnc-view //貼出其中網通部分的範例,更詳細的請參照view.conf配置檔案.

  1. view "cnc_view" {
  2. match-clients { CNC; };
  3. allow-query-cache { none; };
  4. allow-recursion { none; };
  5. allow-transfer { none; };
  6. recursion no;
  7. dlz "Mysql zone" {
  8. database "mysql
  9. {host=127.0.0.1 dbname=cdn_view ssl=false port=3306 user=root pass= }
  10. {select zone from dns_records where zone = '%zone%' and view='CNC' limit 1}
  11. {select ttl, type, mx_priority, case when lower(type)='txt' then concat('/"', data, '/"') when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from dns_records where zone = '%zone%' and host = '%record%' and view='CNC'}
  12. {}
  13. {select ttl, type, host, mx_priority, case when lower(type)='txt' then concat('/"', data, '/"') else data end as mydata, resp_person, serial, refresh, retry, expire, minimum from dns_records where zone = '%zone%' and view='CNC'}
  14. {select zone from xfr_table where zone = '%zone%' and client = '%client%' and view='CNC' limit 1}
  15. {update data_count set count = count + 1 where zone ='%zone%' and view='CNC'}";
  16. };
  17. };

複製程式碼

  1. mysql>create database cdn_view; //建立資料庫名為cdn_view
  2. mysql>use cdn_view;
  3. CREATE TABLE `dns_records` (
  4. `id` int(10) unsigned NOT NULL auto_increment,
  5. `zone` varchar(255) NOT NULL,
  6. `host` varchar(255) NOT NULL default '@',
  7. `type` enum('MX','CNAME','NS','SOA','A','PTR') NOT NULL,
  8. `data` varchar(255) default NULL,
  9. `ttl` int(11) NOT NULL default '800',
  10. `view` enum('CNC','TELECOM','EDU','ANY') NOT NULL, //智慧DNS區域範圍
  11. `mx_priority` int(11) default NULL,
  12. `refresh` int(11) NOT NULL default '3600',
  13. `retry` int(11) NOT NULL default '3600',
  14. `expire` int(11) NOT NULL default '86400',
  15. `minimum` int(11) NOT NULL default '3600',
  16. `serial` bigint(20) NOT NULL default '2008082700',
  17. `resp_person` varchar(64) NOT NULL default 'root.domain.com.',
  18. `primary_ns` varchar(64) NOT NULL default 'ns1.domain.com.',
  19. `data_count` int(11) NOT NULL default '0',
  20. PRIMARY KEY (`id`),
  21. KEY `type` (`type`),
  22. KEY `host` (`host`),
  23. KEY `zone` (`zone`)
  24. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;

複製程式碼

#desc dns_records; 顯示錶結構.
點選檢視原始尺寸

下載 (11.19 KB)

2009-3-8 19:52

【注】直接將本文提供的cdn_vew.sql匯入你的資料庫即可,具體操作如下:

  1. Mysql>create database cdn_view; //建立cdn_view資料庫
  2. #mysql cdn_view –uroot –p < cdn_view.sql 匯入資料庫

複製程式碼

4、啟動bind服務.
# /usr/local/bind/sbin/named -uroot -g -d 9 //除錯狀態,如果沒有報錯說明環境配置正確。
做成啟動服務. Debug的時候多用此模式啟動bind.
# /usr/local/bind/sbin/rndc reload 過載named.conf相關配置檔案.
# /usr/local/bind/sbin/named -uroot -c /usr/local/bind/etc/named.conf 啟動bind服務.
四、新增相關記錄並進行測試
將相關解析記錄新增到資料庫內,以下是相關SQL範例供參考:
1、新增SQL建立相關ZONE及記錄.(以網通為例,具體建我提供的測試SQL)

  1. - - - - SOA
  2. INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  3. ('aim18.com', '@', 'SOA', 'ns1.aim18.com.', 10, 'CNC', NULL, 3600, 3600, 86400, 10, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  4. - - - - NS--SOA
  5. INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`,
  6. `primary_ns`, `data_count`) VALUES
  7. ('aim18.com', '@', 'SOA', '211.100.72.137', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  8. - - - - NS1
  9. INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  10. ('aim18.com', 'ns1', 'A', '211.100.72.137', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  11. - - - - NS2
  12. INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  13. ('aim18.com', 'ns2', 'A', '219.232.244.11', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  14. - - - - A
  15. INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
  16. ('aim18.com', 'www', 'A', '210.51.36.116', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
  17. - - - -CNAME
  18. INSERT INTO dns_records (zone,host,type,DATA,view)
  19. VALUES ('aim18.com', 'man', 'CNAME', 'www','CNC');

複製程式碼

2. 基本查詢測試:
通過網通的機器查詢,解析後得到提網通的伺服器,說明智慧解析是正確的。
nslookup.png

下載 (5.46 KB)

2009-3-8 19:52

soa.png

下載 (*** KB)

2009-3-8 19:52

settypeany.png

下載 (6.03 KB)

2009-3-8 19:52

經測試解析都比較正確,能將電信使用者解析到電信伺服器,網通使用者解析到網通伺服器,教育網使用者
解析到教育網網伺服器,電信通使用者解析到電信通伺服器.
【注】本方案中的IP庫抓取由(edison7500) 欣哥熱情幫助分析抓取IP庫,在此表示感謝!目前從測試來看IP庫比較精準,能夠真正做到智慧DNS的智慧解析
3、效能測試工具

  1. # cd /usr/local/src/bind-dlz
  2. # cd bind-9.6.0-P1/contrib/queryperf
  3. # ./configure && make

複製程式碼

# vi rslist //解析記錄列表寫入此檔案

  1. www.aim18.com A
  2. bbs.aim18.com A
  3. man.aim18.com CNAME

複製程式碼

…..
#vi do.sh //建立一個迴圈程式對了bind伺服器查詢進行壓力測試,同時多關注資料庫狀態.

  1. #!/bin/bash
  2. while true
  3. do
  4. ./queryperf –d rslist -s 211.100.72.137 -v
  5. done

複製程式碼

/usr/local/bind/sbin/named -uroot -g -d 9 bind啟為除錯模式,在bind排錯的時候請多用此模式來debug.
這裡可以觀察到查詢過程中執行的SQL。
【注】在此不做深入詳細的效能和壓力測試報告,使用者可以自己通過以上範例編寫壓力測試方案。
五、後續話題及相關參考
1、利用PHP程式開發一套Bind-DLZ 管理程式
目前正在編寫PHP管理頁面,Falcon.C版主正在幫我做這方面的工作。主要在於資料設計和優化還需要花一些時間。大家可以考慮進一步優化資料庫結構,同時也希望能與我分享你的心得。
PHP頁面管理參考網站:
1)、https://svn.lokkju.com/svn/dnsEditor/trunk/ 國外開源程式
2)、http://www.dnswood.com/ dnswood的管理介面
3)、http://www.dnspod.com dnspod老牌智慧DNS站的管理介面,使用者體驗做的一流!
2、智慧DNS叢集構建
Bind本身也很容易構建叢集,由於Zone檔案是存在資料庫裡面,利用mysql服務
器也很容易構建多個叢集,很方便擴充,在些就不做詳細介紹。
相關技術點: 負載均衡:LVS, 資料庫叢集:MySQL Replication.
3、結合SQUID伺服器,可以很輕鬆實現CDN.
目前國內CDN技術比較熱,國內各大門戶都在考慮自建CDN,利用本文提供的智慧DNS構建文件可以很方便的實現智慧DNS解析系統,再與SQUID叢集結合,可以很輕鬆實現CDN。下次我將給大家介紹SQUID構建和優化的經驗,同時推薦出整
套的CDN叢集解決方案,請實時關注linuxtone: http://www.linuxtone.org 相關資訊。
4、相關參考網址.
1)、DNS相關工具(解析排錯):http://bbs.linuxtone.org/thread-2021-1-1.html
2)、Bind-DLZ國外相關資料參考:
http://projects.navynet.it/DLZ/dlz-addons/
http://svn.the-mesh.org/trac.cgi/wiki/HardyBindDlzHowto
http://svn.the-mesh.org/trac.cgi/attachment/ticket/40/bind9-dlz.sql
http://projects.navynet.it/DLZ/dlz-addons/
5、附件相關的檔案說明:
bind_dlz/etc.tar.gz 為/usr/local/bind/etc配置檔案含IP庫,編譯後直接替換此檔案.
bind_dlz/cdn_view.sql 為bind-dlz資料庫表結構及資料, 直接用mysql 命令匯入資料庫.
下載地址:http://www.linuxtone.org/project/cdn/bind-dlz.tar.gz
測試資料:http://www.linuxtone.org/project/cdn/test.txt

相關推薦

利用Bind DLZ MySQL 構建智慧DNS

本文來自: IT運維專家網 作者: NetSeek 日期: 2009-3-8 19:52 閱讀: 742 人 列印 收藏 DNS, Bind, DLZ, 智慧, MySQL 作者:NetSeek  http://www.linuxtone.org 日期:200

Bind-DLZ with MySQL

word path 遠程 zxvf 地址 包安裝 -m random 相關 系統環境: 系統:centos 6.8 Mysql: 5.1 BIND: bind-9.11.0-P2.tar.gz 軟件下載地址:ftp://ftp.isc.org/ 一、安裝並配置MySQL

利用nodejs express mysql +boostrap構建一個部落格

學習了一週的node.js 發現因為版本的原因,很多例子都無法使用,準備使用nodejs + express +mysql + boostrap構建一個簡單部落格。 一、前期準備: 1、自行安裝nodejs、npm、mysql 2、利用express 建立一個工程 1) 首

【案例】利用innodb_force_recovery 解決MySQL服務器crash無法重啟問題

sock ogre ogr 事務 == format span caused his 一 背景 某一創業的朋友的主機因為磁盤陣列損壞機器crash,重啟MySQL服務時 報如下錯誤: InnoDB: Reading tablespace informatio

利用Sqoop將MySQL數據導入Hive中

sqoop參考http://www.cnblogs.com/iPeng0564/p/3215055.htmlhttp://www.tuicool.com/articles/j2yayyjhttp://blog.csdn.net/jxlhc09/article/details/168568731.list da

關於利用PHP訪問MySql數據庫的邏輯操作以及增刪改查實例操作

自增 刪除 nbsp bsp 增刪 sso 成員 執行 ech PHP訪問MySql數據庫 <?php //造連接對象$db = new MySQLi("localhost","root","","0710_test");//寫SQL語句$sql = "select

利用JavaFX訪問MySQL數據庫

com .cn ati button 獲取 integer 占位符 dst system 1. 創建數據庫表 create table Course( courseId char(5), subjectId char(4) not null, courseNumber

關於VS2017,VS2015 中利用 EF使用Mysql 不顯示數據源問題解決方案

es2017 get 可能 顯示 tps 直接 是否 最好 net 在win7,win10,vs2015,vs2017之間折騰了兩天,死活就是調不出來Mysql數據源。真是活見鬼了。 直接說方案吧。 一,卸載你所安裝過的mysql-connector-net、mysql

構建主從DNS域名服務器

DNS主從服務器主DNS服務器提供一個域或某幾個域內的主機名與IP地址的查詢服務,為了分擔域名查詢的壓力,提供區域數據的備份,有時還會架設一臺從DNS服務器,實現與主DNS服務器的同步。本實驗將開啟兩臺linux服務器,一臺是rh6-1(主),一臺是rh6-2(從),並用xshell進行遠程連接,該實驗我做的

利用pandas將mysql查詢出得結果寫入到excel文件

pandas excel#!/usr/bin/env python3import pandas as pdimport pymysql#返回SQL結果的函數def getrel(sql): conn = pymysql.connect(host='localhost',user=

利用Amoeba實現MySQL主從復制和讀寫分離

生產環境 層級 cal 目錄名 發現 slaves zxvf 同步服務 code 在實際生產環境中,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,無論是在安全性、高可用性,還是高並發等各個方面都是完全不能滿足實際需求的,因此,一般來說都是通過主從復制(Master-Sl

大數據構建智慧城市“新引擎”,加速推進新舊動能轉換

會議室 開發者 應用 text 科技 water 工程 學習 大數據 7月13日,“大數據攜手智慧城市,助力山東新舊動能轉換”技術交流分享會——濟南站在山東信息通信技術研究院會議室成功舉辦,此次會議由山東省智慧城市產業技術創新戰略聯盟、青島市大數據與雲計算行業協會主辦、青島

mybaitis動態sql利用bind標簽代替%拼接完成模糊查詢

val sql 模糊 user password concat 拼接 tis 完成   Oracle中使用bind的寫法 <select id="selectUser" resultType="user" parameterType="user">

使用php與mysql構建我們的網站

技術這個玩意就是要不斷的去使用,才能夠熟能生巧。今天我記錄的使用php與mysql構建我們的網站,其實是我兩年前的時候寫的專案。 現在看看自己以前寫的個人專案,也會感嘆時間究竟帶走了什麼?好記性不如爛筆頭,常寫常練,才能夠真正的有收穫。這個專案當初也是為了公司的專案 能夠做的更好,自己又喜歡足球,所以才模仿的

利用 netsh 給 mysql 開啟多埠監聽

利用 netsh 給 mysql 開啟多埠監聽 標題黨,實際並不是真的多埠監聽,只是埠轉發而已。 由於某種特殊原因需要 mysql 伺服器多個埠監聽。 mysql 伺服器本身是不支援的,但可以通知埠轉發的方式。 本機的 IP 是 192.168.1.2 netsh interface portprox

淺談Redis與MySQL的耦合性以及利用管道完成MySQL到Redis的高效遷移

淺談Redis與MySQL的耦合性以及利用管道完成MySQL到Redis的高效遷移     ㈠ Redis 與 MySQL 的耦合性          在業務架構早期、我們便該"吃著碗裡的看著鍋裡的"、切莫讓MyS

Centos7上利用corosync+pacemaker+crmsh構建高可用叢集

一、高可用叢集框架 資源型別: primitive(native):表示主資源 group:表示組資源,組資源裡包含多個主資源 clone:表示克隆資源 masterslave:表示主從資源 資源約束方式: 位置約束:定義資源對節點的傾向性 排序約束:定義資源彼此能否執行在同一

利用python 將 mysql 資料進行抽取並清理成標準格式後 存入MSSql 資料中

from pymongo import MongoClientfrom pymysql import connectimport pymssqlfrom datetime import datetime, timedeltaimport time Nagios 資料庫的IP 地址 NagiosDB_IP

利用python 將 mysql 數據進行抽取並清理成標準格式後 存入MSSql 數據中

lse val display ont update mys word values utf from pymongo import MongoClientfrom pymysql import connectimport pymssqlfrom datetime imp

Django中models利用ORM對Mysql進行查表的語句

一: all()  返回模型類對應表格中所有的資料。 二:get():返回表格中滿足條件的一條資料,如果查到多條資料,則拋異常:MultipleObjectsReturned,查詢不到資料,則拋異常:DoesNotExist。 三:filter():引數寫查詢條件,返回滿足條件 Q