走进 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 {
594233887@qq.com #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区
分写多个
timiniglee-zln@163.com
}
notification_email_from keepalived@KA1.timinglee.org # 发邮件的地址
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

root@ka1 \~# vim /etc/rsyslog.conf

八、keepalived独立子配置文件

root@ka1 \~# systemctl restart keepalived.service

九、keepalived非强制和延迟抢占

非抢占模式****nopreempt

默认为抢占模式 preempt ,即当高优先级的主机恢复在线后,会抢占低先级的主机的 master 角色,
这样会使 vip 在 KA 主机中来回漂移,造成网络抖动,
建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的 master 角色
非抢占模块下 , 如果原主机 down 机 , VIP 迁移至的新主机 , 后续也发生 down 时 , 仍会将 VIP 迁移回原主机

两台都需要设置

现在VIP在ka1上

把服务停掉

VIP在ka2上

现在我们把ka1的服务重启,看VIP是否会回到ka1上

没回来证明是正确的

抢占延迟模式****preempt_delay

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回 VIP ,而是延迟一段时间(默认 300s )再抢回 VIP

两台都需要设置
现在VIP在ka1上,我们把ka1上的服务停掉,VIP会调到ka2上,再等10s,VIP就会再跳回到ka1


10s之后

十、keepalived单播模式设定

默认 keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
ka1

ka2

测试一下

ka2没有VIP

十一、keepalived邮件通知

当 keepalived 的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户
默认以用户 keepalived_script 身份执行脚本
如果此用户不存在,以 root 执行脚本可以用下面指令指定脚本执行用户的身份
安装邮件发送工具

QQ邮箱配置
root@ka1 \~# vim /etc/mail.rc

smpt-auth-password如何获得
登录QQ邮箱,找到账号与安全

点击安全设置

点击生成授权码即可(两台都需设置)
创建通知脚本
root@ka1 \~# vim /etc/keepalived/mail.sh

root@ka1 \~# chmod +x /etc/keepalived/mail.sh
两台都需要设置

测试一下

十二、keepalived双主模式
master/slave 的单主架构,同一时间只有一个 Keepalived 对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master 的双主架构,解决此问题。
master/master 的双主架构:
即将两个或以上 VIP 分别运行在不同的 keepalived 服务器,以实现服务器并行提供 web 访问的目的,提高 服务器资源利用率

ka1

ka2

测试一下

十二、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 <INT> # 检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 定义调度方法
lb_kind NAT|DR|TUN # 集群的类型 , 注意要大写
persistence_timeout <INT> # 持久连接时长
protocol TCP|UDP|SCTP # 指定服务协议 , 一般为 TCP
sorry_server <IPADDR> <PORT> # 所有 RS 故障时,备用服务器地址
real_server <IPADDR> <PORT> { #RS 的 IP 和 PORT
weight <INT> #RS 权重
notify_up <STRING>|<QUOTED-STRING> #RS 上线通知脚本
notify_down <STRING>|<QUOTED-STRING> #RS 下线通知脚本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } # 定义当前主机健康状
态检测方法
}
}

注意 : 括号必须分行写 , 两个括号写在同一行 , 如 : }} 会出错

应用层监测

应用层检测: HTTP_GET|SSL_GET

HTTP_GET|SSL_GET {
url {
path <URL_PATH> # 定义要监控的 URL
status_code <INT> # 判断上述检测机制为健康状态的响应码,一般为 200
}
connect_timeout <INTEGER> # 客户端请求的超时时长 , 相当于 haproxy 的 timeout server
nb_get_retry <INT> # 重试次数
delay_before_retry <INT> # 重试之前的延迟时长
connect_ip <IP ADDRESS> # 向当前 RS 哪个 IP 地址发起健康状态检测请求
connect_port <PORT> # 向当前 RS 的哪个 PORT 发起健康状态检测请求
bindto <IP ADDRESS> # 向当前 RS 发出健康状态检测请求时使用的源地址
bind_port <PORT> # 向当前 RS 发出健康状态检测请求时使用的源端口
}

TCP****监测

传输层检测: TCP_CHECK

TCP_CHECK {
connect_ip <IP ADDRESS> # 向当前 RS 的哪个 IP 地址发起健康状态检测请求
connect_port <PORT> # 向当前 RS 的哪个 PORT 发起健康状态检测请求
bindto <IP ADDRESS> # 发出健康状态检测请求时使用的源地址
bind_port <PORT> # 发出健康状态检测请求时使用的源端口
connect_timeout <INTEGER> # 客户端请求的超时时长

等于 haproxy 的 timeout server

}

两台http服务器配置VIP和设定ARP广播

keepalived安装ipvsadm

轮询正常

测试一下

随便停掉一个http服务

再启动

随便停掉一个keepalived服务

正常访问

再启动

正常访问

十三、keepalived-vrrp脚本控制VIP

keepalived 利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能

VRRP Script****配置

分两步实现:

定义脚本

vrrp_script :自定义资源监控脚本, vrrp 实例根据脚本返回值,公共定义,可被多个实例调用,定
义在 vrrp 实例之外的独立配置块,一般放在 global_defs 设置块之后。
通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对 MASTER 节点的权重减至低于SLAVE 节点,从而实现 VIP 切换到 SLAVE 节点

vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> # 此脚本返回值为非 0 时,会触发下面 OPTIONS 执行
OPTIONS
}

调用脚本

track_script :调用 vrrp_script 定义的脚本去监控资源,定义在 VRRP 实例之内,调用事先定义的
vrrp_script

track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}

定义****VRRP script

vrrp_script <SCRIPT_NAME> { # 定义一个检测脚本,在 global_defs 之外配置
script <STRING>|<QUOTED-STRING> #shell 命令或脚本路径
interval <INTEGER> # 间隔时间,单位为秒,默认 1 秒
timeout <INTEGER> # 超时时间
weight <INTEGER:-254..254> # 默认为 0, 如果设置此值为负数,

当上面脚本返回值为非 0 时

会将此值与本节点权重相加可以降低本节点权重,

即表示 fall.

如果是正数,当脚本返回值为 0 ,

会将此值与本节点权重相加可以提高本节点权重

即表示 rise. 通常使用负值

fall <INTEGER> # 执行脚本连续几次都失败 , 则转换为失败,建议设为 2 以上
rise <INTEGER> # 执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME GROUPNAME # 执行监测脚本的用户或组
init_fail # 设置默认标记为失败状态,监测成功之后再转换为成功状态
}

调用****VRRP script

vrrp_instance test {
... ...
track_script {
check_down
}
}

编写脚本

现在VIP在ka1上

VIP跳到了ka2上

然后我们把/mnt/tc这个文件删掉

VIP又回到了ka1

十四、keepalived+haproxy的高可用集群

在ka1和ka2上安装haproxy

配置haproxy

ka1和ka2开启内核参数


两台http服务删除VIP和设定ARP广播

编写脚本

编辑keepalived和haproxy配置文件



测试一下

然后我们停掉ka1上的haproxy服务

相关推荐
小猿姐1 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
阿里云云原生2 天前
深入内核:拆解 OpenTelemetry eBPF 探针如何优雅地“透视”多语言微服务?
云原生
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉2 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦2 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw