Keepalived 是一个用于 Linux 系统的高可用性解决方案,它主要通过 Virtual Router Redundancy Protocol (VRRP) 协议来实现网络服务的高可用性和故障转移。其核心功能包括故障切换和健康检查,广泛应用于 LVS 负载均衡集群以及其他需要高可用性的场景。下面是 Keepalived 工作原理及其健康检查机制的详细介绍:
1. Keepalived 工作原理
- VRRP 协议基础:
- VRRP 是一种容错协议,旨在通过创建一个虚拟路由器来提供默认网关的冗余。这个虚拟路由器有一个虚拟 IP 地址(VIP)和一个虚拟 MAC 地址,客户端会将这个 VIP 设置为它们的默认网关。
- 在 Keepalived 配置中,至少有两个节点:一个是主节点(MASTER),另一个是备份节点(BACKUP)。它们都运行 VRRP 协议,竞争成为 VIP 的拥有者。
- 主节点周期性地发送 VRRP 通告报文(多播到 224.0.0.18),告诉备份节点它仍在运行。备份节点监听这些报文,以确认主节点的状态。
- 优先级与状态转换:
- 每个 VRRP 节点都有一个优先级,优先级高的节点将成为 MASTER。如果 MASTER 节点停止发送 VRRP 报文(比如因为故障或网络问题),BACKUP 节点在超时后(默认3秒)没有收到通告,它会认为 MASTER 故障,并且如果它的优先级足够高(或成为最高),它会接管 VIP,成为新的 MASTER。
- 健康检查:
- Keepalived 支持多种健康检查方法,确保真实服务器(real servers)或服务本身的健康状况。
- 脚本检查:通过
vrrp_script
配置,可以定义一个外部脚本来检测特定服务(如 HTTP、数据库等)的健康状态。脚本定期执行,根据其返回值(0 表示成功,非0 表示失败)调整 VRRP 优先级或直接关闭 Keepalived 进程。 - HTTP/HTTPS GET:可以直接配置 Keepalived 使用 HTTP 或 HTTPS GET 请求检查指定的 URL,通过响应的状态码来判断服务是否健康。
- TCP/UDP 连接检查:对于基于 TCP 或 UDP 协议的服务,可以配置 Keepalived 去尝试建立连接或发送数据包,根据响应情况判断服务状态。
- 故障恢复与通知:
- 当故障节点恢复并重新上线时,如果它之前是 MASTER,但发现当前已有其他节点作为 MASTER 在运行,它会自动降级为 BACKUP,等待下一次选举机会。
- 通过配置,Keepalived 可以发送邮件或其他形式的通知给管理员,告知状态变化或故障发生。
2. 如何做到健康检查
健康检查是通过在 Keepalived 配置文件中定义 vrrp_instance
和 vrrp_script
完成的。一个基本步骤如下:
- 定义健康检查脚本:编写一个 shell 脚本,该脚本负责检查特定服务的状态,例如检查 Web 服务器的 HTTP 端口是否响应。
- 配置 vrrp_script:
vrrp_script chk_http { script /path/to/check_http.sh # 检查脚本路径 interval 5 # 执行间隔,单位秒 timeout 3 # 超时时间,单位秒 rise 2 fall 2 # 成功和失败的阈值 }
- 这里,
rise
表示连续几次成功即认为服务恢复,fall
表示连续几次失败则认为服务故障。 - 在 vrrp_instance 中引用脚本:
vrrp_instance VI_1 { state MASTER/BACKUP # 节点状态 interface eth0 # 监听的网络接口 virtual_router_id 51 # VRRP 组ID priority 100 # 优先级 advert_int 1 # 通告间隔 track_script { chk_http # 引用健康检查脚本 } # 其他配置... }
- 当
track_script
指定的脚本状态改变时,会影响 VRRP 优先级,从而触发主备切换。
综上所述,通过上述配置,Keepalived 不仅实现了高可用性,还通过健康检查机制确保了服务的稳定性和可靠性。