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"

image

 

此时 vip 已经在node2上了。

==================================================================================

重新启动node1主机的nginx进程。

node1的日志

 此时VIP恢复到node1主机上了

 

centos 7.9的,停止nginx服务器执行脚本不成功。一直报错,查日志

journalctl -u keepalived | grep "chk_nginx"

image

解决方法:

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  参考

posted @ 2025-07-02 10:28  聆听城市喧哗  阅读(400)  评论(0)    收藏  举报