12.2.5 典型配置参数与实战要点
典型参数决定VRRP选举与VIP漂移行为,实战应以“参数一致性、优先级差距、健康检查联动”为核心。以下给出原理草图、安装与配置示例、命令解释、排错与练习,便于直接落地。
原理草图(VRRP通告与VIP漂移):
安装与基础准备(两台节点一致):
# 1) 安装
yum -y install keepalived
systemctl enable keepalived
# 2) 打开VRRP协议号112(若启用防火墙)
firewall-cmd --permanent --add-protocol=vrrp
firewall-cmd --reload
# 3) 调整ARP参数,避免VIP不可达
cat >/etc/sysctl.d/99-keepalived.conf <<'EOF'
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
EOF
sysctl --system
典型配置参数与实战要点(主备同组必须一致的参数:virtual_router_id、advert_int、auth_pass)
示例:/etc/keepalived/keepalived.conf
global_defs {
router_id LVS_NODE_A
}
vrrp_script chk_nginx {
script "/usr/local/bin/chk_nginx.sh"
interval 2
weight -30
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP # 建议两端都用BACKUP,避免双主
interface eth0 # VIP绑定的物理网卡
virtual_router_id 51 # 同组唯一
priority 150 # 主高备低
advert_int 1 # 通告周期,主备一致
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
10.0.0.100/24 dev eth0 label eth0:vip
}
track_script {
chk_nginx
}
nopreempt # 可选:不抢占,减少抖动
# preempt_delay 30 # 可选:恢复后延迟抢占
notify_master "/usr/local/bin/notify.sh MASTER"
notify_backup "/usr/local/bin/notify.sh BACKUP"
notify_fault "/usr/local/bin/notify.sh FAULT"
}
备节点仅需调整router_id与priority(确保更低),其余保持一致:
global_defs {
router_id LVS_NODE_B
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
10.0.0.100/24 dev eth0 label eth0:vip
}
track_script { chk_nginx }
nopreempt
notify_master "/usr/local/bin/notify.sh MASTER"
notify_backup "/usr/local/bin/notify.sh BACKUP"
notify_fault "/usr/local/bin/notify.sh FAULT"
}
健康检查脚本示例(检测端口,失败降低优先级):
cat >/usr/local/bin/chk_nginx.sh <<'EOF'
#!/bin/bash
# 失败返回非0,触发weight降低
ss -lntp | grep -q ":80 " || exit 1
exit 0
EOF
chmod +x /usr/local/bin/chk_nginx.sh
切换通知脚本示例(记录日志/告警接口):
cat >/usr/local/bin/notify.sh <<'EOF'
#!/bin/bash
STATE=$1
echo "$(date '+%F %T') Keepalived state: ${STATE}" >>/var/log/keepalived_state.log
# 可扩展:curl -XPOST http://alert/api -d "state=${STATE}"
EOF
chmod +x /usr/local/bin/notify.sh
关键命令与解释(验证通告/角色/VIP):
# 启动服务
systemctl restart keepalived
# 查看日志与切换信息
journalctl -u keepalived -f
# 检查VIP是否在本机
ip addr show dev eth0 | grep 10.0.0.100
# 抓包确认VRRP通告(协议号112)
tcpdump -n -i eth0 vrrp
priority:决定主备优先级,差距建议≥20。advert_int:通告周期,主备必须一致,否则可能误判。nopreempt:避免主节点恢复后立刻抢占。track_script:健康检查结果影响权重,触发切换。virtual_ipaddress:建议CIDR并指定dev,防止漂移到错误网卡。
实战要点与常见坑:
1. VRRP同组一致性:virtual_router_id、auth_pass、advert_int需一致,否则出现“分裂脑”。
2. 链路二层可达:VRRP为二层通告,跨网段需确认交换机与网关可达。
3. ARP刷新:漂移后客户端ARP缓存不更新,需关注GARP与系统ARP参数。
4. 防火墙放行:必须允许协议号112,使用firewall-cmd --add-protocol=vrrp。
排错清单(可直接执行):
# 1) 检查VRRP是否被防火墙拦截
iptables -L -n | grep 112
# 2) 确认内核ARP参数
sysctl net.ipv4.conf.all.arp_ignore
sysctl net.ipv4.conf.all.arp_announce
# 3) 查看VRRP状态变化
grep -i vrrp /var/log/messages
# 4) 检查脚本返回值
/usr/local/bin/chk_nginx.sh; echo $?
- 若VIP漂移但客户端仍访问旧主,优先排查ARP缓存与GARP发送。
- 若无切换,检查
track_script是否执行失败、权重是否足以触发降级。
练习(含预期效果):
1. 配置主备并模拟宕机:停止主机keepalived,确认备机接管VIP。
预期:ip addr显示VIP在备机,日志出现Entering MASTER STATE。
2. 健康检查触发切换:停止Nginx进程,观察weight -30生效,VIP漂移。
预期:备机成为MASTER,客户端访问保持可用。
3. 验证抢占策略:主机恢复后,启用/禁用nopreempt观察是否立即抢占。
预期:nopreempt开启时不抢占;关闭时按优先级抢占。