【高可用】Keepalived + Nginx │ 两套(主 + 备)解决nginx单点问题。(用nginx负载两套服务时,如果nginx宕机会造成后续服务不可达,失去高可用性)

       

一、核心原理:VRRP 协议

Keepalived 的高可用功能核心是 VRRP 协议

  • VRRP 作用:在一组服务器之间选举一个“主”节点来承载某个虚拟 IP(VIP),当主节点故障时,VIP 会自动漂移到备节点,确保服务地址不变,客户端访问不中断。

  • VIP:虚拟 IP 是客户端连接的目标 IP,后端由哪个节点响应是由 VRRP 决定的。

2.流程示意:

        客户端请求
            │
            ▼
       VIP:192.168.1.100
     ┌────────────────────┐
     │ Keepalived + Nginx │ ← 两套(主 + 备)
     └────────────────────┘
         │        │
   ┌─────┘        └─────┐
   ▼                    ▼
Web1 (10.0.0.1)     Web2 (10.0.0.2)
[应用服务]          [应用服务]

二、角色划分

  • MASTER(主)节点:正常工作时,绑定 VIP 并对外提供服务。

  • BACKUP(备)节点:通过心跳监测 MASTER 状态,一旦发现主不可达,就接管 VIP 成为新的 MASTER。


🔁 三、Keepalived 高可用机制详解

1. 状态监控机制
  • Keepalived 在 MASTER 和 BACKUP 之间使用 VRRP 发送 多播心跳包(默认每秒一次)。

  • 若 BACKUP 在设定时间内未收到心跳包(比如 3 次),则认为 MASTER 宕机。

  • 之后,BACKUP 自动将 VIP 添加到本地网卡并接管服务。

2. 优先级机制
  • 每个节点配置一个 priority(优先级),数值越大,优先级越高。

  • 如果两个节点都在线,优先级高的节点将成为 MASTER。

  • 可通过 nopreempt 控制是否自动抢占 VIP。

3. 健康检查
  • Keepalived 支持通过 vrrp_script 定义脚本定期检测服务是否健康(如检测 Nginx、LVS 端口是否存活)。

  • 检测失败会降低节点优先级,从而触发主备切换。

vrrp_script chk_nginx { script "/etc/keepalived/chk_nginx.sh" interval 2 weight -10 }


💡 四、VIP 漂移(虚拟IP漂移)

当 MASTER 节点失效,BACKUP 节点通过绑定 VIP 地址来接替服务,这就是“VIP 漂移”机制:

  • 自动将 VIP 添加到自己的网卡上(比如 eth0:1)

  • ARP 广播通知局域网中的其他设备更新 VIP 的 MAC 地址映射

📄 五、简单配置示例

一、环境准备

1. 服务器规划

角色IP 地址主机名VIP
主节点192.168.1.10nginx-master192.168.1.100
备用节点192.168.1.11nginx-backup192.168.1.100

2. 系统要求

  • 两台 Linux 服务器 (CentOS/RHEL 7/8 或 Ubuntu 18.04/20.04)

  • 确保服务器间网络互通

  • root 或 sudo 权限

二、安装配置步骤

1. 安装 Nginx (在两台服务器上执行)

CentOS:

sudo yum install epel-release -y
sudo yum install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

2. 安装 Keepalived (在两台服务器上执行)

CentOS:

sudo yum install keepalived -y

3. 配置 Keepalived

主节点配置 (192.168.1.10)

创建或编辑配置文件 /etc/keepalived/keepalived.conf:

conf

vrrp_script chk_nginx {
    script "/usr/bin/killall -0 nginx"  # 检查nginx进程是否存在
    interval 2                         # 每2秒检查一次
    weight 2                           # 优先级增加值
}

vrrp_instance VI_1 {
    state MASTER                       # 初始状态为MASTER
    interface ens33                    # 网卡名称(根据实际情况修改)
    virtual_router_id 51               # 虚拟路由ID,主备必须一致
    priority 100                       # 优先级(主节点高于备节点)
    advert_int 1                       # 检查间隔(秒)
    
    authentication {
        auth_type PASS
        auth_pass 1111                 # 认证密码,主备必须一致
    }
    
    virtual_ipaddress {
        192.168.1.100/24               # VIP地址
    }
    
    track_script {
        chk_nginx                      # 关联上面定义的检查脚本
    }
}
备用节点配置 (192.168.1.11)

创建或编辑配置文件 /etc/keepalived/keepalived.conf:

conf

vrrp_script chk_nginx {
    script "/usr/bin/killall -0 nginx"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP                       # 初始状态为BACKUP
    interface ens33                    # 网卡名称(根据实际情况修改)
    virtual_router_id 51               # 必须与主节点一致
    priority 90                        # 优先级低于主节点
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass 1111                 # 必须与主节点一致
    }
    
    virtual_ipaddress {
        192.168.1.100/24
    }
    
    track_script {
        chk_nginx
    }
}

4. 启动 Keepalived

在两台服务器上执行:

sudo systemctl enable keepalived
sudo systemctl start keepalived

5. 验证配置

  1. 检查 VIP 是否在主节点上:

    ip addr show ens33

    应该能看到 192.168.1.100

  2. 测试访问:

    curl http://192.168.1.100
  3. 模拟主节点故障:

    • 在主节点停止 Nginx:

      sudo systemctl stop nginx
    • 检查 VIP 是否自动漂移到备用节点

  4. 恢复主节点后,VIP 应该会自动切回主节点

三、高级配置选项

1. 邮件通知 (可选)

在 Keepalived 配置中添加:

conf

global_defs {
    notification_email {
        admin@example.com
    }
    notification_email_from keepalived@example.com
    smtp_server smtp.example.com
    smtp_connect_timeout 30
}

2. Nginx 健康检查脚本增强

创建更健壮的健康检查脚本 /usr/local/bin/check_nginx.sh:

bash

#!/bin/bash

if ! /usr/bin/killall -0 nginx; then
    systemctl restart nginx
    sleep 2
    if ! /usr/bin/killall -0 nginx; then
        systemctl stop keepalived
    fi
fi

然后修改 Keepalived 配置中的检查脚本:

conf

vrrp_script chk_nginx {
    script "/usr/local/bin/check_nginx.sh"
    interval 2
    weight 2
}

注意点: 如果配置了ssl证书  要把dns解析到虚ip上  此实例中dns地址为192.168.1.100

这有这样才能实现nginx的主主高可用    每个nginx在分发到多个服务上 实现负载均衡的业务高可用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值