高性能dns解析集群-lvs-bind-cdn 【实时生效,后端监控】

 

 

 

 1   安装bind 服务

  
  
  
  
  1. yum -y install bind* 

  
  
  
  
  1. 主服务器: 

  2. named.conf: 

  3. [root@localhost etc]# more named.conf  

  4. // named.rfc1912.zones: 

  5. // 

  6. // Provided by Red Hat caching-nameserver package 

  7. // 

  8. // ISC BIND named zone configuration for zones recommended by 

  9. // RFC 1912 section 4.1 : localhost TLDs and address zones 

  10. // 

  11. // See /usr/share/doc/bind*/sample/ for example named configuration files. 

  12. // 

  13. options { 

  14. directory     "/var/named"; 

  15. }; 

  16. zone "." IN { 

  17.         type hint; 

  18.         file "named.ca"; 

  19. }; 

  20. zone "localdomain" IN { 

  21.         type master; 

  22.         file "localdomain.zone"; 

  23.         allow-update { none; }; 

  24. }; 

  25. zone "localhost" IN { 

  26.         type master; 

  27.         file "localhost.zone"; 

  28.         allow-update { none; }; 

  29. }; 

  30. zone "0.0.127.in-addr.arpa" IN { 

  31.         type master; 

  32.         file "named.local"; 

  33.         allow-update { none; }; 

  34. }; 

  35. zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { 

  36.         type master; 

  37.         file "named.ip6.local"; 

  38.         allow-update { none; }; 

  39. }; 

  40. zone "255.in-addr.arpa" IN { 

  41.         type master; 

  42.         file "named.broadcast"; 

  43.         allow-update { none; }; 

  44. }; 

  45. zone "0.in-addr.arpa" IN { 

  46.         type master; 

  47.         file "named.zero"; 

  48.         allow-update { none; }; 

  49. }; 

  50. zone "2.168.192.in-addr.arpa" IN { 

  51.         type master; 

  52.         file "2.168.192.zone"; 

  53.        allow-transfer { 192.168.2.163; }; 

  54.         notify yes; 

  55.         also-notify{ 192.168.2.163;} 

  56. }; 

  57. zone "test.com" IN { 

  58.         type master; 

  59.         file "test.com"; 

  60.         allow-transfer { 192.168.2.163;}; 

  61.         notify yes; 

  62.         also-notify{ 192.168.2.163;}; 

  63. }; 

  64. test.com: 

  65. [root@localhost named]# more test.com  

  66. $TTL    86400 

  67. @ IN SOA ns.test.com.       root.test.com. ( 

  68.                                         42              ; serial (d. adams) 

  69.                                         3H              ; refresh 

  70.                                         15M             ; retry 

  71.                                         1W              ; expiry 

  72.                                         1D )            ; minimum 

  73.                   IN NS           ns.test.com. 

  74.                   IN A            192.168.2.164 

  75. ns               IN A            192.168.2.164 

  76. www            IN A            192.168.2.164 

  77. 2.168.192.zone: 

  78. [root@localhost named]# more .2.168.192.zone 

  79. $TTL    86400 

  80. 2 .168.192.in-addr.arpa. IN  SOA  ns.test.com. root.localhost.  ( 

  81.                                       1997022700 ; Serial 

  82.                                       28800      ; Refresh 

  83.                                       14400      ; Retry 

  84.                                       3600000    ; Expire 

  85.                                       86400 )    ; Minimum 

  86. @        IN      NS       ns.test.com. 

  87. 8          IN      PTR     ns.test.com. 

  88. 从服务器: 

  89. 从服务器的安装很简单只需要配置named.conf文件即可,区域文件无须手动建立: 

  90. [root@localhost etc]# vi named.conf 

  91. // named.rfc1912.zones: 

  92. // 

  93. // Provided by Red Hat caching-nameserver package 

  94. // 

  95. // ISC BIND named zone configuration for zones recommended by 

  96. // RFC 1912 section 4.1 : localhost TLDs and address zones 

  97. // 

  98. // See /usr/share/doc/bind*/sample/ for example named configuration files. 

  99. // 

  100. options { 

  101. directory     "/var/named"; 

  102. }; 

  103. zone "." IN { 

  104.         type hint; 

  105.         file "named.ca"; 

  106. }; 

  107. zone "localdomain" IN { 

  108.         type master; 

  109.         file "localdomain.zone"; 

  110.         allow-update { none; }; 

  111. }; 

  112. zone "localhost" IN { 

  113.         type master; 

  114.         file "localhost.zone"; 

  115.         allow-update { none; }; 

  116. }; 

  117. zone "0.0.127.in-addr.arpa" IN { 

  118.         type master; 

  119.         file "named.local"; 

  120.         allow-update { none; }; 

  121. }; 

  122. zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { 

  123.         type master; 

  124.         file "named.ip6.local"; 

  125.         allow-update { none; }; 

  126. }; 

  127. zone "255.in-addr.arpa" IN { 

  128.         type master; 

  129.         file "named.broadcast"; 

  130.         allow-update { none; }; 

  131. }; 

  132. zone "0.in-addr.arpa" IN { 

  133.         type master; 

  134.         file "named.zero"; 

  135.         allow-update { none; }; 

  136. }; 

  137. zone "2.168.192.in-addr.arpa" IN { 

  138.         type slave; 

  139.         file "slaveslave.zone"; 

  140.         masters{192.168.2.164;}; 

  141. }; 

  142. zone "test.com" IN { 

  143.         type slave; 

  144.         file "slaves/test.salve"; 

  145.   masters{192.168.2.164;}; 

  146. }; 

  147. 上述配置后,分别启动主从的DNS服务器后,从服务器会在slaves/下生成test.salve区域文件,这样主从服务器即建好了。 

 2   配置rndc,使bind平滑重载配置文件

  
  
  
  
  1. 生成rndc控制命令的key文件  

  2. [root@linux usr]# sbin/rndc-confgen > /etc/rndc.conf   

  3. 从rndc.conf文件中提取named.conf用的key   

  4. [root@linux usr]# cd /etc  

  5. [root@linux etc]# tail -10 rndc.conf | head -9 | sed s/#\ //g >

  6. /var/named/chroot/etc/named.conf   

  7. 自动在/var/named/chroot/etc下生成named.conf文件  

  8. 进入/var/named/chroot/etc 

  9. [root@linux etc]# cd /var/named/chroot/etc 

  10. 现在named.conf文件中有了rndc-key区段 

  11. [root@linux etc]# more named.conf 

  12. key "rndc-key" { 

  13.            algorithm hmac-md5; 

  14.            secret "Nd0nLoL8t4Mv0iSpqP1noA=="; 

  15. }; 

  16. controls { 

  17.            inet 127.0.0.1 port 953 

  18.                    allow { 127.0.0.1; } keys { "rndc-key"; }; 

  19. }; 

 3   用脚本测试后端主机的存活~

  
  
  
  
  1. #!/bin/bash  

  2. #文件说明:  

  3. # /tmp/domain_list.txt                       需要监控的域名列表,每行一个域名  

  4. # /tmp/${domain}_online_ip.txt               记录在线的服务器ip,需要提前写入IP,每行一个IP  

  5. # /tmp/${domain}_down_ip.txt                 记录有故障的服务器ip  

  6. # /tmp/curl.txt                              记录curl获取的http状态码  

  7. # /tmp/${domain}_${server_ip}_cur_time.txt    记录服务器出现故障的次数  

  8. #===============================================================================  

  9. #设置一些必要的变量  

  10. keyname=rndc-key  

  11. keysecret=gAnBYq6xSv7FKTZFmzAD0Q==  

  12. #用来检测本机网络是否正常  

  13. function network_detect(){  

  14. ping -c1 8.8.8.8 >/dev/null 2>&1 && echo connect || exit 1  

  15. }  

  16. #用来删除DNS记录  

  17. function del_record(){  

  18. /usr/local/bind/bin/nsupdate <<EOF

  19. key $keyname $keysecret  

  20. update delete $domain A $1  

  21. send  

  22. quit  

  23. EOF  

  24. }  

  25. #用来增加DNS记录  

  26. function add_record(){  

  27. /usr/local/bind/bin/nsupdate <<EOF

  28. key $keyname $keysecret  

  29. update add $domain 3600 A $1  

  30. send  

  31. quit  

  32. EOF  

  33. }  

  34. #用来检测在线ip列表健康状态  

  35. function online_detect(){  

  36. if [  -s /tmp/${domain}_online_ip.txt ] ;then  

  37. for server_ip in `cat /tmp/${domain}_online_ip.txt` ;  

  38. do  

  39. curl -I -l -H "Host:$domain"  $server_ip -o "/tmp/curl.txt" >/dev/null 2>&1  

  40. ###判断状态码是否为200  

  41. if [ -s /tmp/curl.txt ] && grep '200 OK' /tmp/curl.txt >/dev/null 2>&1;then  

  42. echo "OK"  

  43. ###清空故障次数  

  44. rm -f /tmp/${domain}_${server_ip}_cur_time.txt  

  45. ###状态码非200时  

  46. else  

  47. ###开始计算故障次数  

  48. cur_time=0

  49. [ -s /tmp/${domain}_${server_ip}_cur_time.txt  ] && cur_time=`cat /tmp/${domain}_${server_ip}_cur_time.txt `  

  50. cur_time=`expr $cur_time + 1`  

  51. ###当故障次数大于等于3时  

  52. if [ $cur_time -gt 3 ];then  

  53. ###删除故障ip记录  

  54. del_record $server_ip  

  55. ###从在线ip列表中删除故障ip  

  56. sed -i "/$server_ip/d" /tmp/${domain}_online_ip.txt  

  57. ###记录故障ip到文件  

  58. echo $server_ip >> /tmp/${domain}_down_ip.txt  

  59. ###删除记录此ip的故障文件  

  60. rm -f /tmp/${domain}_${server_ip}_cur_time.txt  

  61. else  

  62. ###记录故障次数  

  63. echo $cur_time > /tmp/${domain}_${server_ip}_cur_time.txt  

  64. fi  

  65. fi  

  66. rm -f /tmp/curl.txt  

  67. done  

  68. fi  

  69. }  

  70. #用来检测故障ip列表健康状态  

  71. function down_detect(){  

  72. if [ -s /tmp/${domain}_down_ip.txt ];then  

  73. for server_ip in 'cat /tmp/${domain}_down_ip.txt' ;  

  74. do  

  75. curl -I -l -H "Host:$domain"  $server_ip -o "/tmp/curl.txt" >/dev/null 2>&1  

  76. if [ -s /tmp/curl.txt ] && grep '200 OK' /tmp/curl.txt >/dev/null 2>&1;then  

  77. ###添加A记录  

  78. add_record $server_ip  

  79. ###从${domain}_down_ip.txt删除故障ip  

  80. sed -i "/$server_ip/d" /tmp/${domain}_down_ip.txt  

  81. ###重新添加此ip到${domain}_online_ip.txt  

  82. echo $server_ip >> /tmp/${domain}_online_ip.txt  

  83. fi  

  84. rm -f /tmp/curl.txt  

  85. done  

  86. fi  

  87. }  

  88. network_detect  

  89. if [ -s /tmp/domain_list.txt ];then  

  90. for domain in 'cat /tmp/domain_list.txt' ; 

  91. do  

  92. online_detect  

  93. down_detect  

  94. done  

  95. else  

  96. echo "/tmp/domain_list.txt not found!"  

  97. exit 1  

  98. fi 

 

 

 

