在 Keepalived 中,主节点(Master)通过 VRRP(Virtual Router Redemption Protocol)协议 的机制来感知备节点(Backup)是否存活。具体实现方式如下:
1. VRRP 心跳检测
组播/单播心跳包:
主节点和备节点默认通过组播地址224.0.0.18
(VRRP专用组播地址)定期发送 Advertisement 心跳报文(默认每秒1次)。- 如果备节点故障,主节点在
3 * advertisement_interval
(默认3秒)内收不到备节点的报文,会认为备节点失效。
- 可通过配置
vrrp_unicast_bind
和vrrp_unicast_peer
改为单播模式(适用于禁用组播的网络)。
- 如果备节点故障,主节点在
关键参数:
vrrp_instance VI_1 { advert_int 1 # 心跳间隔(秒) authentication { # 认证(可选) auth_type PASS auth_pass <密码> } unicast_src_ip <主节点IP> # 单播模式下指定源IP unicast_peer { <备节点IP> # 单播模式下指向对端IP } }
2. Track Script(跟踪脚本)
Keepalived支持通过自定义脚本检测备节点的状态,例如:
- ICMP Ping检测:主节点通过脚本定期Ping备节点,失败时触发优先级降低。
- TCP端口检测:检查备节点的服务端口(如SSH、HTTP)是否存活。
示例配置:
vrrp_script chk_backup {
script "ping -c2 <备节点IP> || exit1" # Ping检测
interval2 #每2秒执行一次
weight -20 #失败时优先级降低20
}
vrrp_instance VI_1 {
track_script {
chk_backup
}
}
3. Notify机制
当主节点感知到备节点故障时,可以触发通知脚本(如邮件/日志告警):
vrrp_instance VI_1 {
notify_master "/path/to/script.sh master"
notify_backup "/path/to/script.sh backup"
notify_fault "/path/to/script.sh fault"
}
4. Keepalived日志验证
查看系统日志确认状态切换:
tail -f /var/log/messages | grep Keepalived
# 或使用journalctl(Systemd系统)
journalctl -u keepalived --follow
正常日志示例:
Keepalived_vrrp[PID]: VRRP_Instance(VI_1) Transition to MASTER STATE
Keepalived_vrrp[PID]: VRRP_Instance(VI_1) Backup has failed, assuming mastership.
常见问题排查
- 防火墙规则:确保放行VRRP协议(IP协议号112)和组播流量。
- 网络延迟:调整
advert_int
(如改为2秒)避免误判。 - 脑裂问题:优先配置非抢占模式 (
nopreempt
) + 多监控脚本。
如果需要更详细的配置示例或问题分析,可以提供你的实际场景进一步讨论!
内容由零声教学AI助手提供,问题来源于学员提问