admin管理员组文章数量:1516870
适用场景 :Linux 高可用集群搭建、VIP 漂移、LVS 高可用、服务故障自动切换 核心定位 :基于 VRRP 协议的软件实现,解决单点故障,实现服务高可用,原生支持 LVS 集群的健康检测与规则管理 实验环境 :CentOS/RHEL 系列,节点规划 KA1 (172.25.254.50)、KA2 (172.25.254.60)、RS1 (172.25.254.10)、RS2 (172.25.254.20),VIP 172.25.254.100/200
一、Keepalived 基础认知
1.1 核心依赖:VRRP 协议
虚拟路由冗余协议(VRRP) :解决静态网关单点故障,将多台物理路由器虚拟为一台 虚拟路由器 ,通过心跳机制实现主备切换,核心术语如下:
- VRID :虚拟路由器标识,0-255,同一虚拟路由器的所有节点必须一致,且网络内唯一
- VIP :虚拟 IP,对外提供服务的统一入口,主节点故障时自动漂移至备节点
- VMAC :虚拟 MAC 地址,格式为 00-00-5e-00-01-VRID
- Master/Backup :主 / 备节点,通过 优先级 (1-254)选举,优先级越高越易成为 Master
- 心跳 :主节点周期性发送通告报文,包含优先级等信息,备节点未收到则触发主备切换
1.2 Keepalived 核心功能
- 基于 VRRP 实现 VIP 地址漂移,解决单点故障
- 为 LVS 集群自动生成 IPVS 规则,管理真实服务器(RS)
- 对 LVS 后端 RS 做健康状态检测(TCP/HTTP/SSL 等)
- 支持自定义脚本调用,实现服务状态检测、故障告警、自动切换
- 兼容 Nginx/HAProxy 等服务的高可用搭建
1.3 系统可用性指标
高可用核心公式: 可用性 A = MTBF / (MTBF + MTTR) (MTBF:平均无故障时间,MTTR:平均修复时间)常见行业指标:
- 99.9%:每月停机约 43.2 分钟
- 99.95%:每月停机约 21.6 分钟
- 99.99%:每月停机约 4.32 分钟
- 99.999%:每年停机约 5.26 分钟Keepalived 核心目标: 降低 MTTR ,通过自动化故障切换实现秒级恢复,提升系统可用性。
1.4 Keepalived 架构(用户空间)
- VRRP Stack :处理 VRRP 协议报文,实现 VIP 通告与主备选举
- Checkers :对后端 RS / 本地服务做健康状态检测
- IPVS Wrapper :生成并管理 LVS 的 IPVS 规则
- WatchDog :监控 Keepalived 自身进程,防止进程挂死
- SMTP :邮件告警组件,实现故障切换邮件通知
- System Call :状态切换时调用自定义脚本(如告警、服务启停)
二、Keepalived 环境准备与基础安装
2.1 实验环境统一配置
所有节点(KA1/KA2/RS1/RS2)需完成以下配置,避免因环境不一致导致故障:
-
时间同步
:以 KA1 为时间服务器,其他节点同步 KA1 时间
bash
运行
# KA1 配置 chrony vim /etc/chrony.conf allow 0.0.0.0/0 local stratum 10 systemctl restart chronyd && systemctl enable chronyd # 其他节点同步 KA1 vim /etc/chrony.conf pool 172.25.254.50 iburst systemctl restart chronyd && systemctl enable chronyd -
本地解析
:配置
/etc/hosts,实现节点间主机名互通bash
运行
cat >> /etc/hosts << EOF 172.25.254.50 KA1 172.25.254.60 KA2 172.25.254.10 RS1 172.25.254.20 RS2 EOF # 同步至其他节点 scp /etc/hosts 172.25.254.60:/etc/hosts scp /etc/hosts 172.25.254.10:/etc/hosts scp /etc/hosts 172.25.254.20:/etc/hosts -
关闭防火墙 / SELinux
:避免端口 / 协议被拦截
bash
运行
systemctl stop firewalld && systemctl disable firewalld setenforce 0 && sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config -
后端服务准备
(RS1/RS2):以 httpd 为例,提供测试服务
bash
运行
dnf install httpd -y # RS1 echo "RS1 - 172.25.254.10" > /var/www/html/index.html # RS2 echo "RS2 - 172.25.254.20" > /var/www/html/index.html systemctl enable --now httpd
2.2 Keepalived 安装与核心文件
2.2.1 安装命令
bash
运行
dnf install keepalived -y # CentOS/RHEL 8+
yum install keepalived -y # CentOS/RHEL 7
2.2.2 核心文件路径
表格
| 文件类型 | 路径 | 作用 |
|---|---|---|
| 主程序 |
/usr/sbin/keepalived
| Keepalived 核心执行程序 |
| 主配置文件 |
/etc/keepalived/keepalived.conf
| 核心配置文件,包含全局、VRRP、LVS 配置 |
| 配置示例 |
/usr/share/doc/keepalived/
| 官方配置示例,参考性强 |
| 系统服务文件 |
/lib/systemd/system/keepalived.service
| 系统服务管理文件 |
| 服务环境配置 |
/etc/sysconfig/keepalived
| 配置 Keepalived 启动参数(如日志级别) |
| 日志文件 |
/var/log/keepalived.log
| 分离后的 Keepalived 专属日志(默认在 /var/log/messages) |
2.2.3 基础启动与验证
bash
运行
# 启动并设置开机自启
systemctl start keepalived && systemctl enable keepalived
# 验证进程
ps axf | grep keepalived
# 验证配置文件语法
keepalived -t -f /etc/keepalived/keepalived.conf
三、Keepalived 核心配置详解
3.1 配置文件整体结构
Keepalived 配置文件分为 三大核心模块 ,所有配置均基于此结构展开:
conf
! Configuration File for keepalived
# 1. 全局配置:邮件、路由ID、VRRP全局参数
global_defs {
...
}
# 2. VRRP实例配置:虚拟路由器、VIP、主备选举、认证等
vrrp_instance 实例名 {
...
}
# 3. LVS配置:虚拟服务、RS、健康检测、调度算法等(可选)
virtual_server VIP 端口 {
...
real_server RS_IP 端口 {
...
}
}
3.2 全局配置(global_defs)
核心配置项,作用于 Keepalived 整个进程,关键配置如下:
conf
global_defs {
# 故障切换告警邮件接收人,可写多个
notification_email {
timinglee_zln@163.com
594233887@qq.com
}
# 告警邮件发件人
notification_email_from keepalived@KA1
# 邮件服务器地址(本地/公网SMTP)
smtp_server 127.0.0.1
# 邮件服务器连接超时时间
smtp_connect_timeout 30
# 路由ID,每个节点唯一(建议用主机名)
router_id KA1
# 跳过同一路由器的通告报文检查,提升性能
vrrp_skip_check_adv_addr
# 严格遵循VRRP协议(建议注释,否则单播/无VIP会启动失败)
# vrrp_strict
# 免费ARP报文发送间隔,更新网络ARP缓存
vrrp_garp_interval 1
# 免费NA报文发送间隔(IPv6)
vrrp_gna_interval 1
# VRRP组播地址(默认224.0.0.18)
vrrp_mcast_group4 224.0.0.44
# 开启脚本执行安全校验
enable_script_security
# 指定自定义脚本执行用户(默认keepalived_script,建议root)
script_user root
}
3.3 VRRP 实例配置(vrrp_instance)
核心模块,实现 VIP 管理与主备切换,
同一虚拟路由器的所有节点,VRID / 认证密码 / VIP 必须一致
,主备仅需修改
state
和
priority
。
3.3.1 单主模式基础配置
KA1(Master 节点)
conf
vrrp_instance WEB_VIP {
# 状态:MASTER/BACKUP(非抢占模式下所有节点均为BACKUP)
state MASTER
# 绑定的物理网卡(如eth0/ens33)
interface eth0
# 虚拟路由器ID,0-255,网络内唯一
virtual_router_id 51
# 优先级,1-254,Master需高于Backup(如100/80)
priority 100
# 心跳通告间隔,默认1s
advert_int 1
# 认证配置,同一虚拟路由器必须一致
authentication {
# 认证类型:PASS(简单密码,推荐)/AH(IPSEC,不推荐)
auth_type PASS
# 预共享密钥,仅前8位有效
auth_pass 1111
}
# 虚拟IP(VIP),可配置多个,格式:IP/掩码 dev 网卡 label 别名
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
KA2(Backup 节点)
仅需修改 3 处:
state BACKUP
、
priority 80
,其余与 Master 完全一致。
3.3.2 关键扩展配置
-
非抢占模式(nopreempt)
默认为抢占模式,Master 恢复后会立即抢占 VIP,导致网络抖动;
非抢占模式下所有节点状态均为 BACKUP
,Master 恢复后不会主动抢占,需手动干预或备节点故障才会漂移。
conf
vrrp_instance WEB_VIP { state BACKUP # 所有节点均为BACKUP priority 100 # KA1优先级仍高于KA2 nopreempt # 开启非抢占模式 ... } -
抢占延迟(preempt_delay)
抢占模式下,Master 恢复后延迟一段时间再抢占 VIP,避免短时间内多次切换,默认 300s,建议设为 10-60s:
conf
preempt_delay 10 # 延迟10s抢占VIP -
单播模式(unicast)
默认组播模式,无法跨网络通信,且会造成网络拥塞;
单播模式
指定主备节点互访 IP,仅在节点间发送心跳,需
注释 vrrp_strict
,配置如下:
conf
vrrp_instance WEB_VIP { ... # 单播源IP:本机物理IP unicast_src_ip 172.25.254.50 # 单播对等体:对方节点物理IP,可写多个 unicast_peer { 172.25.254.60 } ... } -
故障切换脚本(notify_*)
节点状态切换为 Master/Backup/Fault 时,自动调用自定义脚本(如邮件告警、服务启停):
conf
vrrp_instance WEB_VIP { ... # 成为Master时调用 notify_master "/etc/keepalived/scripts/waring.sh master" # 成为Backup时调用 notify_backup "/etc/keepalived/scripts/waring.sh backup" # 故障时调用 notify_fault "/etc/keepalived/scripts/waring.sh fault" ... }
3.4 LVS 集成配置(virtual_server/real_server)
Keepalived 原生支持 LVS,可自动生成 IPVS 规则,并对后端 RS 做健康检测,核心配置如下:
conf
# 配置虚拟服务:VIP + 端口
virtual_server 172.25.254.100 80 {
# 健康检测间隔,单位s
delay_loop 6
# LVS调度算法:rr(轮询)/wrr(加权轮询)/lc(最小连接)/wlc(加权最小连接)
lb_algo wrr
# LVS模式:NAT/DR(直接路由,推荐)/TUN(隧道)
lb_kind DR
# 协议类型:TCP/UDP
protocol TCP
# 所有RS故障时,备用服务地址
sorry_server 172.25.254.30 80
# 配置后端真实服务器RS1
real_server 172.25.254.10 80 {
# 权重,值越大被调度的概率越高
weight 1
# TCP层健康检测
TCP_CHECK {
# 连接超时时间
connect_timeout 5
# 重试次数
nb_get_retry 3
# 重试延迟
delay_before_retry 3
# 检测端口
connect_port 80
}
}
# 配置后端真实服务器RS2
real_server 172.25.254.20 80 {
weight 1
# HTTP层健康检测(比TCP更精准,检测页面可用性)
HTTP_GET {
url {
# 检测的URL路径
path /
# 健康状态响应码(正常为200)
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
注意 :LVS-DR 模式下,后端 RS 需将 VIP 绑定至 lo 网卡,并关闭 ARP 响应,避免 VIP 冲突:
bash
运行
# RS1/RS2 执行
ip addr add 172.25.254.100/32 dev lo
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
3.5 自定义服务检测(vrrp_script + track_script)
通过
vrrp_script
定义自定义检测脚本,监控本地服务(如 Nginx/HAProxy/Mysql),服务故障时自动降低节点优先级,触发 VIP 漂移,
核心是脚本返回值
:返回 0 为正常,非 0 为故障。
3.5.1 配置步骤
- 定义检测脚本
-
在 VRRP 实例中通过
track_script调用
3.5.2 实战配置(监控 HAProxy)
conf
# 1. 定义vrrp_script,放在global_defs后、vrrp_instance前
vrrp_script check_haproxy {
# 检测脚本:检查haproxy进程是否存在
script "/etc/keepalived/scripts/haproxy.sh"
# 检测间隔,1s
interval 1
# 故障时降低的优先级(负值),如故障后优先级-30
weight -30
# 连续失败次数,判定为故障
fall 2
# 连续成功次数,判定为恢复
rise 2
# 脚本执行超时时间
timeout 2
}
# 2. 在vrrp_instance中调用
vrrp_instance WEB_VIP {
...
track_script {
check_haproxy # 调用上面定义的检测脚本
}
...
}
3.5.3 检测脚本示例(haproxy.sh)
bash
运行
#!/bin/bash
# 检查haproxy进程是否存在,killall -0 仅检测进程,不杀死
/usr/bin/killall -0 haproxy
# 脚本返回值:0为正常,非0为故障
赋予脚本执行权限:
bash
运行
chmod +x /etc/keepalived/scripts/haproxy.sh
四、Keepalived 高级实战配置
4.1 双主模式(Master/Master)
解决单主模式下备节点资源闲置问题, 两个虚拟路由器,两个 VIP ,每个节点在一个虚拟路由器中为 Master,另一个为 Backup,实现资源利用率 100%。
4.1.1 核心配置
KA1 配置 :WEB_VIP(Master)、DB_VIP(Backup)
conf
# 虚拟路由器1:WEB_VIP,VIP 172.25.254.100,KA1为Master
vrrp_instance WEB_VIP {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
# 虚拟路由器2:DB_VIP,VIP 172.25.254.200,KA1为Backup
vrrp_instance DB_VIP {
state BACKUP
interface eth0
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:1
}
}
KA2 配置 :WEB_VIP(Backup)、DB_VIP(Master)
conf
# 虚拟路由器1:WEB_VIP,KA2为Backup
vrrp_instance WEB_VIP {
state BACKUP
interface eth0
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
# 虚拟路由器2:DB_VIP,KA2为Master
vrrp_instance DB_VIP {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:1
}
}
4.1.2 验证效果
- 正常情况下:KA1 持有 100,KA2 持有 200,各自对外提供服务
- KA1 故障:KA2 自动接管 100+200,所有服务无中断
- KA2 故障:KA1 自动接管 100+200,所有服务无中断
4.2 子配置文件拆分(include)
生产环境中配置项过多时,主配置文件可读性差,通过
include
指令将不同功能的配置拆分至独立子配置文件,便于管理。
4.2.1 配置步骤
- 创建子配置文件目录
-
主配置文件中通过
include引入子配置 - 子配置文件中编写具体的 VRRP/LVS 配置
4.2.2 实战配置
bash
运行
# 1. 创建子配置目录
mkdir -p /etc/keepalived/conf.d
主配置文件(/etc/keepalived/keepalived.conf) :仅保留全局配置,引入子配置
conf
global_defs {
notification_email {
timinglee_zln@163.com
}
notification_email_from keepalived@KA1
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 1
vrrp_gna_interval 1
}
# 引入conf.d目录下所有.conf后缀的子配置文件
include /etc/keepalived/conf.d/*.conf
子配置文件(/etc/keepalived/conf.d/webvip.conf) :编写 WEB_VIP 配置
conf
vrrp_instance WEB_VIP {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
4.3 日志分离
默认情况下,Keepalived 日志混在
/var/log/messages
中,与其他服务日志混杂,不利于问题排查,通过修改启动参数和 rsyslog 配置,实现日志单独存储。
bash
运行
# 1. 修改Keepalived启动参数,指定日志级别
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6" # -S 6 指定日志设备为local6
# 2. 配置rsyslog,将local6的日志定向至专属文件
vim /etc/rsyslog.conf
local6.* /var/log/keepalived.log
# 3. 重启服务使配置生效
systemctl restart keepalived rsyslog
# 4. 验证日志
tail -f /var/log/keepalived.log
4.4 故障切换邮件告警
实现 Keepalived 状态切换(Master/Backup/Fault)时,自动发送邮件告警,及时通知运维人员,核心分为 邮件环境配置 和 告警脚本配置 。
4.4.1 邮件环境配置(所有节点)
安装邮件工具并配置公网 SMTP(以 163 邮箱为例):
bash
运行
# 安装邮件工具
dnf install s-nail postfix -y
systemctl start postfix && systemctl enable postfix
# 配置SMTP
vim /etc/mail.rc
set smtp=smtp.163.com
set smtp-auth=login
set smtp-auth-user=你的163邮箱@163.com
set smtp-auth-password=你的163邮箱授权码
set from=你的163邮箱@163.com
set ssl-verify=ignore
# 测试邮件发送
echo "测试Keepalived邮件告警" | mail -s "Keepalived测试" 接收邮箱@qq.com
4.4.2 告警脚本配置
- 创建脚本目录并编写告警脚本
bash
运行
mkdir -p /etc/keepalived/scripts
vim /etc/keepalived/scripts/waring.sh
#!/bin/bash
# 告警邮件接收人
mail_dest='594233887@qq.com'
# 邮件发送函数
mail_send() {
mail_subj="$HOSTNAME to be $1 vip 转移"
mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
# 根据脚本参数调用函数
case $1 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac
- 赋予脚本执行权限
bash
运行
chmod +x /etc/keepalived/scripts/waring.sh
- VRRP 实例中调用脚本(参考 3.3.2 节)
- 测试告警:停止 Keepalived 服务,查看接收邮箱是否收到告警邮件
bash
运行
systemctl stop keepalived
五、Keepalived 核心运维命令与故障排查
5.1 核心运维命令
bash
运行
# 启动/停止/重启/状态查看
systemctl start/stop/restart/status keepalived
# 配置文件语法检查
keepalived -t -f /etc/keepalived/keepalived.conf
# 查看VIP绑定情况
ip addr | grep eth0:0
# 查看LVS IPVS规则
ipvsadm -Ln
# 监控VRRP心跳报文(组播)
tcpdump -i eth0 -nn host 224.0.0.18
# 监控VRRP心跳报文(单播)
tcpdump -i eth0 -nn src 172.25.254.50 and dst 172.25.254.60
# 查看Keepalived日志
tail -f /var/log/keepalived.log
# 检测后端RS健康状态
ipvsadm -Ln --stats
5.2 常见故障排查思路
Keepalived 启动失败
-
检查配置文件语法:
keepalived -t -f /etc/keepalived/keepalived.conf - 检查 vrrp_strict:开启后单播 / 无 VIP 会启动失败,注释即可
- 检查 VRID:网络内是否重复
-
查看日志:
/var/log/keepalived.log
-
检查配置文件语法:
VIP 无法漂移
- 检查主备节点心跳:tcpdump 监控组播 / 单播报文
- 检查防火墙 / SELinux:是否拦截了 VRRP 协议(端口 112)
- 检查优先级:备节点优先级是否低于主节点
- 检查认证配置:主备节点 auth_type/auth_pass 是否一致
LVS 调度失败
-
检查 IPVS 规则:
ipvsadm -Ln是否生成 - 检查后端 RS 健康状态:是否被标记为 down
- 检查 LVS 模式:DR 模式下 RS 是否绑定 VIP 至 lo 网卡,关闭 ARP 响应
- 检查 RS 服务:是否正常运行,端口是否开放
-
检查 IPVS 规则:
自定义脚本不执行
- 检查脚本执行权限:是否赋予 chmod +x
- 检查脚本返回值:是否符合预期(0 正常,非 0 故障)
- 检查 keepalived 配置:是否开启 enable_script_security,脚本用户是否为 root
- 查看日志:是否有脚本执行相关的错误信息
六、Keepalived 典型应用场景
- LVS 集群高可用 :结合 LVS 实现负载均衡 + 高可用,解决 LVS 调度器单点故障
- Nginx/HAProxy 高可用 :通过 vrrp_script 监控 Nginx/HAProxy 进程,故障时自动漂移 VIP
- Mysql/Redis 主备高可用 :结合主备复制,通过脚本监控数据库状态,故障时切换 VIP
- 跨网络高可用 :通过单播模式实现跨网段 / 跨机房的主备切换
- 多 VIP 管理 :通过多个 VRRP 实例,实现多个服务的独立 VIP 漂移,互不影响
七、核心总结
- Keepalived 是 VRRP 协议的软件实现,核心解决 单点故障 ,实现 VIP 自动漂移,提升服务高可用;
- 核心配置分为全局、VRRP 实例、LVS 三大模块, 同一虚拟路由器的 VRID / 认证 / VIP 必须一致 ;
- 主备模式分为 抢占 / 非抢占 ,生产环境推荐 非抢占模式 ,避免网络抖动;
- 组播模式适合同网络, 单播模式 适合跨网络,需注释 vrrp_strict;
-
可通过
vrrp_script + track_script实现自定义服务检测,服务故障时自动降低优先级触发 VIP 漂移; - 双主模式通过 两个虚拟路由器 实现资源利用率 100%,适合高并发场景;
- 日志分离、邮件告警是生产环境必备配置,便于问题排查和故障通知;
- 结合 LVS 时,需注意 LVS 模式的配套配置(如 DR 模式的 RS 端 ARP 关闭)。
学习建议 :先搭建单主模式熟悉基础配置,再逐步扩展至非抢占、单播、双主模式,最后结合 Nginx/LVS 实现实际业务的高可用,重点掌握配置文件语法和故障排查思路。
3.keepalived.pdf 和其他 9 文件
将上面的表格转化成文字形式,生成keepalived的CSDN的学习笔记文档
Keepalived 从入门到精通:CSDN 超全学习笔记
适用场景 :Linux 高可用集群搭建、VIP 漂移配置、LVS 负载均衡高可用、服务故障自动切换 核心定位 :基于 VRRP 协议的高可用解决方案,专为解决单点故障设计,原生支持 LVS 集群管理与服务健康检测 实验环境 :CentOS/RHEL 7/8/9,节点规划(KA1:172.25.254.50、KA2:172.25.254.60、RS1:172.25.254.10、RS2:172.25.254.20),VIP 示例:172.25.254.100/200
一、Keepalived 基础核心认知
1.1 高可用集群核心概念
-
集群类型分类
:
- 负载均衡集群(LB):代表技术有 LVS、HAProxy、Nginx(http/stream 模块),核心是分发请求、提升并发处理能力;
- 高可用集群(HA):适用于数据库、Redis 等关键服务,核心是消除单点故障(SPoF),保障服务持续可用;
- 高性能集群(HPC):聚焦大规模计算任务,整合多节点算力。
-
系统可用性指标
:可用性计算公式为
A = MTBF / (MTBF + MTTR),其中 MTBF 是平均无故障时间,MTTR 是平均修复时间。常见行业标准:- 99.9%:每月允许停机约 43.2 分钟;
- 99.95%:每月允许停机约 21.6 分钟;
- 99.99%:每月允许停机约 4.32 分钟;
- 99.999%:每年允许停机约 5.26 分钟。
- 高可用实现逻辑 :核心是降低 MTTR,通过建立冗余机制实现故障自动切换,常见模式包括主 / 备(active/passive)、双主(active/active),依赖心跳(HEARTBEAT)机制维持节点状态同步。
1.2 VRRP 协议核心原理
虚拟路由冗余协议(VRRP)是 Keepalived 的技术基石,用于解决静态网关单点故障问题,其核心术语与工作机制如下:
-
核心术语
:
- 虚拟路由器(Virtual Router):由多台物理路由器虚拟而成的逻辑设备,对外提供统一服务入口;
- VRID(虚拟路由器标识):取值 0-255,是虚拟路由器的唯一标识,同一虚拟路由器的所有节点必须配置相同 VRID;
- VIP(虚拟 IP):虚拟路由器的对外服务 IP,故障时自动漂移至健康节点;
- VMAC(虚拟 MAC):格式为 00-00-5e-00-01-VRID,与 VIP 绑定,避免 ARP 缓存不一致问题;
- 主设备(master)/ 备设备(backup):通过优先级(priority,取值 1-254)选举,优先级越高越易成为主设备;
- 心跳通告:主设备周期性发送包含优先级的报文,备设备未收到通告则触发主备切换。
-
关键技术特性
:
- 工作方式:抢占式(默认,主设备恢复后抢占 VIP)、非抢占式(主设备恢复后不主动抢占,避免网络抖动);
- 安全认证:支持无认证、简单字符认证(预共享密钥)、MD5 认证,生产环境推荐简单字符认证;
- 工作模式:主 / 备模式(单虚拟路由器)、双主模式(两个虚拟路由器,互为主备)。
1.3 Keepalived 核心功能与架构
-
核心功能
:
- 基于 VRRP 协议实现 VIP 地址漂移,解决单点故障;
- 自动为 VIP 所在节点生成 IPVS 规则,适配 LVS 负载均衡集群;
- 对 LVS 后端真实服务器(RS)进行健康状态检测(支持 TCP/HTTP/SSL 等方式);
- 支持脚本调用,可实现故障告警、服务启停等自定义逻辑,适配 Nginx、HAProxy 等服务。
-
架构组成(用户空间)
:
- VRRP Stack:处理 VRRP 协议报文,实现 VIP 状态通告与主备选举;
- Checkers:负责后端 RS 及本地服务的健康状态检测;
- IPVS Wrapper:生成并管理 LVS 集群的 IPVS 规则;
- WatchDog:监控 Keepalived 自身进程,防止进程挂死;
- SMTP 组件:实现故障切换时的邮件告警功能;
- System Call:状态切换时调用自定义脚本,扩展功能边界。
二、环境准备与基础安装
2.1 实验环境统一配置
所有节点(KA1/KA2/RS1/RS2)需完成以下基础配置,避免环境不一致导致故障:
-
时间同步
:以 KA1 为时间服务器,其他节点同步其时间,确保日志与切换逻辑时序一致:
bash
运行
# KA1 配置 chrony 服务 vim /etc/chrony.conf allow 0.0.0.0/0 # 允许所有节点同步 local stratum 10 # 本地时间层级 systemctl restart chronyd && systemctl enable chronyd # 其他节点同步 KA1 时间 vim /etc/chrony.conf pool 172.25.254.50 iburst # 指向 KA1 地址 systemctl restart chronyd && systemctl enable chronyd -
本地解析与主机名通信
:配置
/etc/hosts文件,实现节点间主机名直接访问:bash
运行
cat >> /etc/hosts << EOF 172.25.254.50 KA1 172.25.254.60 KA2 172.25.254.10 RS1 172.25.254.20 RS2 EOF # 同步至其他节点 for i in 60 10 20; do scp /etc/hosts 172.25.254.$i:/etc/hosts; done -
关闭防火墙与 SELinux
:避免拦截 VRRP 协议(默认端口 112)及服务通信:
bash
运行
systemctl stop firewalld && systemctl disable firewalld setenforce 0 && sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config -
后端服务准备(RS 节点)
:以 httpd 为例,提供测试服务用于后续验证:
bash
运行
dnf install httpd -y # RS1 配置 echo "RS1 - 172.25.254.10" > /var/www/html/index.html # RS2 配置 echo "RS2 - 172.25.254.20" > /var/www/html/index.html systemctl enable --now httpd
2.2 Keepalived 安装与核心文件
2.2.1 安装命令
bash
运行
# CentOS/RHEL 8+
dnf install keepalived -y
# CentOS/RHEL 7
yum install keepalived -y
2.2.2 核心文件路径与作用
-
主程序文件:
/usr/sbin/keepalived,Keepalived 核心执行程序; -
主配置文件:
/etc/keepalived/keepalived.conf,包含全局配置、VRRP 实例配置、LVS 配置; -
配置示例:
/usr/share/doc/keepalived/,官方提供的配置参考模板; -
系统服务文件:
/lib/systemd/system/keepalived.service,用于通过 systemd 管理服务; -
服务环境配置:
/etc/sysconfig/keepalived,可配置 Keepalived 启动参数(如日志级别); -
日志文件:默认存于
/var/log/messages,可通过配置分离至/var/log/keepalived.log。
2.2.3 基础启动与验证
bash
运行
# 启动服务并设置开机自启
systemctl start keepalived && systemctl enable keepalived
# 验证进程状态
ps axf | grep keepalived
# 验证配置文件语法(关键步骤,避免配置错误导致启动失败)
keepalived -t -f /etc/keepalived/keepalived.conf
三、核心配置详解(从基础到进阶)
3.1 配置文件整体结构
Keepalived 配置文件分为三大核心模块,所有配置均围绕此结构展开:
conf
! Configuration File for keepalived
# 1. 全局配置:邮件告警、路由ID、VRRP全局参数等
global_defs {
...
}
# 2. VRRP实例配置:虚拟路由器、VIP、主备选举、认证等核心配置
vrrp_instance 实例名 {
...
}
# 3. LVS配置:虚拟服务、后端RS、健康检测、调度算法等(可选,适配LVS集群)
virtual_server VIP 端口 {
...
real_server RS_IP 端口 {
...
}
}
3.2 全局配置(global_defs)
作用于 Keepalived 整个进程的全局参数,关键配置如下:
conf
global_defs {
# 故障切换时的告警邮件接收人,可配置多个
notification_email {
timinglee_zln@163.com
594233887@qq.com
}
# 告警邮件发件人地址
notification_email_from keepalived@KA1
# 邮件服务器地址(本地或公网SMTP服务器)
smtp_server 127.0.0.1
# 邮件服务器连接超时时间(单位:秒)
smtp_connect_timeout 30
# 路由ID,每个节点唯一,建议使用主机名
router_id KA1
# 跳过同一路由器的重复通告报文检查,提升性能
vrrp_skip_check_adv_addr
# 严格遵循VRRP协议(建议注释,否则单播、无VIP等场景会启动失败)
# vrrp_strict
# 免费ARP报文发送间隔(单位:秒),用于更新网络ARP缓存
vrrp_garp_interval 1
# 免费NA报文发送间隔(单位:秒),适配IPv6场景
vrrp_gna_interval 1
# VRRP组播地址(默认224.0.0.18,可自定义)
vrrp_mcast_group4 224.0.0.44
# 开启脚本执行安全校验(避免恶意脚本执行)
enable_script_security
# 指定自定义脚本执行用户(默认keepalived_script,生产环境建议用root)
script_user root
}
3.3 VRRP 实例配置(vrrp_instance)
核心配置模块,实现 VIP 管理与主备切换,
同一虚拟路由器的所有节点必须保证 VRID、认证密码、VIP 一致
,仅需调整
state
和
priority
区分主备。
3.3.1 基础主备配置
KA1(Master 节点) :
conf
vrrp_instance WEB_VIP {
# 节点状态:MASTER(主)/BACKUP(备),非抢占模式下均设为BACKUP
state MASTER
# 绑定的物理网卡(如eth0、ens33,需与本机网卡名称一致)
interface eth0
# 虚拟路由器ID(0-255,同一虚拟路由器唯一)
virtual_router_id 51
# 优先级(1-254),Master优先级需高于Backup(如100>80)
priority 100
# 心跳通告间隔(单位:秒,默认1s,建议保持默认)
advert_int 1
# 认证配置,同一虚拟路由器必须一致
authentication {
# 认证类型:PASS(简单密码,推荐)/AH(IPSEC,不推荐)
auth_type PASS
# 预共享密钥(仅前8位有效,建议用数字+字母组合)
auth_pass 1111
}
# 虚拟IP(VIP),可配置多个,格式:IP/掩码 dev 网卡 label 别名
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
KA2(Backup 节点) :仅需修改 3 处配置,其余与 Master 一致:
conf
vrrp_instance WEB_VIP {
state BACKUP # 状态改为备节点
priority 80 # 优先级低于主节点
virtual_router_id 51 # 与主节点保持一致
# 其余配置(interface、authentication、virtual_ipaddress等)与KA1相同
}
3.3.2 关键进阶配置
- 非抢占模式(nopreempt) :默认抢占模式下,主节点恢复后会立即抢占 VIP,可能导致网络抖动。非抢占模式下,所有节点状态均设为 BACKUP,主节点恢复后不主动抢占,仅当当前主节点故障时才漂移 VIP:
conf
vrrp_instance WEB_VIP {
state BACKUP # 所有节点均设为BACKUP
priority 100 # KA1优先级仍高于KA2(如100>80)
nopreempt # 开启非抢占模式
# 其余配置保持不变
}
- 抢占延迟模式(preempt_delay) :若需保留抢占功能,可设置延迟时间(默认 300s),避免短时间内多次切换:
conf
preempt_delay 10 # 主节点恢复后,延迟10s抢占VIP
-
单播模式配置
:默认组播模式无法跨网络通信,且可能造成网络拥塞。单播模式通过指定节点互访 IP,仅在主备节点间发送心跳,需注释
vrrp_strict:
conf
vrrp_instance WEB_VIP {
...
# 单播源IP:本机物理IP
unicast_src_ip 172.25.254.50
# 单播对等体:对方节点物理IP,多节点可添加多个
unicast_peer {
172.25.254.60
}
...
}
- 故障切换脚本(notify_*) :节点状态切换为 Master/Backup/Fault 时,自动调用自定义脚本(如邮件告警、服务启停):
conf
vrrp_instance WEB_VIP {
...
# 成为Master时执行的脚本
notify_master "/etc/keepalived/scripts/notify.sh master"
# 成为Backup时执行的脚本
notify_backup "/etc/keepalived/scripts/notify.sh backup"
# 故障时执行的脚本
notify_fault "/etc/keepalived/scripts/notify.sh fault"
...
}
3.4 LVS 集成配置(virtual_server/real_server)
Keepalived 原生支持 LVS 负载均衡,可自动生成 IPVS 规则并监控后端 RS 健康状态,核心配置如下:
conf
# 虚拟服务配置:VIP + 端口(如80端口对应HTTP服务)
virtual_server 172.25.254.100 80 {
# 健康检测间隔(单位:秒)
delay_loop 6
# LVS调度算法:rr(轮询)/wrr(加权轮询)/lc(最小连接)/wlc(加权最小连接)
lb_algo wrr
# LVS模式:DR(直接路由,推荐)/NAT/TUN(隧道)
lb_kind DR
# 服务协议:TCP/UDP
protocol TCP
# 所有RS故障时,跳转的备用服务地址
sorry_server 172.25.254.30 80
# 后端真实服务器(RS1)配置
real_server 172.25.254.10 80 {
# 权重(值越大,被调度的概率越高)
weight 1
# TCP层健康检测(适用于无HTTP服务的场景)
TCP_CHECK {
# 连接超时时间(单位:秒)
connect_timeout 5
# 重试次数
nb_get_retry 3
# 重试延迟(单位:秒)
delay_before_retry 3
# 检测端口(与RS服务端口一致)
connect_port 80
}
}
# 后端真实服务器(RS2)配置
real_server 172.25.254.20 80 {
weight 1
# HTTP层健康检测(更精准,检测页面可用性)
HTTP_GET {
url {
# 检测的URL路径(如根路径/,或健康检查接口/health)
path /
# 健康状态响应码(正常为200)
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
注意 :LVS-DR 模式下,后端 RS 需将 VIP 绑定至 lo 网卡,并关闭 ARP 响应,避免 VIP 冲突:
bash
运行
# RS1/RS2 执行以下命令
ip addr add 172.25.254.100/32 dev lo
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
3.5 自定义服务检测(vrrp_script + track_script)
通过自定义脚本监控本地服务(如 Nginx、HAProxy、MySQL),服务故障时自动降低节点优先级,触发 VIP 漂移。核心逻辑:脚本返回 0 表示服务正常,非 0 表示故障。
3.5.1 配置步骤
- 定义检测脚本;
-
在 VRRP 实例中通过
track_script调用脚本。
3.5.2 实战配置(监控 HAProxy)
conf
# 1. 定义vrrp_script(需放在global_defs之后、vrrp_instance之前)
vrrp_script check_haproxy {
# 检测脚本路径(检查HAProxy进程是否存在)
script "/etc/keepalived/scripts/check_haproxy.sh"
# 检测间隔(单位:秒)
interval 1
# 故障时降低的优先级(负值,如-30,确保低于备节点优先级)
weight -30
# 连续失败次数(判定为故障,建议设为2次以上)
fall 2
# 连续成功次数(判定为恢复)
rise 2
# 脚本执行超时时间(单位:秒)
timeout 2
}
# 2. 在vrrp_instance中调用脚本
vrrp_instance WEB_VIP {
...
track_script {
check_haproxy # 引用上面定义的检测脚本
}
...
}
3.5.3 检测脚本示例(check_haproxy.sh)
bash
运行
#!/bin/bash
# 检查HAProxy进程是否存在(killall -0 仅检测进程,不杀死)
/usr/bin/killall -0 haproxy
# 脚本返回值:0=正常,非0=故障
赋予脚本执行权限:
bash
运行
chmod +x /etc/keepalived/scripts/check_haproxy.sh
四、高级实战场景配置
4.1 双主模式(Master/Master)
单主模式下备节点资源闲置,双主模式通过两个虚拟路由器、两个 VIP 实现资源利用率 100%:每个节点在一个虚拟路由器中为 Master,另一个为 Backup,同时对外提供服务。
4.1.1 核心配置
KA1 配置 :
conf
# 虚拟路由器1:WEB_VIP(VIP=172.25.254.100),KA1为Master
vrrp_instance WEB_VIP {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
# 虚拟路由器2:DB_VIP(VIP=172.25.254.200),KA1为Backup
vrrp_instance DB_VIP {
state BACKUP
interface eth0
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:1
}
}
KA2 配置
:与 KA1 配置对称,仅交换
state
和
priority
:
conf
# 虚拟路由器1:WEB_VIP,KA2为Backup
vrrp_instance WEB_VIP {
state BACKUP
interface eth0
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
# 虚拟路由器2:DB_VIP,KA2为Master
vrrp_instance DB_VIP {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:1
}
}
4.1.2 验证效果
- 正常状态:KA1 持有 172.25.254.100,KA2 持有 172.25.254.200,分别对外提供服务;
- 节点故障:若 KA1 下线,KA2 自动接管 172.25.254.100,所有服务无中断;KA1 恢复后,仅收回自身 Master 角色对应的 VIP。
4.2 子配置文件拆分(include 指令)
生产环境配置复杂时,主配置文件可读性差,可通过
include
指令将不同功能的配置拆分至独立子文件,便于管理。
4.2.1 配置步骤
- 创建子配置文件目录;
- 主配置文件中引入子配置;
- 子配置文件中编写具体的 VRRP/LVS 配置。
4.2.2 实战配置
bash
运行
# 1. 创建子配置目录
mkdir -p /etc/keepalived/conf.d
主配置文件(/etc/keepalived/keepalived.conf)
:仅保留全局配置,通过
include
引入子配置:
conf
global_defs {
notification_email {
timinglee_zln@163.com
}
notification_email_from keepalived@KA1
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 1
vrrp_gna_interval 1
}
# 引入conf.d目录下所有.conf后缀的子配置文件
include /etc/keepalived/conf.d/*.conf
子配置文件(/etc/keepalived/conf.d/webvip.conf) :编写 WEB_VIP 相关配置:
conf
vrrp_instance WEB_VIP {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
4.3 日志分离配置
默认情况下,Keepalived 日志混存于
/var/log/messages
,与其他服务日志混杂,不利于问题排查。通过以下配置实现日志单独存储:
bash
运行
# 1. 修改Keepalived启动参数,指定日志设备
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6" # -S 6 指定日志设备为local6
# 2. 配置rsyslog,将local6的日志定向至专属文件
vim /etc/rsyslog.conf
local6.* /var/log/keepalived.log
# 3. 重启服务使配置生效
systemctl restart keepalived rsyslog
# 4. 验证日志文件
tail -f /var/log/keepalived.log
4.4 故障切换邮件告警
实现 Keepalived 状态切换时自动发送邮件告警,及时通知运维人员。核心分为邮件环境配置和告警脚本配置。
4.4.1 邮件环境配置(所有节点)
以 163 邮箱为例,配置 SMTP 服务:
bash
运行
# 安装邮件工具
dnf install s-nail postfix -y
systemctl start postfix && systemctl enable postfix
# 配置SMTP(编辑/etc/mail.rc)
vim /etc/mail.rc
set smtp=smtp.163.com
set smtp-auth=login
set smtp-auth-user=你的163邮箱@163.com
set smtp-auth-password=你的163邮箱授权码(非登录密码)
set from=你的163邮箱@163.com
set ssl-verify=ignore
# 测试邮件发送
echo "Keepalived告警测试" | mail -s "测试邮件" 接收邮箱@qq.com
4.4.2 告警脚本配置
- 创建告警脚本:
bash
运行
mkdir -p /etc/keepalived/scripts
vim /etc/keepalived/scripts/notify.sh
#!/bin/bash
# 告警邮件接收人
mail_dest="594233887@qq.com"
# 邮件发送函数
mail_send() {
mail_subj="$HOSTNAME 状态切换为 $1(VIP漂移)"
mail_mess="$(date +%F\ %T):VRRP状态切换,$HOSTNAME 变为 $1 角色"
echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
# 根据脚本参数调用函数
case $1 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac
- 赋予脚本执行权限:
bash
运行
chmod +x /etc/keepalived/scripts/notify.sh
-
在 VRRP 实例中调用脚本(参考 3.3.2 节
notify_*配置)。
五、核心运维命令与故障排查
5.1 常用运维命令
bash
运行
# 服务启停与状态查看
systemctl start/stop/restart/status keepalived
# 配置文件语法校验(必做!避免配置错误)
keepalived -t -f /etc/keepalived/keepalived.conf
# 查看VIP绑定情况
ip addr | grep -E "eth0:0|ens33:0" # 对应自己的网卡别名
# 查看LVS IPVS规则
ipvsadm -Ln
# 监控VRRP心跳报文(组播模式)
tcpdump -i eth0 -nn host 224.0.0.18
# 监控VRRP心跳报文(单播模式)
tcpdump -i eth0 -nn src 172.25.254.50 and dst 172.25.254.60
# 查看Keepalived日志
tail -f /var/log/keepalived.log
# 检测后端RS健康状态
ipvsadm -Ln --stats
5.2 常见故障排查思路
Keepalived 启动失败 :
-
检查配置文件语法:
keepalived -t -f /etc/keepalived/keepalived.conf; -
检查
vrrp_strict:开启后单播、无 VIP 会启动失败,注释即可; - 检查 VRID:同一网络内是否存在重复 VRID;
-
查看日志:
/var/log/keepalived.log定位具体错误。
-
检查配置文件语法:
VIP 无法漂移 :
- 检查主备节点心跳:用 tcpdump 监控组播 / 单播报文,确认是否收到心跳;
- 检查防火墙 / SELinux:是否拦截 VRRP 协议(端口 112);
- 检查优先级:备节点优先级是否低于主节点;
-
检查认证配置:主备节点
auth_type和auth_pass是否一致。
LVS 调度失败 :
-
检查 IPVS 规则:
ipvsadm -Ln确认规则是否生成; -
检查后端 RS 状态:是否被标记为 down(
ipvsadm -Ln --stats); - 检查 LVS 模式:DR 模式下 RS 是否绑定 VIP 至 lo 网卡,是否关闭 ARP 响应;
-
检查 RS 服务:是否正常启动,端口是否开放(
telnet RS_IP 端口)。
-
检查 IPVS 规则:
自定义脚本不执行 :
-
检查脚本权限:是否赋予执行权限(
chmod +x); - 检查脚本返回值:是否符合预期(0 = 正常,非 0 = 故障);
-
检查 Keepalived 配置:是否开启
enable_script_security,脚本执行用户是否有足够权限; -
查看日志:通过
/var/log/keepalived.log排查脚本执行错误。
-
检查脚本权限:是否赋予执行权限(
六、典型应用场景总结
- LVS 集群高可用 :结合 LVS 实现负载均衡 + 高可用,解决 LVS 调度器单点故障;
-
Nginx/HAProxy 高可用
:通过
vrrp_script监控 Nginx/HAProxy 进程,故障时自动漂移 VIP; - 数据库 / Redis 高可用 :搭配主备复制,通过脚本监控数据库状态,故障时切换 VIP;
- 跨网络高可用 :单播模式支持跨网段、跨机房的主备切换;
- 多服务独立高可用 :通过多个 VRRP 实例,为不同服务配置独立 VIP,实现故障隔离。
七、学习总结与建议
- Keepalived 核心是基于 VRRP 协议实现 VIP 漂移,解决单点故障,关键配置在于 VRID 唯一、认证一致、优先级合理 ;
- 生产环境推荐 非抢占模式 + 单播模式 ,避免网络抖动和拥塞;
- 日志分离和邮件告警是运维必备配置,便于快速定位故障;
- 结合 LVS 时,需重点关注后端 RS 的 ARP 配置和健康检测方式;
- 学习路径:先搭建单主模式熟悉基础配置,再扩展双主、脚本监控、跨网络等高级场景,多动手实操验证故障切换效果。
版权声明:本文标题:实战必备:Keepalived配置与管理核心策略解析 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.betaflare.com/biancheng/1772304851a3273352.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论