一、Keepalived 是什么?
定义:Keepalived 是一个基于 VRRP(虚拟路由冗余协议) 实现的高可用解决方案,主要用于 Linux 服务器的故障自动切换,保证关键服务持续在线。
二、Keepalived 的工作原理
1️⃣ VIP 绑定
主服务器持有 VIP(虚拟 IP,如
192.168.1.100),对外提供服务。备服务器监听主的心跳,处于待命状态。
2️⃣ 心跳检测(VRRP 通告)
主服务器每隔 1 秒(默认)发送一次 VRRP 通告。
通告里包含主服务器的 优先级(priority) 和 虚拟路由 ID(virtual_router_id)。
3️⃣ 故障切换
备服务器如果在 3 秒内(3 个通告周期)未收到主的通告,则判定主已故障。
备服务器升级为主,立即绑定 VIP。
备服务器发送 免费 ARP(Gratuitous ARP),通知交换机更新 MAC 地址表,确保网络流量切换到新主。
整个切换过程对用户完全透明。
4️⃣ 主恢复
主服务器恢复后,根据配置的模式决定行为:
抢占模式(默认):主立即抢回 VIP,重新变为主。
非抢占模式:主不抢 VIP,继续当备。
架构图

三、Keepalived 的安装配置
你需要准备两台服务器:
安装keepalived
apt install keepalived -y1️⃣ 主服务器配置 (192.168.1.10)
编辑 /etc/keepalived/keepalived.conf:
bash
vim /etc/keepalived/keepalived.conf写入以下内容:
bash
! 全局定义
global_defs {
router_id nginx_master # 本机标识,主备不同即可
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2 # 每 2 秒检查一次
weight -20 # 检查失败时,本机优先级减 20
}
! VRRP 实例定义
vrrp_instance VI_1 {
state MASTER # 角色:主
interface eth0 # VIP 绑定的网卡名,用 ip a 查看
virtual_router_id 51 # 虚拟路由 ID,主备必须一致(范围 0-255)
priority 100 # 优先级,主必须高于备
advert_int 1 # 心跳间隔(秒)
! 认证
authentication {
auth_type PASS
auth_pass 1234 # 认证密码,主备必须一致
}
! 虚拟 IP(VIP)
virtual_ipaddress {
192.168.1.100/24 # VIP 地址,/24 是子网掩码
}
track_script {
check_nginx
}
}注意:interface eth0 要换成你实际的网卡名,执行 ip a 查看(可能是 ens3、ens192、enp0s3 等)。
执行ip a发现出现了虚拟的ip192.168.1.100
2️⃣ 备服务器配置 (192.168.1.11)
编辑 /etc/keepalived/keepalived.conf:
bash
! 全局定义
global_defs {
router_id nginx_backup # 和主不同
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2 # 每 2 秒检查一次
weight -20 # 检查失败时,本机优先级减 20
}
! VRRP 实例定义
vrrp_instance VI_1 {
state BACKUP # 角色:备
interface eth0 # 和主保持一致
virtual_router_id 51 # 和主保持一致
priority 90 # 低于主
advert_int 1
authentication {
auth_type PASS
auth_pass 1234 # 和主保持一致
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_nginx
}
}3️⃣ 编写检测脚本(两台服务器都做)
创建 /etc/keepalived/check_nginx.sh:
bash
#!/bin/bash
# 检查 Nginx 是否在监听 80 端口
if ss -tuln | grep -q ':80\b'; then
exit 0
else
exit 1
fichmod +x /etc/keepalived/check_nginx.sh4️⃣ 测试效果(模拟 Nginx 崩溃)
在主节点执行systemctl stop nginx
在备服务器执行:检查 VIP,发现vip漂移到了备节点
ip a | grep 192.168.1.100并且业务也能成功恢复
恢复主节点 Nginx
# 1. 在主服务器执行:重新启动 Nginx
systemctl start nginx
# 2. 等待 2-4 秒
# 3. 在主服务器执行:检查 VIP,因为是抢占模式,主节点优先级更高,发现vip又回到主节点
ip a | grep 192.168.1.100
# 4. 在备服务器执行:检查 VIP 是否已释放
ip a | grep 192.168.1.100
# 5. 访问 VIP
curl http://192.168.1.100四、预防脑裂
1️⃣ 启用单播模式
默认的多播模式容易受交换机影响,改成单播后主备之间直接点对点通信,可靠性大幅提升。
bash
vrrp_instance VI_1 {
# ... 其他配置 ...
unicast_src_ip 192.168.1.10 # 本机 IP
unicast_peer {
192.168.1.11 # 对端 IP
}
}
评论区