第1章 构建企业级DNS
1.1 硬件配置
CPU:12c以上配置,DNS只要使用CPU资源,此配置可以达到3万/s并发
内存:16G
网络:千兆
备注:服务器上线前进行压测,方便以后扩容等情况。
1.2 初始化系统
参见 系统初始优化 章节。
1.3 构建高性能、高可用DNS
采用lvs-dr模式负载均衡,多idc,多套dns集群,通过master-slave技术保证dns配置的一致性。
1.3.1 高可用
1.3.1.1 物理层
1. 确保两台lvs不在同一机柜、同一物理交换机接入
2. 确保将所有dns服务器也做到不在同一机柜、同一物理交换机接入
3. 在不同的IDC构建多套dns集群,为客户端提供可切换的配置
1.3.1.2 服务层
坚决摒弃lvs上端口检测这种方式。采用自定义脚本检测为DNS的健康检测单独设置一个域名,就为了lvs检测DNS是否存活而设计。
脚本示例:
#!/bin/bash timeout=5 # 服务不可用时间在与此处timeout时间及keeplive中的retry时间 Q="单独设计的要检测解析的域名" host="/usr/bin/host" # $1为要监测DNS的IP地址 if test -z "$1"; then echo "You need to supply a DNS server to check. Qutting" exit; fi SERVER=$1 ERC=`$host -s -W $timeout $Q $SERVER > /dev/null 2>&1; echo $?` if [ $ERC -eq 0 ]; then exit 0 # 如果DNS能解析的话返回0,keeplive什么都不做 else exit 1 # 如果DNS不能解析或者超时则返回1,keeplive会踢掉此台DNS fi
1.3.1.3 客户端层
多IDC之间的流量切换是通过客户端的健康检测cron实现的,脚本每分钟运行一次,分别检测每个DNS集群虚地址的可用性。
1.3.2 高性能
通过lvs可以对每个集群做横向扩容,是否需要扩容的依据是对现有系统的压测结果,以及实时的监控数据。亦或者可以在最靠近应用层处,加上一层cache-only集群,但前提是线上环境中没有任何系统依赖于DNS的负载均衡。
1.4 压力测试
1.4.1 安装queryperf
[root@linux-node1 ~]# cd /server/tools/ # 12以上的新版本bind9源码中已经不包含queryperf [root@linux-node1 tools]# wget ftp://ftp.isc.org/isc/bind9/9.12.4/bind-9.12.4.tar.gz [root@linux-node1 tools]# tar xf bind-9.12.4.tar.gz [root@linux-node1 tools]# cd bind-9.12.4/contrib/queryperf/ [root@linux-node1 bind-9.17.2]# ./configure [root@linux-node1 bind-9.17.2]# make [root@linux-node1 queryperf]# cp queryperf /usr/bin/
1.4.2 使用qeryperf
1.4.2.1 建立压测准备文件
[root@linux-node1 ~]# vim test.txt www.leonshadow.com A www.leonshadow.com A www.leonshadow.com A …… (个数根据测试结果进行调整) www.leonshadow.com A www.leonshadow.com A
1.4.2.2 执行压测命令
[root@linux-node1 ~]# queryperf -s 10.10.10.102 -d test.txt DNS Query Performance Testing Tool Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $? [Status] Processing input data [Status] Sending queries (beginning with 10.10.10.102) [Status] Testing complete Statistics: Parse input file: once Ended due to: reaching end of file Queries sent: 59 queries # 查询次数 Queries completed: 59 queries Queries lost: 0 queries Queries delayed( ): 0 queries RTT max: 0.004210 sec RTT min: 0.001957 sec RTT average: 0.003261 sec RTT std deviation: 0.000665 sec RTT out of range: 0 queries Percentage completed: 100.00% # 查询成功结果 Percentage lost: 0.00% Started at: Fri Jul 10 10:13:05 2020 Finished at: Fri Jul 10 10:13:05 2020 Ran for: 0.012486 seconds Queries per second: 4725.292327 qps # 此配置可以支持的并发数
- 命令解析:
-s:指定DNS服务器IP地址
-d:指定压测文件
备注:可以多做几次压力测试查看临界点在哪里。
1.5 服务监控(zabbix)
1.5.1 系统基础性能
使用zabbix自带模板即可,监控指标包括:
- CPU
- 内存
- 主机存活
- 磁盘空间
- 主机运行时间
- 系统load
1.5.2 Loopback地址VIP绑定状态监控
该架构中,dnsserver在集群中充当realserver的角色,在DR中需要绑定loopback地址方能通信,因此当loopback地址没有绑定上时,lvs健康检测通过,但是当请求到达dnsserver时,请求被拒绝,dns集群会出现异常。
1.5.3 DNS主从数据一致性监控
1. 通过写zabbix自定义discovery,扫出dns配置中所有zone,然后分别对比slave和master每个zone的serial值,当slave与master的值持续5分钟不一致时报警。
- 写脚本,每15分钟扫一遍master上所有域名解析结果,与每个slave的结果做对比,当出现结果不一致情况时报警。
1.5.4 DNS响应时间监控
远端一组主机跑在fullnat下(提供高可用),通过dig命令检测dnsserver的响应时间。
1.5.5 DNS每秒请求数监控
在每台dns主机上,编写zabbix脚本,分析named_stats文件,获取每秒请求数,示例如下:
#!/bin/bash #rndc stats STATS='/var/named/chroot/var/log/named_stats' if [[ $# -ne 1 ]] then echo "$0 [querys]" exit 2 else which=$1 fi if [[ -f "${STATS}" ]] then echo > ${STATS} rndc stats >/dev/null 2>&1 else echo "${STATS} not found." exit 2 fi case ${which} in querys) RESULT=`awk '{if ($2=="QUERY") {print $1}}' ${STATS}` ;; *) echo "$0 [querys]" exit 2 ;; esac echo ${RESULT}
1.5.6 DNS可用性监控
远端一组主机跑在fullnat下(提供高可用),通过host命令检测dnsserver的可用性,脚本与lvs健康检测脚本类似。
