最佳实践5:详解BIND视图技术及优化
上一个实践使用多个A记录的方式,实现了最基本的负载均衡设置。在中国目前的网络环境下,多个运营商并存,运营商之间存在一定的互联互通问题。如果把来自不同运营商或者地域的所有用户通过简单的A记录分配到同一个机房,那么就存在部分用户访问延时大或者丢包的问题。
BIND视图工作原理
那么这个问题怎么解决呢?在BIND里面提供了视图(DNS View)技术来解决这个问题。DNS视图技术,就是对同一个资源记录根据DNS的请求来源IP地址不同分配给解析器不同的解析结果。也就是说,可以使用BIND视图技术实现以下功能。
·对于来自山东省的中国电信的DNS请求,可以把用户引导到部署在山东省中国电信机房的服务器上。
·对于无法匹配到某个具体运营商或者国外的用户,可以把用户引导到指定的一组默认服务器上。
所有以上的功能,都是为了实现用户的就近访问,也就是让用户访问到对他来说网络质量最好的服务器上。
下面来看一个具体的配置。
首先用acl/SD_CTC来列举需要匹配的来源IP:
acl "SD_CTC" { 58.56.0.0/15; 58.58.0.0/16; 58.59.0.0/17; 60.235.0.0/16; 122.4.0.0/14; 123.168.0.0/14; 222.173.0.0/16; 222.174.0.0/15; };
然后再用view/SD_CTC来调用acl/SD_CTC的内容:
view "view_SD_CTC" { match-clients { #使用match-clients指令,指定匹配来自这些IP的用户 SD_CTC; #引用acl/SD_CTC的内容 }; include "public.def"; #指定这些IP来源的用户,使用如下的zone文件提供服务 zone "via.woyodns.com" { type master; file "zone/via.any.zone"; }; zone "web.woyodns.com" { type master; file "zone/web.any.zone"; }; zone "cdn.woyodns.com" { type master; file "zone/cdn.hbjmCTC.zone"; }; };
最后再用named.conf来使其关联起来生效:
include "acl/SD_CTC"; include "acl/SD_CNC"; include "acl/SD_OTHER"; include "view/SD_CTC"; include "view/SD_CNC"; include "view/SD_OTHER ";
总结起来就是使用acl指令圈定一批来源IP地址,使用view的match-clients匹配该acl,为其分配zone文件用于解析,使用named.conf加载acl和view使其生效。
BIND视图优化技巧
读者可以看到,这里面核心的内容是acl/SD_CTC里面的IP地址,也就是IP库。这些数据哪来的呢?
可以使用如下方法:
·使用纯真IP数据库进行分析。
·使用BIND自带的log进行分析。分析日志的可行性主要是基于目前国内的开放DNS服务器,数量不多,通过对log的多次分析即可逐步精确地匹配。
使用如下指令配置后,BIND的请求数据会记录在/var/query.log:
channel query_log { file "/var/query.log" versions 5 size 20m; severity info; print-time yes; print-category yes; }; category queries{ query_log; };
其中一条日志如下:
04-Jan-2016 11:35:29.478 queries: client 210.51.28.230#52147 (www99.xufeng.info): query: www99.xufeng.info IN A +E (192.243.119.145)
其中210.51.28.230是某台开放域名服务器的地址,通过使用http://www.cnnic.cn/即可查询出该IP地址的运营商和地区等情况,然后将相关信息添加到对应的acl中。
注意
BIND视图技术所依据的来源IP地址,并不是访问网站等的终端用户的来源地址,而是这些终端用户配置的本地DNS服务器。如果山东省联通用户配置了上海市电信提供的DNS服务器,则可能会被调度到电信站点,出现偏差。