走进 keepalived:解析高可用架构背后的关键技术

一、什么是keepalived

Keepalived 是一个用于实现服务器高可用性(High Availability,简称 HA)的软件

简单来说,它的主要作用是检测服务器的状态,并在主服务器出现故障时,自动将服务切换到备份服务器上,以确保服务的持续可用。

Keepalived 基于虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称 VRRP)来工作。VRRP 协议可以在一组路由器中选举出一个主路由器,其他的作为备份路由器。当主路由器出现故障时,备份路由器能够迅速接替其工作,保证网络的连通性。

在实际应用中,Keepalived 通常用于以下场景:

  1. 负载均衡器的高可用:例如在使用 LVS(Linux Virtual Server)作为负载均衡器时,通过 Keepalived 确保负载均衡器的持续运行。

    • 比如,一个网站使用 LVS 进行负载均衡,如果主 LVS 服务器宕机,Keepalived 会立即将流量切换到备份的 LVS 服务器上,保证用户的访问不受影响。
  2. 应用服务器的高可用:对于关键的应用服务器,Keepalived 可以监控服务器的健康状态,实现故障自动切换。

    • 假设一个在线支付系统的服务器,通过 Keepalived 配置,当主服务器因硬件故障或软件崩溃无法响应时,备份服务器能够立即接管服务,确保支付流程不中断。

二、什么是VRRP

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 是一种容错协议,用于在局域网中提供网关的冗余性。

VRRP 允许一组路由器共同构成一个虚拟路由器。在这个虚拟路由器中,会选举出一台主路由器(Master Router),其他的则为备份路由器(Backup Router)。

主路由器负责处理发往虚拟路由器的数据包转发工作。备份路由器则处于监听状态,实时监测主路由器的状态。

当主路由器出现故障时,备份路由器中优先级最高的那台会迅速切换成为新的主路由器,接管数据包的转发工作,从而保证网络的连续性和稳定性。

例如,在一个企业网络中,有多台路由器连接到同一个局域网。通过配置 VRRP,将这些路由器组成一个虚拟路由器。用户的设备只需要将网关设置为这个虚拟路由器的 IP 地址,而无需关心实际哪台路由器在工作。

假设最初主路由器为 Router A,当它发生故障时,Router B(优先级较高的备份路由器)会在短时间内接替成为新的主路由器,用户的网络访问不会受到明显影响。

VRRP 为网络提供了一种高可用性的解决方案,避免了单点故障对网络通信造成的影响,确保了网络服务的持续可靠运行。

三、VRRP相关技术

通告:

  • 心跳:VRRP 中通过发送心跳消息来告知其他路由器自身的状态。
  • 优先级:决定了路由器在虚拟路由器中的角色,优先级高的更有可能成为主路由器。

周期性:

VRRP 协议的各种消息通常是周期性发送的,以确保各路由器之间的状态同步和及时感知变化。

工作方式:

  • 抢占式:当备份路由器的优先级高于当前主路由器时,会抢占成为主路由器。
  • 非抢占式:即使备份路由器优先级更高,也不会主动抢占主路由器的角色,除非当前主路由器故障。

安全认证:

  • 无认证:在一些对安全性要求不高的场景中使用,存在一定风险。
  • 简单字符认证:通过预共享密钥进行认证,相对简单但能提供一定的安全性。
  • MD5:使用 MD5 算法进行认证,安全性更高。

工作模式:

  • 主/备(单虚拟路由器):一个主路由器负责转发数据包,备份路由器处于待命状态。
    • 例如,在一个小型网络中,只有一台主路由器正常工作,备份路由器等待主路由器出现故障时进行切换。
  • 主/主(主/备(虚拟路由器 1),备/主(虚拟路由器 2)):实现了负载分担和冗余备份的双重功能。
    • 比如在一个较大规模的网络中,一部分流量通过虚拟路由器 1 的主路由器转发,另一部分流量通过虚拟路由器 2 的主路由器转发,同时各自有对应的备份路由器保障可靠性。

四、keepalived部署

1、Keepalived****相关文件

软件包名: keepalived
主程序文件: /usr/sbin/keepalived
主配置文件: /etc/keepalived/keepalived.conf
配置文件示例: /usr/share/doc/keepalived/
Unit File : /lib/systemd/system/keepalived.service
Unit File 的环境配置文件: /etc/sysconfig/keepalived

2、环境说明

1、各节点时间必须同步: ntp, chrony
关闭防火墙及 SELinux
各节点之间可通过主机名互相通信:非必须
建议使用 /etc/hosts 文件实现:非必须
各节点之间的 root 用户可以基于密钥认证的 ssh 服务完成互相通信:非必须

