天天看点

构建企业DNS的注意事项

在对DNS做了一些常见的配置学习之后,我们就可以再探讨一下企业级DNS的构建方法了。企业级DNS由于要承载高并发,大流量,所以硬件性能和全局的架构设计就显得非常重要。在实际的生产环境中,如果并发量特别大的话,关闭SELINUX 和防火墙可以大幅提高DNS性能。同时,至少使用千兆网络。

DNS命名规范

26个英文字母

“0,1,2,3,4,5,6,7,8,9”十个数字

“-”(英文中的连词号)

最多63字节长度

如果不按照这个规范,需要在master-view文件上配置check-names ignore;

DNS压测

在部署线上的服务时,需要对服务的状态进行压测。对DNS压测可以使用queryperf .

测试示例:

下载bind-9.9.9-P1.tar ,并执行下面命令安装:

1

2

3

4

5

6

7

<code>tar</code> <code>xvf bind-9.9.9-P1.</code><code>tar</code> 

<code>cd</code> <code>bind-9.9.9-P1</code>

<code>cd</code> <code>contrib/</code>

<code>cd</code> <code>queryperf/</code>

<code>.</code><code>/configure</code> 

<code>make</code>

<code>cp</code> <code>queryperf </code><code>/usr/bin/</code>

在当前目录创建test.txt的测试文本,文本内容为本地需要解析的域名:

<code>[root@DNS-Server queryperf]</code><code># cat test.txt </code>

<code>view.viewtest.com A       </code><code>#对A记录解析情况进行压测,可以根据需要添加各种解析记录。</code>

<code>view.viewtest.com A       </code><code># 一般进行压测会添加几万条类似的记录以查看性能</code>

<code>view.viewtest.com A</code>

使用queryperf命令进行压测:

queryperf  -d test.txt -s 114.114.114.114  #  -d 指定压测的解析内容文件 -s 指定压测的服务器

queryperf的使用格式:

<code>queryperf [-d datafile] [-s server_addr] [-p port] [-q num_queries]</code>

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<code>[root@DNS-Server queryperf]</code><code># queryperf -d test.txt  -s 192.168.1.10</code>

<code>DNS Query Performance Testing Tool</code>

<code>Version: $Id: queryperf.c,</code><code>v</code> <code>1.12 2007</code><code>/09/05</code> <code>07:36:04 marka Exp $</code>

<code>[Status] Processing input data</code>

<code>[Status] Sending queries (beginning with 192.168.1.10)</code>

<code>[Status] Testing complete</code>

<code>Statistics:</code>

<code>  </code><code>Parse input </code><code>file</code><code>:     once</code>

<code>  </code><code>Ended due to:         reaching end of </code><code>file</code>

<code>  </code><code>Queries sent:         3 queries         </code><code># 查询请求的次数</code>

<code>  </code><code>Queries completed:    3 queries         </code><code># 查询完成的次数</code>

<code>  </code><code>Queries lost:         0 queries</code>

<code>  </code><code>Queries delayed(?):   0 queries</code>

<code>  </code><code>RTT max:         0.004663 sec</code>

<code>  </code><code>RTT min:              0.004651 sec</code>

<code>  </code><code>RTT average:          0.004656 sec</code>

<code>  </code><code>RTT std deviation:    0.000006 sec</code>

<code>  </code><code>RTT out of range:     0 queries</code>

<code>  </code><code>Percentage completed: 100.00%</code>

<code>  </code><code>Percentage lost:        0.00%</code>

<code>  </code><code>Started at:           Fri Dec  9 16:26:06 2016</code>

<code>  </code><code>Finished at:          Fri Dec  9 16:26:06 2016</code>

<code>  </code><code>Ran </code><code>for</code><code>:              0.004697 seconds   </code>

<code>  </code><code>Queries per second:   638.705557 qps     </code><code># 并发越多,值越大,每秒执行的查询次数</code>

DNS监控

可以通过结合zabbix来实现对DNS的监控。对于DNS的监控需要注意以下几点:

系统基础性能的监控: 使用zabbix自带的模板可以实现对服务器CPU,内存,存储,磁盘,系统负载,网卡流量进行监控。

LOOPBACK地址绑定状态监控:在LVS做DNS负载均衡调度的架构中,dnsserver在集群中充当real server的角色,DR模式下,需要绑定loopback地址方能通信,因此当loopback地址没有绑定上时,lvs健康检查可以通过,但是后端的dnsserver会丢弃请求的数据包,造成dns服务不可用。(可参见LVS DR模式的实现原理)

DNS数据与master数据一致性监控:

 通过配置zabbix自定义的discovery功能,扫出dns配置中所有zone,然后分别对比slave和master每个zone的serial值,当slave与master的值持续5分钟不一致时报警。

通过编写脚本,每隔15分钟扫描master上所有域名解析的结果,与每一个slave上的结果做对比,当出现不一致时报警。

DNS响应时间的监控: 远端主机跑在fullnat 模式下(提供高可用),通过dig命令检查dnsserver的响应时间。

DNS每秒请求数监控:每台dns主机上编写zabbix脚本,分析named_status文件,获取每秒请求数。

示例脚本:

25

26

27

28

<code>#!/bin/sh</code>

<code>#rndc status</code>

<code>STATS=</code><code>'/var/named/chroot/var/log/named_stats'</code>

<code>if</code> <code>[[ $</code><code># -ne 1 ]]</code>

<code>then</code>

<code>  </code><code>echo</code> <code>"$0  [querys]"</code>

<code>  </code><code>exit</code> <code>2</code>

<code>else</code>

<code>  </code><code>which</code><code>=$1</code>

<code>fi</code>

<code>if</code> <code>[[ -f </code><code>"${STATS}"</code> <code>]]</code>

<code>  </code><code>echo</code> <code>&gt; ${STATS}</code>

<code>  </code><code>rndc stats &gt; </code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>  </code><code>echo</code> <code>"${STATS} not found."</code>

<code>case</code> <code>${</code><code>which</code><code>} </code><code>in</code>

<code>querys)</code>

<code>  </code><code>RESULT=`</code><code>awk</code> <code>'{if {$2=="QUERY"} {print $1}}'</code> <code>${STATS}`</code>

<code>  </code><code>;;</code>

<code> </code><code>*)</code>

<code>  </code><code>echo</code> <code>"$0 [querys]"</code>

<code>  </code><code>esac</code>

<code>echo</code> <code>${RESULT}</code>

DNS日常运维规范

确保所有监控均处于生效状态;

所有的新机器,均在saltstack上完成安装、部署,不能单独操作;

所有针对dns架构调整的操作,均在流量低谷进行;

对集群扩容时,务必加入新节点做压测,同时重启服务,并检测重启后各项指标是否正常;

 本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1881322