keepalived+nginx 的高可用集群搭建
一、keepalived软件介绍
1、概述
Keepalived 软件主要用于实现高可用性(High Availability)和负载均衡功能,它最初是为 Linux 系统设计的,通过管理虚拟 IP 地址(VIP)和健康检查来实现服务的故障转移。
2、keepalived的高可用原理
(1)Keepalived高可用服务通过VRRP协议实现故障切换。
(2)Keepalived采用VRRP竞选机制确定主备关系。
(3)在Keepalived服务组中,仅Master服务器持续发送VRRP组播包(或单播包)。当备机无法接收到主机的广播包时,将自动启动相关服务接管资源。
二、keepalived+nginx 高可用集群搭建
系统“Rocky Linux release 9.5
1、主机清单
| 主机名 | IP | 主备 |
| node1 | 172.21.118.8/24 | master |
| node2 | 172.21.118.9/24 | backup |
2、关闭防火墙
两台主机都操作
systemctl stop firewalld
systemctl disable firewalld
如果开启了防火墙必须放开keepalived之间的通信端口
firewall-cmd --zone=public --add-port=112/udp --permanent
firewall-cmd --permanent --add-protocol=vrrp --permanent
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p 112 -j ACCEPT
firewall-cmd --zone=public --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept' firewall-cmd --reload
firewall-cmd --reload
3、关闭selinux
两台主机都操作 注意:一定要关闭seliunx否则自动执行检测nginx脚本会报错
vi /etc/selinux/config SELINUX=disabled # 查看 selinux 状态 sestatus
4、配置主机名和hosts文件
两台主机都操作
vi /etc/hosts 172.21.118.8 node1 172.21.118.9 node2
5、nginx的安装与配置
两台主机都操作
vim /etc/yum.repos.d/nginx.repo
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
yum clean all
yum makecache
yum install -y nginx
systemctl start nginx 启动nginx systemctl stop nginx 停止nginx systemctl restart nginx 重启nginx nginx -s reload 重新加nginx配置 nginx -V 查看版本
6、keepalived快速安装
两台主机都操作
yum -y install keepalived
7、创建健康检查脚本
此脚本用于检查nginx进程是出现故障脚本必须返回退出状态码(Exit Code)
-
0:成功(服务正常,保持当前状态)。 -
非0:失败(服务异常,触发优先级调整或切换)
两台主机都操作
vim /etc/keepalived/check_nginx.sh
脚本
#!/bin/bash counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then systemctl restart nginx sleep 2 counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then systemctl stop keepalived fi fi
chmod 755 /etc/keepalived/check_nginx.sh
8、keepalived配置
node1主机操作
vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_MASTER # 主节点用LVS_MASTER,备节点必须改为LVS_BACKUP(唯一)
script_user root
log_file /var/log/keepalived.log
log_level INFO
# 新增:解决日志权限问题(避免启动警告)
enable_script_security
}
# 健康检查脚本配置(补充超时时间,避免脚本卡死)
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 5 # 检测间隔
weight -30 # 失败后优先级降低20
timeout 3 # 新增:脚本执行超时时间(秒)
fall 2 # 新增:连续3次失败判定为服务异常
rise 2 # 新增:连续2次成功判定为服务恢复
}
vrrp_instance VI_1 {
state MASTER
interface ens192 # 确认网卡名称正确(用ip addr核对)
virtual_router_id 58
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
# 核心修正:明确指定VIP绑定的网卡(解决unexpected ip number错误)
virtual_ipaddress {
172.21.118.10/24 dev ens192 # 补充dev ens192,和实例网卡一致
}
track_script {
chk_nginx
}
# 新增:主备切换时的ARP广播(确保VIP快速生效)
garp_master_delay 1
garp_master_refresh 5
}
node2主机操作
vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_MASTER # 主节点用LVS_MASTER,备节点必须改为LVS_BACKUP(唯一)
script_user root
log_file /var/log/keepalived.log
log_level INFO
# 新增:解决日志权限问题(避免启动警告)
enable_script_security
}
# 健康检查脚本配置(补充超时时间,避免脚本卡死)
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 5 # 检测间隔
weight -30 # 失败后优先级降低20
timeout 3 # 新增:脚本执行超时时间(秒)
fall 2 # 新增:连续3次失败判定为服务异常
rise 2 # 新增:连续2次成功判定为服务恢复
}
vrrp_instance VI_1 {
state BACKUP
interface ens192 # 确认网卡名称正确(用ip addr核对)
virtual_router_id 58
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
# 核心修正:明确指定VIP绑定的网卡(解决unexpected ip number错误)
virtual_ipaddress {
172.21.118.10/24 dev ens192 # 补充dev ens192,和实例网卡一致
}
track_script {
chk_nginx
}
# 新增:主备切换时的ARP广播(确保VIP快速生效)
garp_master_delay 1
garp_master_refresh 5
}
9、启动keepalived
两台主机都操作
systemctl start keepalived
systemctl enable keepalived
# 查看keepalived是否启动
systemctl status keepalived
# 查看是否有浮动ip
ip a
三、keepalived+nginx 故障模拟
1、环境确认
两台主机都操作
# 确认nginx进程成功启动 pgrep nginx # 确认keepalived服务成功启动 systemctl status keepalived # 找到浮动ip 172.21.118.10 所在主机 ip a |grep 172.21.118.10
2、制造nginx下线
systemctl stop nginx
3、查看日志变化
node1 主机的脚本检测到nginx下线,journalctl -u keepalived -f 观察日志,脚本返回值为 1,表示检测的进程异常。降低优先级,进入backup状态。

node1主机当(优先级高于80)收到来自 172.21.118.8 的低优先级通告。
连续 3 次未收到合法通告,当前节点晋升为 master,开始接管 VIP。向网络发送免费 ARP,宣告 VIP归属。

查看keepalived执行检测nginx服务脚本日志
journalctl -u keepalived | grep "chk_nginx"

此时 vip 已经在node2上了。
==================================================================================
重新启动node1主机的nginx进程。
node1的日志

此时VIP恢复到node1主机上了
centos 7.9的,停止nginx服务器执行脚本不成功。一直报错,查日志
journalctl -u keepalived | grep "chk_nginx"

解决方法:
keeplived配置需要添加一条enable_script_security # 开启脚本安全检测
global_defs {
router_id LVS_MASTER # 主节点用LVS_MASTER,备节点必须改为LVS_BACKUP(唯一)
script_user root #指定脚本执行用户
enable_script_security #开启脚本安全检测
https://blog.csdn.net/dgfdhgghd/article/details/127328189 参考
本文来自博客园,作者:聆听城市喧哗,转载请注明原文链接:https://www.cnblogs.com/fzhelpdesk/p/18961084

浙公网安备 33010602011771号