Linux 已经搭建好的nginx,做基于 Keepalived 的主备高可用集群
两台服务器通过VRRP协议相互通信。主服务器(Master)会以组播方式向备服务器(Backup)发送心跳包。如果备服务器在一段时间内收不到心跳,就会接管VIP,成为新的主服务器。:你需要准备两台已部署好Nginx的Linux服务器,以及一个未被使用的内网虚拟IP(VIP)。
-
工作原理:两台服务器通过VRRP协议相互通信。主服务器(Master)会以组播方式向备服务器(Backup)发送心跳包。如果备服务器在一段时间内收不到心跳,就会接管VIP,成为新的主服务器。
-
环境准备:你需要准备两台已部署好Nginx的Linux服务器,以及一个未被使用的内网虚拟IP(VIP)。
角色 IP地址 VIP 操作系统 主服务器 (Master) 192.168.1.10 192.168.1.100 CentOS 7 / Ubuntu 20.04+ 备服务器 (Backup) 192.168.1.11 192.168.1.100 CentOS 7 / Ubuntu 20.04+
🔧 1. 安装Keepalived并编写健康检查脚本
首先,在两台服务器上都需要安装Keepalived并创建健康检查脚本。
-
安装Keepalived:
-
CentOS/RHEL:
yum install -y keepalived -
Ubuntu/Debian:
apt install -y keepalived -
同时确保你的Nginx服务已安装并正确配置。
-
-
创建Nginx健康检查脚本:
在/etc/keepalived/目录下创建check_nginx.sh脚本。这个脚本至关重要,它用于探测Nginx是否真的正常工作,避免VIP“僵”在故障节点上。bash
#!/bin/bash # 1. 尝试访问Nginx的健康检查接口,超时3秒,失败则返回非0 if ! curl -f -s --connect-timeout 3 http://127.0.0.1/healthz > /dev/null 2>&1; then # 2. 健康检查失败,尝试重启Nginx systemctl restart nginx sleep 2 # 3. 再次检查,如果还是失败,则停止本机的Keepalived服务,触发VIP漂移 if ! curl -f -s --connect-timeout 3 http://127.0.0.1/healthz > /dev/null 2>&1; then systemctl stop keepalived exit 1 fi fi exit 0这个脚本的逻辑是:先检查Nginx健康状态,如果失败就尝试重启Nginx,重启后再检查一次,如果仍然失败,就停止本机的Keepalived服务,让VIP漂移到备机。
-
赋予脚本执行权限:
bash
chmod +x /etc/keepalived/check_nginx.sh
-
准备Nginx健康检查端点:
为了让上述脚本能进行可靠的HTTP检查,你需要在Nginx配置中添加一个专用的健康检查端点。nginx
# 在 nginx.conf 的 server 块中添加 location /healthz { access_log off; return 200 "healthy\n"; add_header Content-Type text/plain; }配置完成后,使用
nginx -t检查语法,并用nginx -s reload重新加载配置。你也可以通过curl http://127.0.0.1/healthz来验证是否能正常返回。
⚙️ 2. 配置Keepalived
接下来,分别配置两台服务器的Keepalived主配置文件/etc/keepalived/keepalived.conf。注意:两个文件的大部分内容相同,仅有state、priority和router_id有差异。
主服务器配置 (192.168.1.10)
bash
global_defs {
router_id NGINX_MASTER # 主服务器的标识
}
# 定义健康检查脚本及其参数
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2 # 每2秒执行一次脚本
weight -5 # 如果脚本失败,当前节点优先级减少5
}
# 定义VRRP实例
vrrp_instance VI_1 {
state MASTER # 初始角色为MASTER
interface eth0 # 替换为你的网卡名,如eth0, ens33
virtual_router_id 51 # 虚拟路由ID,主备必须一致
priority 101 # 优先级,高于备节点
advert_int 1 # 组播心跳间隔,单位秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24 dev eth0 # VIP及绑定的网卡
}
track_script {
chk_nginx # 引用健康检查脚本
}
}
备服务器配置 (192.168.1.11)
bash
global_defs {
router_id NGINX_BACKUP # 备服务器的标识
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
}
vrrp_instance VI_1 {
state BACKUP # 初始角色为BACKUP
interface eth0 # 替换为你的网卡名
virtual_router_id 51 # 与主服务器保持一致
priority 100 # 优先级低于主服务器
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
chk_nginx
}
}
🚀 3. 启动服务并验证
配置完成后,按以下步骤启动并验证你的高可用集群。
-
启动服务:
在两台服务器上分别执行以下命令,先启动Nginx,再启动Keepalived。bash
systemctl start nginx systemctl start keepalived
如果一切正常,VIP会浮动在主服务器上。你可以分别在主备服务器上执行
ip addr show或ip a来查看VIP的绑定情况。 -
模拟故障切换:
为了验证高可用是否生效,可以强制停止主服务器的Keepalived服务,模拟主节点故障。bash
# 在主服务器上执行,模拟故障 systemctl stop keepalived
执行后,你应该会观察到:
-
主服务器的VIP被释放。
-
约3秒后(取决于
advert_int和超时时间),备服务器的VIP被绑定,服务恢复正常。 -
你可以通过
curl -I http://192.168.1.100/healthz持续测试,观察中断时间。
-
📝 关键配置详解
为了让配置更清晰,下表说明了几个核心参数的作用:
| 配置项 | 作用 | 设置建议 |
|---|---|---|
state |
指定节点的初始角色。 | MASTER(主) / BACKUP(备) |
priority |
用于选举Master,数值高的节点获胜。 | 主 > 备,建议差值大于weight的绝对值 |
weight |
当track_script脚本失败时,当前节点优先级的增减量。 |
绝对值小于主备priority的差值 |
interval |
执行健康检查脚本的频率(秒)。 | 结合业务SLA设置,一般为2-5秒 |
advert_int |
VRRP心跳包的发送间隔(秒)。 | 减小此值可加快切换速度,一般为1秒 |
nopreempt |
非抢占模式。 | 同时设置state BACKUP和nopreempt可防止主节点恢复后立即抢回VI |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)