在Linux环境中搭建高可用DNS服务,核心目标是消除单点故障并保证域名解析持续可用。常见方案是结合Keepalived实现虚拟IP漂移,后端运行Bind或Unbound提供解析。当主节点异常时,备节点自动接管流量,用户无感知。

Keepalived与虚拟IP漂移原理
Keepalived基于VRRP协议工作,集群中的节点分为MASTER和BACKUP角色。所有节点共享一个虚拟IP(VIP),仅MASTER负责响应ARP请求并持有该IP。Keepalived通过周期性心跳检测自身服务状态,一旦主节点失去响应,BACKUP在选举后提升为MASTER并广播免费ARP,将VIP绑定到自身网卡,实现透明切换。
要避免脑裂问题,不能仅依赖网络连通性判断。实际部署中应在Keepalived配置里调用自定义健康检查脚本,检测DNS进程是否存活以及能否正常解析测试域名。只有脚本返回0时节点才认为自身健康,否则主动降低优先级触发切换。以下脚本检查named进程与本地解析:
#!/bin/bash # 检查bind进程 if ! pgrep -x named > /dev/null; then exit 1 fi # 测试解析 if ! dig +short @127.0.0.1 ippipp.com > /dev/null; then exit 1 fi exit 0
在Keepalived的vrrp_script段引用上述脚本,并设置weight值为负,当脚本失败时降低优先级。这样即使网络未断但DNS失效,也会发生切换。该机制比单纯靠VRRP超时更可靠,也更符合真实业务诉求。
Bind主从区传输与一致性保障
后端DNS软件推荐使用Bind,因为它原生支持区传送(zone transfer)。我们可设一台为主服务器,另一台为从服务器,主服务器上区文件变更后通过NOTIFY消息推送给从服务器,从服务器发起IXFR或AXFR拉取增量或全量数据,保证两边记录最终一致。
主从配置中需在主端允许从服务器IP进行区传送,并使用TSIG密钥加密防止未授权同步。从服务器配置type slave并指定masters地址。这样即便VIP漂移到备节点,只要备节点Bind已从主节点同步最新区数据,解析结果就不会出错。示例主配置片段如下:
zone "ipipp.com" {
type master;
file "/etc/bind/db.ipipp.com";
allow-transfer { key tsig-key; };
notify yes;
};
需要注意,如果采用双MASTER且两边都可写,则区冲突难以调和。对于大部分内网高可用场景,写操作只发生在固定主节点,备节点只读同步,可大幅降低复杂度。若业务要求双活写入,应引入数据库型后端如PowerDNS with MySQL,而非文件区。
完整集群部署与切换验证
假设两台机IP为192.168.0.10与192.168.0.11,VIP为192.168.0.100。先在两者安装bind9与keepalived,主节点keepalived state为MASTER priority 150,备节点为BACKUP priority 100。两者vrrp_instance都配置同一个virtual_ipaddress 192.168.0.100/24。启动后ip addr show应看到VIP在MASTER上。
验证高可用最直观的方式是持续ping VIP并杀掉主节点named进程。观察ping是否中断超过一两秒,以及备节点日志是否出现Transition to MASTER STATE。同时用dig @192.168.0.100 ipipp.com确认解析正常。若中断过长,应检查脚本权重与advert_int参数,默认advert_int为1秒,可下调到0.5提升灵敏度和收敛速度。
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
virtual_ipaddress {
192.168.0.100/24
}
track_script {
chk_dns
}
}
最后提醒,DNS集群不是备份替代方案,区文件仍需离线备份。防火墙应放行TCP/UDP 53以及VRRP协议(通常为IP协议号112)。按照上述结构落地,即可在Linux上获得一套稳健的高可用DNS集群,应对节点故障而不影响业务解析。
LinuxDNS_clusterkeepalived修改时间:2026-08-16 15:54:12