keepalived+nginx 的高可用集群搭建

一、keepalived软件介绍

1、概述
Keepalived 软件主要用于实现高可用性(High Availability)和负载均衡功能,它最初是为 Linux 系统设计的,通过管理虚拟 IP 地址(VIP)和健康检查来实现服务的故障转移。

2、keepalived的高可用原理
(1)Keepalived高可用服务通过VRRP协议实现故障切换。

(2)Keepalived采用VRRP竞选机制确定主备关系。

(3)在Keepalived服务组中,仅Master服务器持续发送VRRP组播包(或单播包)。当备机无法接收到主机的广播包时,将自动启动相关服务接管资源。

二、keepalived+nginx 高可用集群搭建

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

两台主机都操作

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
脚本1
脚本1:
#!/bin/bash
 
# 检查 Nginx 进程是否存在
if pgrep -x "nginx" >/dev/null; then
    exit 0  # Nginx 正常运行,返回 0
else
    exit 1  # Nginx 未运行,返回 1
fi 
推荐脚本2
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl kill keepalived
fi
chmod 755 /etc/keepalived/check_nginx.sh

 

8、keepalived配置

node1主机操作

vim /etc/keepalived/keepalived.conf
global_defs {
    router_id LVS_MASTER  # 唯一标识,建议不同节点不同名称
    script_user root   # 明确指定执行脚本的用户(如 root)
    log_file /var/log/keepalived.log  # 直接指定日志文件(需 Keepalived v2.0.0+)
    log_level INFO          # 日志级别:INFO、NOTICE、WARNING、ERR
 
}
 
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"  # 健康检查脚本路径
    interval 2   # 检测间隔(秒)
    weight -20   # 检测失败时优先级降低值
}
 
vrrp_instance VI_1 {
    state MASTER          # 主节点为 MASTER,备节点为 BACKUP
    interface ens33        # 网卡名称(需根据实际修改)
    virtual_router_id 51  # 虚拟路由 ID,主备必须一致(范围 0-255)
    priority 100          # 优先级(主节点 > 备节点)
    advert_int 1          # 心跳间隔(秒)
 
    authentication {
        auth_type PASS    # 认证方式
        auth_pass 123456   # 认证密码(主备一致)
    }
 
    virtual_ipaddress {
        17221.118.10./24  # 虚拟 IP(VIP)
    }
 
    track_script {
        chk_nginx           # 引用健康检查脚本
    }
}

node2主机操作

vim /etc/keepalived/keepalived.conf
global_defs {
    router_id LVS_BACKUP
    script_user root   # 明确指定执行脚本的用户(如 root)
    log_file /var/log/keepalived.log  # 直接指定日志文件(需 Keepalived v2.0.0+)
    log_level INFO          # 日志级别:INFO、NOTICE、WARNING、ERR
}
 
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"  # 健康检查脚本路径
    interval 2   # 检测间隔(秒)
    weight -20   # 检测失败时优先级降低值
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90           # 优先级低于主节点
    advert_int 1
 
    authentication {
        auth_type PASS
        auth_pass 123456
    }
 
    virtual_ipaddress {
        172.21.118.10/24
    }
 
    track_script {
        chk_nginx           # 引用健康检查脚本
    }
}
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归属。

 

此时 vip 已经在node2上了。

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

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

node1的日志

 此时VIP恢复到node1主机上了

 https://blog.csdn.net/dgfdhgghd/article/details/127328189  参考

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