Keepalived + Nginx 实现高可用

安装 Keepalived

bash 复制代码
yum install -y keepalived

编辑配置文件

bash 复制代码
vi /etc/keepalived/keepalived.conf

(1)编辑 MASTER(主)节点配置文件

bash 复制代码
! Configuration File for keepalived

# 全局配置
global_defs {
   # 路由ID,不能重复,通常为 hostname
   router_id 192.168.1.116
}

# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
    # 检测 nginx 状态的脚本路径
    script "/etc/keepalived/nginx_check.sh"
    # #每2秒运行一次上面的脚本
    interval 2
    # 失败一次,将自己的优先级-20,如果MASTER的priority=100,BACKUP的priority=70
    # 那么MASTER要失败2次后变为60,低于BACKUP的70,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER
    weight -20
}

# 定义实例
vrrp_instance VI_1 {
    # 可选值为 MASTER 或 BACKUP
    state MASTER
    # 本机IP地址所在网卡名称,因为使用bond0做了双网卡绑定,所以此处配置bond0
    interface bond0
    # 虚拟路由ID,MASTER和BACKUP必须一致。这里遇到过坑,局域网内还有一套独立的Keepalived集群如果virtual_router_id值相同会冲突。
    # 同一个集群内的两台机器必须相同,但是不同的集群virtual_router_id值不能相同,如果使用了相同的virtual_router_id,它们会被视为同一个集群的成员。
    virtual_router_id 57
    # 定义优先级,数字越大优先级越高,MASTER的优先级必须大于BACKUP的优先级
    priority 100
    # 设置MASTER与BACKUP负载均衡之间同步检测的时间间隔,单位(秒)
    advert_int 1
    # 设置验证类型和密码,两个节点必须一致
    authentication {
        # 认证方式,此处PASS表示为密码
        auth_type PASS
        # 设置6位随机密码
        auth_pass 123456
    }
    # 配置浮动IP地址
    virtual_ipaddress {
        192.168.1.26
    }
    # 执行脚本
    track_script {
        # 对应vrrp_script配置的脚本
        chk_nginx
    }
}

(2)编辑 BACKUP(备)节点配置文件

bash 复制代码
! Configuration File for keepalived

# 全局配置
global_defs {
   # 路由ID,不能重复,通常为 hostname
   router_id 192.168.1.117
}

# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
    # 检测 nginx 状态的脚本路径
    script "/etc/keepalived/nginx_check.sh"
    # #每2秒运行一次上面的脚本 pwd
    interval 2
    # 失败一次,将自己的优先级-20,如果MASTER的priority=100,BACKUP的priority=70
    # 那么MASTER要失败2次后变为60,低于BACKUP的70,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER
    weight -20
}

# 定义实例
vrrp_instance VI_1 {
    # 可选值为 MASTER 或 BACKUP
    state BACKUP
    # 本机IP地址所在网卡名称,因为使用bond0做了双网卡绑定,所以此处配置bond0
    interface bond0
    # 虚拟路由ID,MASTER和BACKUP必须一致。这里遇到过坑,局域网内还有一套独立的Keepalived集群如果virtual_router_id值相同会冲突。
    # 同一个集群内的两台机器必须相同,但是不同的集群virtual_router_id值不能相同,如果使用了相同的virtual_router_id,它们会被视为同一个集群的成员。
    virtual_router_id 57
    # 定义优先级,数字越大优先级越高,MASTER的优先级必须大于BACKUP的优先级
    priority 90
    # 设置MASTER与BACKUP负载均衡之间同步检测的时间间隔,单位(秒)
    advert_int 1
    # 设置验证类型和密码,两个节点必须一致
    authentication {
        # 认证方式,此处PASS表示为密码
        auth_type PASS
        # 设置6位随机密码
        auth_pass 123456
    }
    # 配置浮动IP地址
    virtual_ipaddress {
        192.168.1.26
    }
    # 执行脚本
    track_script {
        # 对应vrrp_script配置的脚本
        chk_nginx
    }
}

(3) 编写 Nginx 状态检测脚本

bash 复制代码
vi /etc/keepalived/nginx_check.sh

这里换成其他组件,比如mysql 修改为 pgrep -c mysql 即可。

bash 复制代码
#!/bin/bash
# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
# 返回0(表示成功),返回非0值(表示失败)
# 这条命令是统计nginx进程个数
count=$(pgrep -cx nginx)
if [ "$count" -eq 0 ]
then
    echo 'nginx server is died'
    exit 1
else
    echo 'nginx server is running'
    exit 0
fi

给脚本添加执行权限

bash 复制代码
chmod +x /etc/keepalived/nginx_check.sh

(5) 启动 Keepalived

bash 复制代码
# 启动
systemctl start keepalived.service
# 重启
systemctl restart keepalived.service
# 停止
systemctl stop keepalived.service
# 查看运行状态
systemctl status keepalived
# 查看运行进程
ps -ef|grep keepalived
相关推荐
胡志辉3 小时前
Nginx CVE‑2026‑42945:隐藏18年高危漏洞被曝光(附解决方案)
前端·后端·nginx
风曦Kisaki4 小时前
# Linux运维Day01:Nginx基础
linux·运维·nginx
Only丿阿海5 小时前
当运维与AI结合 — 用 AI Agent 去维护 Nginx
运维·人工智能·nginx·agent·agent4j
养肥胖虎15 小时前
Docker学习笔记:后端、数据库和反向代理怎么一起跑起来
后端·nginx·docker·postgresql·go·部署
树下水月16 小时前
文件分片上传接口(Easyswoole)被nginx拦截,并返回状态码400和408的抓包排查过程
运维·nginx
nashane1 天前
HarmonyOS 6学习:解决无限循环动画被打断后“消失“的诡异问题
运维·nginx·harmonyos 5
taocarts_bidfans1 天前
Taoify与Redis、Nginx集成实战:提升跨境独立站性能与并发能力
数据库·redis·nginx·跨境电商·独立站
bug攻城狮1 天前
Nginx在前后端分离中的作用对比
运维·nginx
手揽回忆怎么睡1 天前
京东云Ubuntu22..04安装jdk21、MySQL8、nginx
运维·nginx·京东云
SPC的存折1 天前
12、Ingress-Nginx 全局超时配置及生效方式
运维·nginx·云原生·kubernetes