2、两台需要安装keepalived的虚拟机:172.25.254.128、172.25.254.152

两台http服务器:172.25.254.153、172.25.254.154

3、keepalived实验环境配置

两台http服务器安装http服务

测试一下

五、keepalived虚拟路由的配置

keepalived安装

配置文件组成部分

配置文件: /etc/keepalived/keepalived.conf
配置文件组成
GLOBAL CONFIGURATION
Global definitions : 定义邮件配置, route_id , vrrp 配置,多播地址等
VRRP CONFIGURATION
VRRP instance(s) :
定义每个 vrrp 虚拟路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s) :
LVS 集群的 VS 和 RS

全局配置

! Configuration File for keepalived
global_defs {
notification_email {
[email protected] #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区
分写多个
[email protected]
}
notification_email_from [email protected] # 发邮件的地址
smtp_server 127.0.0.1 # 邮件服务器地址
smtp_connect_timeout 30 # 邮件服务器连接 timeout
router_id KA1.timinglee.org # 每个 keepalived 主机唯一标识

建议使用当前主机名,但多节点

重名不影响
vrrp_skip_check_adv_addr # 对所有通告报文都检查,会比较消耗性能

启用此配置后,如果收到的通告报文和上一

个报文是同一 # 个路由器,则跳过检查,默认
值为全检查
vrrp_strict # 严格遵循 vrrp 协议

启用此项后以下状况将无法启动服务 :

#1. 无 VIP 地址
#2. 配置了单播邻居
#3. 在 VRRP 版本 2 中有 IPv6 地址

建议不加此项配置

vrrp_garp_interval 0 # 报文发送延迟, 0 表示不延迟
vrrp_gna_interval 0 # 消息发送延迟
vrrp_mcast_group4 224.0.0.18 # 指定组播 IP 地址范围:
}

测试一下

默认为抢占模式

六、keepalived虚拟路由通讯设定

注意vrrp_strict和vrrp_iptables这两行,要么同时开启,要么同时关闭

七、keepalived日志分离

