Keepalived是一个用于实现虚拟路由冗余协议(Virtual Router Redundancy Protocol,VRRP)的开源软件。它旨在提供高可用性和故障恢复能力,用于确保在主服务器发生故障时自动将流量切换到备份服务器。
“高可用”(High Availability,HA)是指系统或服务能够在面对硬件故障、软件故障、网络故障或其他不可预见的事件时,仍能够持续提供正常的运行和可用性。在一个高可用系统中,故障的部分可以被无缝地替代,用户不会感知到服务中断或降级。
Keepalived通过创建一个冗余的虚拟IP(Virtual IP,VIP)地址,使多个服务器共享同一个VIP地址。这些服务器中的一个被配置为主服务器(Master),负责接收和处理所有流量,而其他服务器则处于备份状态(Backup)。主服务器负责将流量传递给后端的真实服务器(Real Servers),备份服务器监控主服务器的状态,并在主服务器发生故障时接管流量。
Keepalived使用VRRP协议来协调主备服务器之间的状态。VRRP是一种网络协议,定义了主服务器的选举和状态转换过程,以及客户端请求的转发。主服务器通过周期性的VRRP广播来宣告自己的存在和状态,并通过VRRP消息协议与备份服务器进行通信,以确保一致性和可靠性。
VRRP(Virtual Route Redundancy Protocol)协议,翻译过来为虚拟路由冗余协议。VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP,而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,MASTER实现针对虚拟路由器IP的各种网络功能。其他设备不拥有该虚拟IP,状态为BACKUP,除了接收MASTER的VRRP状态通告信息以外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。Master路由和Backup路由之间会有一个心跳检测,Master会定时告知Backup自己的状态,如果在指定的时间内,Backup没有接收到这个通知内容,Backup就会替代Master成为新的Master(如果有多个BACKUP,那么会选举其中一个优先级高的作为MASTER)。Master路由有一个特权就是虚拟路由和后端服务器都是通过Master进行数据传递交互的,而备份节点则会直接丢弃这些请求和数据,不做处理,只是去监听Master的状态。

如上图Keepalived实现Nginx负载均衡的原理就是在两个Nginx节点中引入虚拟IP的概念(每台Nginx都安装Keepalived并都配置同一个虚拟IP),其中一台Nginx宕机,那么虚拟Ip将会飘移到另一台Nginx上去,而客户端就是通过这个虚拟IP来访问Nginx的。
¶一、安装
1 | #安装编译依赖 |
¶二、配置
1 | #编辑keepalived配置文件 |
服务器1配置
1 | global_defs { |
以上配置中没有特别需求的话,最简单就是修改router_id、vrrp_strict、state、interface、priority、virtual_ipaddress三处地方即可。
服务器2配置
1 | global_defs { |
keepalived 备节点配置和主节点差不多,只需要修改router_id、state、priority 即可。
¶三、使用
¶1. 启动
1 | #启动运行keepalived(通过-f指定配置文件,如果不指定则默认使用的配置文件路径为:/etc/keepalived/keepalived.conf) |
¶2. 测试
测试效果如下:
通过查看MASTER节点服务器的所有ip时,能够发现在MASTER节点的网卡接口ens33中多出了192.168.60.222这个虚拟ip地址。
1 | $ ip a |
而通过查看BACKUP节点服务器的所有ip时,不会出现虚拟ip地址。
1 | $ ip a |
¶3. 关闭
验证情景: MASTER 节点宕机或者出现故障时,原本的 MASTER 节点会自动失去虚拟ip,而在 BACKUP 节点上将自动获得虚拟 IP(发生了 IP 飘移)。
操作方式:在原本的MASTER节点中关闭 keepalived,然后查看 MASTER 和 BACKUP 节点的虚拟 IP 情况。
1 | #关闭 |
¶4. 脚本
keepalived的作用其实也就是给多个服务器中加入唯一的虚拟IP,但关注到具体业务的话,还存在许多问题,比如做Nginx高可用的情况下,假设有两个Nginx节点,其中一台Nginx出现故障不可用,而其所在的服务器还在正常运行,所以其对应的keepalived程序也正常运行,很显然这是不会发生了IP飘移的。而我们的目的是Nginx出现故障不可用时其对应的keepalived也应该要跟着关掉,这样虚拟ip才会飘移到BACKUP节点。
keepalived允许我们通过编写脚本对业务进程进行检测监控。
1 | vim /opt/keepalived/etc/keepalived/ck_nginx.sh |
内容如下:
1 |
|
1 | #为脚本文件设置执行权限 |
将脚本添加到keepalived配置文件中
1 | vim /opt/keepalived/etc/keepalived/keepalived.conf |
1 | #加入以下vrrp_script |
¶6. 日志
1 | tail -f /var/log/messages |
