一、核心原理:VRRP 协议
Keepalived 的高可用功能核心是 VRRP 协议:
-
VRRP 作用:在一组服务器之间选举一个“主”节点来承载某个虚拟 IP(VIP),当主节点故障时,VIP 会自动漂移到备节点,确保服务地址不变,客户端访问不中断。
-
VIP:虚拟 IP 是客户端连接的目标 IP,后端由哪个节点响应是由 VRRP 决定的。
2.流程示意:
客户端请求
│
▼
VIP:192.168.1.100
┌────────────────────┐
│ Keepalived + Nginx │ ← 两套(主 + 备)
└────────────────────┘
│ │
┌─────┘ └─────┐
▼ ▼
Web1 (10.0.0.1) Web2 (10.0.0.2)
[应用服务] [应用服务]
二、角色划分
-
MASTER(主)节点:正常工作时,绑定 VIP 并对外提供服务。
-
BACKUP(备)节点:通过心跳监测 MASTER 状态,一旦发现主不可达,就接管 VIP 成为新的 MASTER。
🔁 三、Keepalived 高可用机制详解
1. 状态监控机制
-
Keepalived 在 MASTER 和 BACKUP 之间使用 VRRP 发送 多播心跳包(默认每秒一次)。
-
若 BACKUP 在设定时间内未收到心跳包(比如 3 次),则认为 MASTER 宕机。
-
之后,BACKUP 自动将 VIP 添加到本地网卡并接管服务。
2. 优先级机制
-
每个节点配置一个
priority(优先级),数值越大,优先级越高。 -
如果两个节点都在线,优先级高的节点将成为 MASTER。
-
可通过
nopreempt控制是否自动抢占 VIP。
3. 健康检查
-
Keepalived 支持通过
vrrp_script定义脚本定期检测服务是否健康(如检测 Nginx、LVS 端口是否存活)。 -
检测失败会降低节点优先级,从而触发主备切换。
vrrp_script chk_nginx { script "/etc/keepalived/chk_nginx.sh" interval 2 weight -10 }
💡 四、VIP 漂移(虚拟IP漂移)
当 MASTER 节点失效,BACKUP 节点通过绑定 VIP 地址来接替服务,这就是“VIP 漂移”机制:
-
自动将 VIP 添加到自己的网卡上(比如 eth0:1)
-
ARP 广播通知局域网中的其他设备更新 VIP 的 MAC 地址映射
📄 五、简单配置示例
一、环境准备
1. 服务器规划
| 角色 | IP 地址 | 主机名 | VIP |
|---|---|---|---|
| 主节点 | 192.168.1.10 | nginx-master | 192.168.1.100 |
| 备用节点 | 192.168.1.11 | nginx-backup | 192.168.1.100 |
2. 系统要求
-
两台 Linux 服务器 (CentOS/RHEL 7/8 或 Ubuntu 18.04/20.04)
-
确保服务器间网络互通
-
root 或 sudo 权限
二、安装配置步骤
1. 安装 Nginx (在两台服务器上执行)
CentOS:
sudo yum install epel-release -y sudo yum install nginx -y sudo systemctl enable nginx sudo systemctl start nginx
2. 安装 Keepalived (在两台服务器上执行)
CentOS:
sudo yum install keepalived -y
3. 配置 Keepalived
主节点配置 (192.168.1.10)
创建或编辑配置文件 /etc/keepalived/keepalived.conf:
conf
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx" # 检查nginx进程是否存在
interval 2 # 每2秒检查一次
weight 2 # 优先级增加值
}
vrrp_instance VI_1 {
state MASTER # 初始状态为MASTER
interface ens33 # 网卡名称(根据实际情况修改)
virtual_router_id 51 # 虚拟路由ID,主备必须一致
priority 100 # 优先级(主节点高于备节点)
advert_int 1 # 检查间隔(秒)
authentication {
auth_type PASS
auth_pass 1111 # 认证密码,主备必须一致
}
virtual_ipaddress {
192.168.1.100/24 # VIP地址
}
track_script {
chk_nginx # 关联上面定义的检查脚本
}
}
备用节点配置 (192.168.1.11)
创建或编辑配置文件 /etc/keepalived/keepalived.conf:
conf
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 初始状态为BACKUP
interface ens33 # 网卡名称(根据实际情况修改)
virtual_router_id 51 # 必须与主节点一致
priority 90 # 优先级低于主节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 # 必须与主节点一致
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_nginx
}
}
4. 启动 Keepalived
在两台服务器上执行:
sudo systemctl enable keepalived sudo systemctl start keepalived
5. 验证配置
-
检查 VIP 是否在主节点上:
ip addr show ens33
应该能看到
192.168.1.100 -
测试访问:
curl http://192.168.1.100
-
模拟主节点故障:
-
在主节点停止 Nginx:
sudo systemctl stop nginx
-
检查 VIP 是否自动漂移到备用节点
-
-
恢复主节点后,VIP 应该会自动切回主节点
三、高级配置选项
1. 邮件通知 (可选)
在 Keepalived 配置中添加:
conf
global_defs {
notification_email {
admin@example.com
}
notification_email_from keepalived@example.com
smtp_server smtp.example.com
smtp_connect_timeout 30
}
2. Nginx 健康检查脚本增强
创建更健壮的健康检查脚本 /usr/local/bin/check_nginx.sh:
bash
#!/bin/bash
if ! /usr/bin/killall -0 nginx; then
systemctl restart nginx
sleep 2
if ! /usr/bin/killall -0 nginx; then
systemctl stop keepalived
fi
fi
然后修改 Keepalived 配置中的检查脚本:
conf
vrrp_script chk_nginx {
script "/usr/local/bin/check_nginx.sh"
interval 2
weight 2
}
注意点: 如果配置了ssl证书 要把dns解析到虚ip上 此实例中dns地址为192.168.1.100
这有这样才能实现nginx的主主高可用 每个nginx在分发到多个服务上 实现负载均衡的业务高可用

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



