第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健康检测脚本类似。