系统运维-Rocky Linux 9 部署高可用DNS集群与负载均衡
1. 高可用DNS集群架构设计在企业生产环境中DNS服务的稳定性和可靠性至关重要。传统的单节点DNS服务器存在单点故障风险一旦宕机将导致整个网络的域名解析服务中断。基于Rocky Linux 9的高可用DNS集群方案采用Keepalived LVS (DR模式) BIND/CoreDNS的黄金组合能够实现故障自动切换主节点故障时VIP自动漂移到备用节点负载均衡通过LVS将查询请求均匀分发到后端DNS服务器高性能DR模式避免数据包经过LVS节点转发易维护配置简单扩展性强典型架构包含三个关键组件LVS负载均衡层使用DR模式部署避免成为性能瓶颈DNS服务层多台BIND/CoreDNS服务器提供实际解析服务VIP管理Keepalived实现虚拟IP的自动漂移实测表明该架构可轻松应对每秒数万次的DNS查询请求平均响应时间保持在10ms以内。2. 基础环境准备2.1 系统安装与配置首先在所有节点安装Rocky Linux 9.5最小化系统# 所有节点执行 dnf update -y hostnamectl set-hostname dns-node1 # 分别设置主机名配置静态IP地址示例为192.168.1.0/24网段nmcli con mod 有线连接 ipv4.addresses 192.168.1.1/24 nmcli con mod 有线连接 ipv4.gateway 192.168.1.254 nmcli con mod 有线连接 ipv4.dns 8.8.8.8 nmcli con mod 有线连接 ipv4.method manual nmcli con up 有线连接2.2 防火墙与SELinux设置统一关闭SELinux并配置防火墙规则# 临时关闭SELinux setenforce 0 # 永久关闭 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config # 防火墙放行DNS服务 firewall-cmd --add-servicedns --permanent firewall-cmd --add-port53/udp --permanent firewall-cmd --add-port53/tcp --permanent firewall-cmd --reload3. DNS服务部署3.1 BIND安装与配置在两台DNS服务器上安装BINDdnf install bind bind-utils -y配置主DNS服务器192.168.1.1的named.confvim /etc/named.conf options { listen-on port 53 { any; }; directory /var/named; allow-query { any; }; recursion yes; dnssec-enable yes; dnssec-validation yes; }; zone example.com IN { type master; file example.com.zone; allow-update { none; }; }; zone 1.168.192.in-addr.arpa IN { type master; file 192.168.1.rev; };创建正向解析区域文件vim /var/named/example.com.zone $TTL 86400 IN SOA ns1.example.com. admin.example.com. ( 2024062001 ; serial 3600 ; refresh 1800 ; retry 604800 ; expire 86400 ; minimum ) IN NS ns1.example.com. IN NS ns2.example.com. ns1 IN A 192.168.1.1 ns2 IN A 192.168.1.2 www IN A 192.168.1.1003.2 CoreDNS替代方案对于需要更轻量级的场景可以使用CoreDNS替代BINDdnf install epel-release -y dnf install coredns -y配置CoreDNS的Corefilevim /etc/coredns/Corefile .:53 { forward . 8.8.8.8 9.9.9.9 cache log errors } example.com { file /var/named/example.com.zone log errors }4. LVS负载均衡配置4.1 LVS-DR模式原理DR(Direct Routing)模式的特点是真实服务器直接响应客户端LVS只处理入站请求需要配置ARP抑制数据流向客户端请求VIP(192.168.1.5)LVS调度器将请求转发给真实服务器真实服务器直接响应客户端4.2 配置LVS节点在两台LVS节点上安装ipvsadm和keepaliveddnf install ipvsadm keepalived -y主LVS节点的keepalived配置vim /etc/keepalived/keepalived.conf global_defs { router_id LVS_MASTER } vrrp_instance VI_1 { state MASTER interface ens18 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass dns123 } virtual_ipaddress { 192.168.1.5/24 dev ens18 label ens18:0 } } virtual_server 192.168.1.5 53 { delay_loop 6 lb_algo rr lb_kind DR protocol UDP real_server 192.168.1.1 53 { weight 1 UDP_CHECK { connect_timeout 3 } } real_server 192.168.1.2 53 { weight 1 UDP_CHECK { connect_timeout 3 } } }5. ARP抑制与VIP配置5.1 真实服务器配置在每台DNS服务器上配置VIP并设置ARP抑制# 创建虚拟接口 nmcli con add type dummy ifname dummy0 nmcli con mod dummy-dummy0 ipv4.addresses 192.168.1.5/32 nmcli con up dummy-dummy0 # 配置ARP抑制 echo net.ipv4.conf.all.arp_ignore 1 /etc/sysctl.conf echo net.ipv4.conf.all.arp_announce 2 /etc/sysctl.conf sysctl -p5.2 验证ARP抑制使用tcpdump验证ARP响应tcpdump -i ens18 arp -n正常情况应只有LVS节点会响应VIP的ARP请求真实服务器不会响应。6. 健康检查与故障转移6.1 Keepalived健康检查Keepalived默认通过定期发送ICMP包检测真实服务器状态我们增强DNS协议层检查virtual_server 192.168.1.5 53 { # 原有配置... real_server 192.168.1.1 53 { weight 1 MISC_CHECK { misc_path /usr/local/bin/check_dns.sh 192.168.1.1 misc_timeout 5 } } }创建检查脚本vim /usr/local/bin/check_dns.sh #!/bin/bash dig $1 www.example.com time3 tries2 /dev/null 21 exit $?6.2 故障转移测试手动停止主LVS节点的keepalived服务观察VIP漂移systemctl stop keepalived使用ip addr命令在备节点上检查VIP是否成功接管。7. 客户端验证与监控7.1 客户端配置将客户端DNS设置为VIP地址nmcli con mod 有线连接 ipv4.dns 192.168.1.5 nmcli con up 有线连接验证解析结果dig www.example.com 192.168.1.5 nslookup www.example.com 192.168.1.57.2 监控部署使用Prometheus监控DNS服务状态# 安装node_exporter dnf install prometheus-node-exporter -y systemctl enable --now prometheus-node-exporter # 配置blackbox_exporter监控DNS vim /etc/blackbox_exporter/config.yml modules: dns_query: prober: dns dns: query_name: www.example.com query_type: A valid_statuses: [NOERROR]8. 性能调优与安全加固8.1 BIND性能优化调整named.conf的options部分options { # 增加工作线程 workers 4; # 优化缓存大小 max-cache-size 512M; # 启用响应率限制 rate-limit { responses-per-second 50; window 5; }; };8.2 安全加固措施限制区域传输zone example.com { type master; file example.com.zone; allow-transfer { 192.168.1.2; }; # 只允许从服务器同步 };启用DNSSECdnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto;配置TSIG密钥认证key rndc-key { algorithm hmac-sha256; secret xxxxxxxxxxxxxx; };9. 常见问题排查9.1 VIP无法访问检查步骤确认keepalived服务运行正常检查防火墙规则是否放行VRRP协议(IP协议号112)验证网络接口配置# 查看VRRP通信 tcpdump -i ens18 vrrp -n9.2 DNS查询超时可能原因LVS健康检查失败后端DNS服务未运行ARP抑制配置错误诊断命令ipvsadm -ln # 查看当前连接状态 journalctl -u named --since 1 hour ago # 查看DNS服务日志9.3 负载不均衡调整调度算法为wlc(加权最小连接)virtual_server 192.168.1.5 53 { lb_algo wlc # 其他配置... }查看实时连接统计watch -n 1 ipvsadm -ln --stats10. 生产环境最佳实践在实际部署中我们总结出以下经验硬件选择DNS服务器建议配置SSD磁盘LVS节点需要多网卡网络分离将管理流量与服务流量分离到不同网段日志管理使用logrotate定期轮转DNS查询日志备份策略定期备份区域文件和配置文件灰度发布修改DNS配置时先在从服务器测试对于超大规模部署可以考虑增加LVS节点形成主-主架构按地域部署多个集群引入Anycast路由方案我在某金融客户的生产环境中部署该架构后DNS服务的可用性从99.9%提升到99.99%平均响应时间降低40%顺利通过了业务高峰期的考验。