Bind DLZ With MySQL 或者其他方式搭建了权威DNS,为了高可用的话,肯定会有多组NameServer。 除了常规的监控外,还需要监控所有SLave 的NS 的SOA 序列号(Serial Number)是否和Master 一致,如果落后的话需要报警,有时候也有可能Master NS生成的记录有错,无法同步到Slave NS,也有可能是权限方面出错等等,总之,这个监控非常有必要。
关于SOA 记录的介绍可以参考:DNS SOA 记录的结构。
@ IN SOA nameserver.place.dom. postmaster.place.dom. (
1 ; serial number
3600 ; refresh [1h]
600 ; retry [10m]
86400 ; expire [1d]
3600 ) ; min TTL [1h]
使用dig 命令向特定NameServer 查询特定域名的SOA 记录:
> dig @NS_IP domain soa
>>dig @114.114.114.114 google.com soa
> dig @NS_IP domain soa +short #返回简短的结果
>> dig @8.8.8.8 google soa +short
一个OpenFalcon 的监控脚本:
#!/usr/bin/env bash
#author: fangpsh
#check whether NSs have same SOA serial
DATE=`date +%s`
HOST=`cat /etc/hostname`
#your domain
DOMAIN=""
#master name server
MASTER_NS=""
#slave NSs, a space separated list
SLAVE_NS_SET=""
q_serial() {
dig @${1} ${DOMAIN} soa +short |cut -d ' ' -f 3
}
dns_s=`q_serial '${MASTER_NS}'`
echo -n "[{\"metric\": \"NS_Serial\", \"endpoint\": \"${HOST}\", \"tags\": \"host=${MASTER_NS}\", "
echo -n "\"value\": 0,"
echo -n " \"timestamp\": $DATE, \"counterType\": \"GAUGE\", \"step\": 60}"
for ns in ${SLAVE_NS_SET};do
ns_s=`q_serial ${ns}`
echo -n ",{\"metric\": \"NS_Serial\", \"endpoint\": \"${HOST}\", \"tags\": \"host=${ns}\", "
if [ ${dns_s} == ${ns_s} ];then
echo -n "\"value\": 0," #ok
else
echo -n "\"value\": 1," #error
fi
echo -n " \"timestamp\": $DATE, \"counterType\": \"GAUGE\", \"step\": 60}"
done
echo -n "]"