Keepalived 完整知识点总结
一、核心定位
Keepalived = 基于 VRRP 协议实现的 Linux 高可用(HA)集群软件 核心作用:
- 解决单点故障:主服务器宕机,备机自动接管 IP(虚拟 IP VIP 漂移)
- 常搭配 LVS、Nginx、Apache、MySQL 实现负载均衡 + 高可用架构
- 自带健康检测机制,故障自动切换、恢复自动切回
二、底层协议:VRRP(虚拟路由冗余协议)
1. VRRP 基础概念
- VRRP 组:一组主备服务器共用一个虚拟 VIP,同一网段
- MASTER(主节点):正常工作,持有 VIP,持续发送 VRRP 广播报文(通告)
- BACKUP(备节点):平时休眠,监听主节点报文
- 虚拟路由器 ID(VRID):一组主备统一编号(0~255),同 VRID 才属于同一集群
- 优先级 priority:数值越大优先级越高(默认 100),决定主备身份
2. 切换原理
- Master 每隔advert_int(默认 1s) 向组播地址
224.0.0.18发送 VRRP 通告 - Backup 收不到通告超时后(默认 3 倍通告时间 = 3s),判定主节点故障
- 优先级最高的 Backup 升级为 Master,抢占 VIP,业务无缝切换
3. 抢占模式 vs 非抢占模式
- 抢占模式(默认):故障主机恢复上线后,优先级更高会重新抢回 VIP
- 非抢占 nopreempt:主节点修好上线,也不夺回 VIP,避免频繁抖动,生产常用
三、Keepalived 三大核心模块
1. VRRP Stack(VRRP 协议栈)
负责主备选举、VIP 漂移、VRRP 报文收发,最核心模块
2. Checkers(健康检测模块)
对后端服务 / 本机业务做存活探测,探测失败会降低本机优先级、直接释放 VIP 支持探测方式:
- TCP 端口检测(最常用:检测 Nginx 80 端口)
- HTTP/HTTPS 请求检测
- 脚本自定义检测(shell 脚本,灵活适配 MySQL、业务进程等)
3. IPVS Stack(LVS 负载均衡模块)
内置 LVS 管理能力,可直接配置 LVS 四种调度模式,实现四层负载均衡 + 高可用 调度算法:rr、wrr、lc、wlc、sh、dh 等
四、核心配置文件详解
路径:/etc/keepalived/keepalived.conf 整体结构:全局配置 → VRRP 实例配置 → 健康检查配置
1. 全局段 global_defs
global_defs {
router_id LVS_01 # 节点唯一标识,主备不一样
notification_email { # 故障告警邮箱
xxx@163.com
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
vrrp_mcast_group4 224.0.0.18 # VRRP组播地址
}
2. VRRP 实例段 vrrp_instance VI_1(主备核心)
vrrp_instance VI_1 {
state MASTER # 主节点写MASTER,备节点BACKUP
interface eth0 # 绑定网卡(承载VIP)
virtual_router_id 51 # VRID,主备必须完全一致
priority 150 # 优先级:主>备(备一般设100)
advert_int 1 # 通告间隔1秒
nopreempt # 关闭抢占(可选)
authentication { # VRRP报文认证,主备密码一致
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { # 漂移VIP,可多个
192.168.1.100/24 dev eth0 label eth0:0
}
# 切换触发脚本:主变备、备变主执行自定义脚本
notify_master "/etc/keepalived/master.sh"
notify_backup "/etc/keepalived/backup.sh"
notify_fault "/etc/keepalived/fault.sh"
}
3. 健康检查 vrrp_script 示例
检测 Nginx 进程,异常则优先级下调 50,让出 VIP
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2 # 2秒检测一次
weight -50 # 检测失败,优先级减50
}
# 将脚本挂载到vrrp实例
track_script {
chk_nginx
}
简易检测脚本 check_nginx.sh
#!/bin/bash
systemctl is-active --quiet nginx
exit $?
五、两种主流部署架构
1. 主备架构(单 VIP,最常用)
一台 MASTER + 一台 BACKUP 优点:简单稳定;缺点:备机平时闲置,资源浪费
2. 双主架构(互为主备,双 VIP)
两台节点互相作为对方备机
- 节点 1:VI1 主(VIP1)、VI2 备
- 节点 2:VI1 备、VI2 主(VIP2) 优点:两台机器同时承载业务,资源利用率翻倍
六、常见启停、查看命令
# 安装
yum install keepalived -y / apt install keepalived -y
# 启停
systemctl start keepalived
systemctl stop keepalived
systemctl restart keepalived
systemctl enable keepalived
# 查看运行状态
systemctl status keepalived
# 查看VIP是否绑定
ip addr
# 日志排查(故障首选)
tail -f /var/log/messages
journalctl -u keepalived -f
# 抓包查看VRRP报文
tcpdump -i eth0 vrrp
七、故障切换场景(触发 VIP 切换)
- Keepalived 进程意外退出
- 本机网卡宕机、IP 地址丢失
- 健康检测脚本探测业务异常(Nginx/MySQL 挂掉)
- 服务器关机、断电、内核崩溃
八、生产环境注意事项
- 防火墙放行 VRRP:放行组播 224.0.0.18,协议号 112
firewall-cmd --add-protocol=vrrp --permanent - 关闭抢占模式:避免主节点恢复后频繁切换引发业务波动
- 禁止单节点多 VRID 冲突;同 VRID 必须网段一致
- 健康检测必不可少:不仅检测服务器,还要检测上层业务
- 内网环境慎用组播:交换机关闭组播会导致主备双主(都抢到 VIP,IP 冲突) 组播异常解决方案:改用单播模式 unicast_peer
unicast_peer { 192.168.1.11 # 对端节点IP } - VIP 不要和物理 IP 网段冲突
九、常见问题
- 双主现象(两端都拿到 VIP) 原因:VRRP 报文不通(防火墙拦截、交换机禁用组播、VRID 不一致、密码不同)
- 主节点恢复后 VIP 切回频繁 解决:添加 nopreempt 非抢占
- 业务宕机但 VIP 不切换 原因:未配置业务健康检测,只检测系统存活
十、典型应用场景
- Nginx+Keepalived:Web 服务高可用
- LVS+Keepalived:四层负载均衡集群
- MySQL 主从 + Keepalived:数据库 VIP 高可用
- Redis、Tomcat 等中间件单点 HA 保障
十一、Keepalived+Nginx 双主架构实操 + NFS 网页共享
一、环境规划不变
| 节点 | 物理 IP | 网卡 | 角色 | VIP |
|---|---|---|---|---|
| node1 | 192.168.118.100 | ens160 | VI1 主、VI2 备 | VIP1:192.168.118.200 |
| node2 | 192.168.118.101 | ens160 | VI1 备、VI2 主 | VIP2:192.168.10.201 |
架构特点:
- 两台机器同时跑 Nginx,分别承载两个 VIP 流量,资源不闲置
- 任意一台宕机,两个 VIP 全部漂移至另一台,业务不间断
- NFS 统一存放网页文件,两台 Nginx 页面内容完全一致,切换无内容差异
二、前期统一操作(两台节点都执行)
1. 安装软件
# CentOS
yum install nginx keepalived nfs-utils rpcbind -y
# Ubuntu
apt install nginx keepalived nfs-kernel-server -y
2. 关闭防火墙 + SELinux(测试环境)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
3. 编写 Nginx 健康检测脚本(两台一致)
vim /etc/keepalived/check_nginx.sh
#!/bin/bash
systemctl is-active --quiet nginx
exit $?
赋权:
chmod +x /etc/keepalived/check_nginx.sh
三、部署 NFS 共享网页目录(统一页面内容)
方案:node1 充当 NFS 服务端,共享网页目录;node2 挂载使用
1)node1(NFS 服务端)配置
- 创建共享目录
mkdir -p /data/nginx_html
# 写入统一首页内容
echo "Nginx双主高可用集群 | 共享网页目录" > /data/nginx_html/index.html
- 编辑 NFS 配置文件
vim /etc/exports
写入:
/data/nginx_html 192.168.118.0/24(rw,sync,no_root_squash)
参数解释:
- 192.168.118.0/24:允许整个网段挂载
- rw:读写权限
- sync:同步写入磁盘
- no_root_squash:root 用户权限不压缩
- 启动 NFS、rpcbind 并开机自启
systemctl start rpcbind nfs-server
systemctl enable rpcbind nfs-server
# 生效配置
exportfs -r
# 查看共享
showmount -e localhost
2)node2(客户端)挂载共享目录
# 临时挂载
mount 192.168.118.100:/data/nginx_html /usr/share/nginx/html
# 永久挂载(开机自动挂载)
vim /etc/fstab
# 添加一行
192.168.118.100:/data/nginx_html /usr/share/nginx/html nfs defaults 0 0
# 验证挂载
mount -a
df -h
3)两台 Nginx 统一网页目录
node1 修改 nginx 默认网页根目录指向本地共享文件夹:
vim /etc/nginx/nginx.conf
# 找到 root 配置,修改
root /data/nginx_html;
node2 无需修改,已经挂载好了。
启动 Nginx:
systemctl start nginx
systemctl enable nginx
分别访问两台机器 IP,页面内容完全相同。
四、Keepalived 双主配置文件
清空原有配置:
> /etc/keepalived/keepalived.conf
node1 完整配置
global_defs {
router_id nginx_node1
}
# Nginx健康检测脚本
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -50
}
# 实例1:VIP1 192.168.118.100 node1为主
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 150
advert_int 1
# 单播通信,规避交换机组播问题
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.118.200/24 dev ens160
}
track_script {
chk_nginx
}
}
# 实例2:VIP2 192.168.118.101 node1为备
vrrp_instance VI_2 {
state BACKUP
interface ens160
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.118.201/24 dev ens160
}
track_script {
chk_nginx
}
}
node2 完整配置
global_defs {
router_id nginx_node2
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -50
}
# 实例VI_1:VIP 192.168.10.100 备节点
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 100
advert_int 1
nopreempt
unicast_peer {
192.168.118.100
}
authentication {
auth_type PASS
auth_pass Vrrp@8899
}
virtual_ipaddress {
192.168.10.100/24
}
track_script {
chk_nginx
}
}
# 实例VI_2:VIP 192.168.10.200 主节点
vrrp_instance VI_2 {
state BACKUP
interface ens160
virtual_router_id 52
priority 150
advert_int 1
nopreempt
unicast_peer {
192.168.118.100
}
authentication {
auth_type PASS
auth_pass Vrrp@8899
}
virtual_ipaddress {
192.168.10.200/24
}
track_script {
chk_nginx
}
}
配置关键点总结
- VRID 必须不同:VI1=51,VI2=52
- 优先级错开:主 150、备 100
- 互相写入对方 IP,开启单播,杜绝双主 IP 冲突
- 密码两台全程一致
五、启动服务
两台节点依次执行:
systemctl start keepalived
systemctl enable keepalived
systemctl status keepalived
六、分场景测试验证
场景 1:正常运行状态
- node1 网卡:拥有
192.168.10.100 - node2 网卡:拥有
192.168.10.200访问:
- http://192.168.10.100 → node1 提供服务
- http://192.168.10.200 → node2 提供服务 两台负载均衡分担流量,页面完全一致
场景 2:关闭 node1 的 Nginx
node1 执行:
systemctl stop nginx
检测脚本失败,优先级下降 50 结果: VIP1 10.100 漂移到 node2 此时两个 VIP 都在 node2,全部流量由 node2 承接 访问两个 VIP 均可正常打开网页
场景 3:node1 整机关机断电
node1 直接关机 3 秒左右切换完成: VIP1、VIP2 全部漂移至 node2,业务无中断
场景 4:node1 重新开机上线
两台重新恢复初始状态: VIP1 回归 node1、VIP2 留在 node2,再次负载分担
场景 5:修改网页内容统一生效
node1 修改首页:
echo "更新后的网页内容 双主+NFS集群" > /data/nginx_html/index.html
刷新两个 VIP 页面,内容同步更新
七、生产优化补充
1. NFS 单点隐患解决
NFS 搭建在 node1 存在单点故障,两种方案:
- 改用rsync+inotify实时双向同步网页文件(无单点)
- 搭建 NFS 主备集群
2. 关闭抢占模式
需要稳定不频繁切换时,在 vrrp_instance 内添加 nopreempt
3. 日志排查
# 实时日志
journalctl -u keepalived -f
# 抓包vrrp报文
tcpdump -i ens33 vrrp
4. 客户端统一访问
前端 DNS 可以将两个 VIP 做轮询解析,实现入口负载均衡。
八、常见故障
- 挂载 NFS 失败:防火墙、端口 2049 未放行
- 双主抢 VIP:VRID 不一致、密码错误、未开单播
- Nginx 宕机不切换:没配置 vrrp_script 健康检测


被折叠的 条评论
为什么被折叠?