root@ka1 \~\]# vim /etc/sysconfig/keepalived ![](https://i-blog.csdnimg.cn/direct/102c2f1b10f84066ad232f8a79a46312.png) \[root@ka1 \~\]# vim /etc/rsyslog.conf ![](https://i-blog.csdnimg.cn/direct/ad59cacb57a8444db48a1515706eda9f.png) ![](https://i-blog.csdnimg.cn/direct/29d4c83558e94a2faf3b6f77040c0368.png) ## 八、keepalived独立子配置文件 ![](https://i-blog.csdnimg.cn/direct/fe97003509be45139916dd649a2d9ea7.png) ![](https://i-blog.csdnimg.cn/direct/ef5b452efb234d71856210c0c83ee168.png) ![](https://i-blog.csdnimg.cn/direct/9eb964d731894a5592ea4882376aa35e.png) \[root@ka1 \~\]# systemctl restart keepalived.service ## 九、keepalived非强制和延迟抢占 ### **非抢占模式****nopreempt** 默认为抢占模式 preempt ,即当高优先级的主机恢复在线后,会抢占低先级的主机的 master 角色, 这样会使 vip 在 KA 主机中来回漂移,造成网络抖动, 建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的 master 角色 非抢占模块下 , 如果原主机 down 机 , VIP 迁移至的新主机 , 后续也发生 down 时 , 仍会将 VIP 迁移回原主机 ![](https://i-blog.csdnimg.cn/direct/9590375cb23c4382af752fdbc8016823.png) 两台都需要设置 ![](https://i-blog.csdnimg.cn/direct/200bfdd0c388478dae2035571cf760e9.png) 现在VIP在ka1上 ![](https://i-blog.csdnimg.cn/direct/8dbf061533cf42c9b63d049ac4a89908.png) 把服务停掉 ![](https://i-blog.csdnimg.cn/direct/fe38aa5cd8504423a02dca0c659346a1.png) VIP在ka2上 ![](https://i-blog.csdnimg.cn/direct/efbc8944fe3c4dec8b70e005da8fa9d1.png) 现在我们把ka1的服务重启,看VIP是否会回到ka1上 ![](https://i-blog.csdnimg.cn/direct/7a17e8d3a2284209bb7f2b496ebeb19f.png) 没回来证明是正确的 ### **抢占延迟模式****preempt_delay** 抢占延迟模式,即优先级高的主机恢复后,不会立即抢回 VIP ,而是延迟一段时间(默认 300s )再抢回 VIP ![](https://i-blog.csdnimg.cn/direct/50e3b4e8cbee47cabf67022bc094edd3.png) 两台都需要设置 现在VIP在ka1上,我们把ka1上的服务停掉,VIP会调到ka2上,再等10s,VIP就会再跳回到ka1 ![](https://i-blog.csdnimg.cn/direct/9f7f2b995ef34718ae7aa6aa0d525f23.png) ![](https://i-blog.csdnimg.cn/direct/194981e53151429787d1501dfb67d990.png) 10s之后 ![](https://i-blog.csdnimg.cn/direct/62c44f5831714577a0793cbd220553c4.png) ## 十、keepalived单播模式设定 默认 keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量 ka1 ![](https://i-blog.csdnimg.cn/direct/e3c98a8604da4fd0970bd1635299ed1b.png) ka2 ![](https://i-blog.csdnimg.cn/direct/744860be5f894195b077ae35e5ff3a01.png) 测试一下 ![](https://i-blog.csdnimg.cn/direct/e0f83d1f83ea4a679ffb7f21a057f981.png) ka2没有VIP ![](https://i-blog.csdnimg.cn/direct/e68ec22ae2db4f56a839a5f731da704f.png) ## ![](https://i-blog.csdnimg.cn/direct/3ea95c68fad944b0a8657eb5249e6ab7.png) 十一、keepalived邮件通知 当 keepalived 的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户 默认以用户 keepalived_script 身份执行脚本 如果此用户不存在,以 root 执行脚本可以用下面指令指定脚本执行用户的身份 安装邮件发送工具 ![](https://i-blog.csdnimg.cn/direct/17555e7f47d34642b2f43b31eca24f49.png) QQ邮箱配置 \[root@ka1 \~\]# vim /etc/mail.rc ![](https://i-blog.csdnimg.cn/direct/a9e97cd92b124c9086f6c74d8b954c57.jpeg) smpt-auth-password如何获得 登录QQ邮箱,找到账号与安全 ![](https://i-blog.csdnimg.cn/direct/a3580ecce7d64ff59b63976b05299cb0.png) 点击安全设置 ![](https://i-blog.csdnimg.cn/direct/bd45047417bd4f1ab590c237b3410165.png) 点击生成授权码即可(两台都需设置) 创建通知脚本 \[root@ka1 \~\]# vim /etc/keepalived/mail.sh ![](https://i-blog.csdnimg.cn/direct/10585a4a66fc4571a03912717db79c70.png) \[root@ka1 \~\]# chmod +x /etc/keepalived/mail.sh 两台都需要设置 ![](https://i-blog.csdnimg.cn/direct/12d6917eeba543488ce62a874c345fe4.png) 测试一下 ![](https://i-blog.csdnimg.cn/direct/bfc31a1f9df74674a8a5b3a503d562b3.png) 十二、keepalived双主模式 master/slave 的单主架构,同一时间只有一个 Keepalived 对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master 的双主架构,解决此问题。 master/master 的双主架构: 即将两个或以上 VIP 分别运行在不同的 keepalived 服务器,以实现服务器并行提供 web 访问的目的,提高 服务器资源利用率 ka1 ![](https://i-blog.csdnimg.cn/direct/5df3ab159a30497ab212869eff3a9d37.png) ka2 ![](https://i-blog.csdnimg.cn/direct/a7c8e135599340d0874e9867d800c997.png) ![](https://i-blog.csdnimg.cn/direct/f78b678901954a738f333b065ac13a14.png) ![](https://i-blog.csdnimg.cn/direct/d48a763fcd364954aa2e1f38a3a01745.png) 测试一下 ![](https://i-blog.csdnimg.cn/direct/2d68b73234e64ca4be24678df46135cd.png) ![](https://i-blog.csdnimg.cn/direct/0bbe55e37a92435faf92b55a4be5c23c.png) ## 十二、keepalived-ipvs设定 ### **IPVS****相关配置** #### **虚拟服务器配置结构** > virtual_server IP port { > ... > real_server { > ... > } > real_server { > ... > } > ... > } #### **virtual server****(虚拟服务器)的定义格式** > virtual_server IP port # 定义虚拟主机 IP 地址及其端口 > virtual_server fwmark int #ipvs 的防火墙打标,实现基于防火墙的负载均衡集群 > virtual_server group string # 使用虚拟服务器组 #### **虚拟服务器配置** > virtual_server IP port { #VIP 和 PORT > delay_loop \ # 检查后端服务器的时间间隔 > lb_algo rr\|wrr\|lc\|wlc\|lblc\|sh\|dh # 定义调度方法 > lb_kind NAT\|DR\|TUN # 集群的类型 , 注意要大写 > persistence_timeout \ # 持久连接时长 > protocol TCP\|UDP\|SCTP # 指定服务协议 , 一般为 TCP > sorry_server \ \ # 所有 RS 故障时,备用服务器地址 > real_server \ \ { #RS 的 IP 和 PORT > weight \ #RS 权重 > notify_up \\|\ #RS 上线通知脚本 > notify_down \\|\ #RS 下线通知脚本 > HTTP_GET\|SSL_GET\|TCP_CHECK\|SMTP_CHECK\|MISC_CHECK { ... } # 定义当前主机健康状 > 态检测方法 > } > } > # 注意 : 括号必须分行写 , 两个括号写在同一行 , 如 : }} 会出错 > #### **应用层监测** 应用层检测: HTTP_GET\|SSL_GET > HTTP_GET\|SSL_GET { > url { > path \ # 定义要监控的 URL > status_code \ # 判断上述检测机制为健康状态的响应码,一般为 200 > } > connect_timeout \ # 客户端请求的超时时长 , 相当于 haproxy 的 timeout server > nb_get_retry \ # 重试次数 > delay_before_retry \ # 重试之前的延迟时长 > connect_ip \ # 向当前 RS 哪个 IP 地址发起健康状态检测请求 > connect_port \ # 向当前 RS 的哪个 PORT 发起健康状态检测请求 > bindto \ # 向当前 RS 发出健康状态检测请求时使用的源地址 > bind_port \ # 向当前 RS 发出健康状态检测请求时使用的源端口 > } #### **TCP****监测** 传输层检测: TCP_CHECK > TCP_CHECK { > connect_ip \ # 向当前 RS 的哪个 IP 地址发起健康状态检测请求 > connect_port \ # 向当前 RS 的哪个 PORT 发起健康状态检测请求 > bindto \ # 发出健康状态检测请求时使用的源地址 > bind_port \ # 发出健康状态检测请求时使用的源端口 > connect_timeout \ # 客户端请求的超时时长 > # 等于 haproxy 的 timeout server > } 两台http服务器配置VIP和设定ARP广播 ![](https://i-blog.csdnimg.cn/direct/28c22b19568e45809702ec0d80a3ac72.png) keepalived安装ipvsadm ![](https://i-blog.csdnimg.cn/direct/0d39def562924c8c952a807b96d2c76a.png) ![](https://i-blog.csdnimg.cn/direct/41ccbbc9c63c4eda8f1a4315e128c1cf.png) ![](https://i-blog.csdnimg.cn/direct/c0d7a5d4f5e642b69d7c59d25046778e.png) 轮询正常 ![](https://i-blog.csdnimg.cn/direct/5d527fab5e024082a7c0b112a0ca3f27.png) 测试一下 ![](https://i-blog.csdnimg.cn/direct/33342769f72244ac8e6b5251dbc8bb56.png) 随便停掉一个http服务 ![](https://i-blog.csdnimg.cn/direct/ba4791547d204fb78c01b30824e22677.png) 再启动 ![](https://i-blog.csdnimg.cn/direct/3f1b1fb270b74db59819da7ce681348d.png) 随便停掉一个keepalived服务 正常访问 ![](https://i-blog.csdnimg.cn/direct/deff4310217b4e3eb56909b3d1c19380.png) 再启动 正常访问 ![](https://i-blog.csdnimg.cn/direct/811f55ea097d4cdaa059c1548e3618b5.png) ## 十三、keepalived-vrrp脚本控制VIP keepalived 利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能 ### **VRRP Script****配置** 分两步实现: #### 定义脚本 vrrp_script :自定义资源监控脚本, vrrp 实例根据脚本返回值,公共定义,可被多个实例调用,定 义在 vrrp 实例之外的独立配置块,一般放在 global_defs 设置块之后。 通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对 MASTER 节点的权重减至低于SLAVE 节点,从而实现 VIP 切换到 SLAVE 节点 > vrrp_script \ { > script \\|\ # 此脚本返回值为非 0 时,会触发下面 OPTIONS 执行 > OPTIONS > } #### 调用脚本 track_script :调用 vrrp_script 定义的脚本去监控资源,定义在 VRRP 实例之内,调用事先定义的 vrrp_script > track_script { > SCRIPT_NAME_1 > SCRIPT_NAME_2 > } #### **定义****VRRP script** > vrrp_script \ { # 定义一个检测脚本,在 global_defs 之外配置 > script \\|\ #shell 命令或脚本路径 > interval \ # 间隔时间,单位为秒,默认 1 秒 > timeout \ # 超时时间 > weight \ # 默认为 0, 如果设置此值为负数, > # 当上面脚本返回值为非 0 时 > # 会将此值与本节点权重相加可以降低本节点权重, > # 即表示 fall. > # 如果是正数,当脚本返回值为 0 , > # 会将此值与本节点权重相加可以提高本节点权重 > # 即表示 rise. 通常使用负值 > fall \ # 执行脚本连续几次都失败 , 则转换为失败,建议设为 2 以上 > rise \ # 执行脚本连续几次都成功,把服务器从失败标记为成功 > user USERNAME \[GROUPNAME\] # 执行监测脚本的用户或组 > init_fail # 设置默认标记为失败状态,监测成功之后再转换为成功状态 > } #### **调用****VRRP script** > vrrp_instance test { > ... ... > track_script { > check_down > } > } 编写脚本 ![](https://i-blog.csdnimg.cn/direct/377241776a374b82b6b88df12d4a7fd3.png) ![](https://i-blog.csdnimg.cn/direct/b660acbabd9145f6a4b5777cdcb5c9e5.png) ![](https://i-blog.csdnimg.cn/direct/4e531b1dbedb4be48b3b5018a265c7da.png) 现在VIP在ka1上 ![](https://i-blog.csdnimg.cn/direct/499b1f15fc37491295b73b4fc9edb71f.png) ![](https://i-blog.csdnimg.cn/direct/5e384d9570304afa90afe4c72337037d.png) VIP跳到了ka2上 ![](https://i-blog.csdnimg.cn/direct/dfc11bde6b90498386b9480d0a564df4.png) 然后我们把/mnt/tc这个文件删掉 VIP又回到了ka1 ![](https://i-blog.csdnimg.cn/direct/9ef6698ba608428e86fd3c21efc51af1.png) ## 十四、keepalived+haproxy的高可用集群 在ka1和ka2上安装haproxy ![](https://i-blog.csdnimg.cn/direct/28f7157f712748c0962ebd6b76e75a3f.png) 配置haproxy ![](https://i-blog.csdnimg.cn/direct/54052dfea80c48c19963b2674c1f110a.png) ka1和ka2开启内核参数 ![](https://i-blog.csdnimg.cn/direct/ff8d5fba24c94642abaaa306ba8d3f0d.png) 两台http服务删除VIP和设定ARP广播 ![](https://i-blog.csdnimg.cn/direct/4bcbd1b8159848ee91c295387aca4c60.png) 编写脚本 ![](https://i-blog.csdnimg.cn/direct/045298db3c0040228257d38b457eb054.png) 编辑keepalived和haproxy配置文件 ![](https://i-blog.csdnimg.cn/direct/0242ecbb18bf4724b5f3b8f4fece847f.png) ![](https://i-blog.csdnimg.cn/direct/3fe99414ef0e45d788280f62eae3af0b.png) ![](https://i-blog.csdnimg.cn/direct/9989418a833b46c88b8158bf5f8bf301.png) 测试一下 ![](https://i-blog.csdnimg.cn/direct/ea370bed5f2f4428a051a8b6e10a0613.png) 然后我们停掉ka1上的haproxy服务 ![](https://i-blog.csdnimg.cn/direct/3f320632c0a940ba8e9ad6226e1702af.png)

相关推荐
DBWYX13 分钟前
gcc 链接顺序,静态库循环依赖问题
linux·运维·服务器
zxsz_com_cn30 分钟前
风电行业预测性维护解决方案:AIoT驱动下的风机健康管理革命
大数据·运维·人工智能
我们的五年32 分钟前
【Linux系统】进程间通信-System V消息队列
linux·运维·服务器·c++
island131441 分钟前
【Linux网络#18】:深入理解select多路转接:传统I/O复用的基石
linux·运维·数据库
GodGump3 小时前
dbgpt7.0 docker部署
运维·docker·容器
Wnq100727 小时前
智能巡检机器人在化工企业的应用研究
运维·计算机视觉·机器人·智能硬件·deepseek
tf的测试笔记9 小时前
测试团队UI自动化实施方案
运维·自动化
TDD_062810 小时前
【运维】Centos硬盘满导致开机时处于加载状态无法开机解决办法
linux·运维·经验分享·centos
头孢头孢10 小时前
k8s常用总结
运维·后端·k8s
遇码10 小时前
单机快速部署开源、免费的分布式任务调度系统——DolphinScheduler
大数据·运维·分布式·开源·定时任务·dolphin·scheduler