遇到的问题~  要是使用rndc reload的时候,从没有同步~   要改下zone的版本号~

 

还有就是加个 also-notify

想要尽快的让下面的dns更新记录的话,尽量把ttl的时间改小~   但是太小的话,dns端的压力有点大的~   可以看情况调节~   我一般设置为30

 

什么是域名的TTL值?

TTL(Time-To-Live),就是一条域名解析记录在DNS服务器中的存留时间。当各地的DNS服务器接受到解析请求时,就会向域名指定的NS服务器(权威域名服务器)发出解析请求从而获得解析记录;在获得这个记录之后,记录会在DNS服务器(各地的缓存服务器,也叫递归域名服务器)中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向NS服务器发出请求,而是直接返回刚才获得的记录;而这个记录在DNS服务器上保留的时间,就是TTL值。

域名DNS分两种,一种是权威域名服务器,域名注册商的服务器都为权威域名服务器,TTL值只能在权威服务器修改,还有一种域名解析服务器就是缓存DNS服务器,比如各地ISP上网设置的DNS服务器,它的作用主要是把域名解析结果缓存到本地,方便你查询。域名DNS的TTL值实际上就是各地的DNS缓存服务器多久去你的权威域名解析服务器(NS)获取一次你域名的解析IP。

那么域名解析的TTL只应该设置为多少合适呢,下面有两个建议,你可以结合自己参考一下:

一.增大TTL值,以节约域名解析时间,给网站访问加速。

一般情况下,域名的各种记录是极少更改的,很可能几个月、几年内都不会有什么变化。我们完全可以增大域名记录的TTL值让记录在各地DNS服务器中缓存的时间加长,这样在更长的一段时间内,我们访问这个网站时,本地ISP的DNS服务器就不需要向域名的NS服务器发出解析请求,而直接从缓存中返回域名解析记录。
国内和国际上很多平台的TTL值都是以秒为单位的,很多的默认值都是3600,也就是默认缓存1小时,这个值实在有点小了,难道会有人一个小时就改一次域名记录吗?你可以根据自己的需要把这个值适当的扩大,例如要缓存一天就设置成86400。Godaddy的TTL设置比较直观,但总共只有5个值可以选定,即时切换到高级设置模式也是如此,有点死板了。

二.减小TTL值,减少更换空间时的不可访问时间。

更换空间99.9%会有DNS记录更改的问题,因为TTL缓存的问题,新的域名记录在有的地方可能生效了,但在有的地方可能等上一两天甚至更久才生效。结果就是有的人可能访问到了新服务器,有的人访问到了旧服务器。如果原来的域名TTL值设置的小,各地的ISP域名缓存服务器服务器就会很快的访问你域名的权威DNS解析服务器,尽快把你域名的DNS解析IP返回给查询者

这就是说你如果想要解析速度,各地ISP的DNS服务器缓存你的域名,你就需要把TTL值设置大一些,如果你想域名更换空间或者IP后能尽快解析到新的IP上,就需要把TTL值设置小一些

总结:对于IP地址相对固定,或短期内不会变更IP地址的用户来说TTL值设置的大些如几个小时或更大些为宜。调大TTL值可以显著的提高域名的解析稳定性和速度。而对于近期有计划变更IP地址的用户需要提前把TTL值改小,以便使缓存在世界各地DNS服务器上的旧域名记录迅速过期,等IP地址固定下来后再把TTL值改大。

 

 

 

你可能感兴趣的:(bind)