开发者
openEuler 高可用 VIP 故障转移集群
openEuler 高可用 VIP 故障转移集群
发表于2025/12/22
1380

在关键业务系统中,单点故障可能导致服务中断,影响用户体验甚至造成经济损失。Keepalived 是一个基于 VRRP(Virtual Router Redundancy Protocol)协议的开源高可用解决方案,可实现双机或多机之间的虚拟 IP(VIP)自动漂移,保障服务连续性。openEuler 22.03 LTS 完整支持 Keepalived,并可与 HAProxy、Nginx、数据库等服务无缝集成。本文将演示如何在两台 openEuler 22.03 LTS 主机上部署 Keepalived,构建一个主备高可用集群,当主节点故障时,VIP 自动切换至备用节点。


一、环境说明

  • 主节点(Master)
    • 主机名:node1
    • IP 地址:192.168.160.11
    • 角色:默认持有 VIP
  • 备节点(Backup)
    • 主机名:node2
    • IP 地址:192.168.160.12
    • 角色:主节点故障时接管 VIP
  • 虚拟 IP(VIP)192.168.160.100
  • 测试服务:Nginx(用于验证 VIP 切换后服务可用)
  • 网络要求:两节点二层互通,允许 VRRP 多播(或单播)

注意:若在云平台(如华为云、阿里云)部署,需使用单播模式(因多播通常被禁用)。


二、在两节点上安装 Keepalived 与 Nginx

sudo dnf install -y keepalived nginx

启动 Nginx 并设置首页标识:

# node1
echo "<h1>Welcome to Node1 (Master)</h1>" | sudo tee /usr/share/nginx/html/index.html

# node2
echo "<h1>Welcome to Node2 (Backup)</h1>" | sudo tee /usr/share/nginx/html/index.html

sudo systemctl enable --now nginx

确保可通过各自 IP 访问网页。


三、配置 Keepalived(主节点 node1)

编辑配置文件 /etc/keepalived/keepalived.conf

sudo vi /etc/keepalived/keepalived.conf

内容如下(使用单播模式,兼容云环境):

global_defs {
    router_id NODE1
    enable_script_security
}

vrrp_script chk_nginx {
    script "/usr/bin/pgrep -x nginx"
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0                 # 替换为实际网卡名(如 ens33)
    virtual_router_id 51           # 主备必须一致
    priority 100                   # 主 > 备
    advert_int 1

    # 使用单播通信(避免依赖多播)
    unicast_src_ip 192.168.160.11
    unicast_peer {
        192.168.160.12
    }

    authentication {
        auth_type PASS
        auth_pass MyVrrpPass123!
    }

    virtual_ipaddress {
        192.168.160.100/24
    }

    track_script {
        chk_nginx
    }
}

获取网卡名:ip a,常见为 eth0ens33enp0s3 等。


四、配置 Keepalived(备节点 node2)

配置几乎相同,仅修改以下字段:

global_defs {
    router_id NODE2
    enable_script_security
}

vrrp_script chk_nginx {
    script "/usr/bin/pgrep -x nginx"
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90                    # 必须低于主节点
    advert_int 1

    unicast_src_ip 192.168.160.12
    unicast_peer {
        192.168.160.11
    }

    authentication {
        auth_type PASS
        auth_pass MyVrrpPass123!   # 必须与主节点一致
    }

    virtual_ipaddress {
        192.168.160.100/24
    }

    track_script {
        chk_nginx
    }
}

五、启动 Keepalived 服务

在两节点上执行:

sudo systemctl enable --now keepalived

验证 VIP 是否绑定到主节点:

ip addr show eth0 | grep 192.168.160.100

应仅在 node1 上显示该 VIP。


六、测试高可用故障转移

  1. 正常访问 VIP
curl http://192.168.160.100
# 返回:Welcome to Node1 (Master)
  1. 模拟主节点故障(在 node1 上停止 Nginx):
sudo systemctl stop nginx

Keepalived 检测到 Nginx 进程消失(chk_nginx 脚本失败),将降低优先级(100 → 95),低于备节点(90 → 实际仍为 90,但主已降权),触发 VIP 漂移。

  1. 再次访问 VIP
curl http://192.168.160.100
# 返回:Welcome to Node2 (Backup)
  1. 恢复主节点
# 在 node1 上重启 Nginx
sudo systemctl start nginx

由于主节点优先级恢复为 100 &gt; 90,VIP 将自动切回 node1(抢占模式默认启用)。


七、防火墙与 SELinux 注意事项

  • 防火墙:VRRP 使用协议号 112(非 TCP/UDP),需放行:
sudo firewall-cmd --permanent --add-protocol=vrrp
sudo firewall-cmd --reload
  • SELinux:若启用,需允许脚本执行(或设为 permissive 模式测试):
sudo setsebool -P authlogin_nsswitch_use_ldap 1  # 通常无需特殊策略
# 或临时禁用:sudo setenforce 0(不推荐生产)

八、日志监控

查看 Keepalived 日志:

sudo journalctl -u keepalived -f

关键日志示例:

  • VRRP_Instance(VI_1) Transition to MASTER STATE
  • VRRP_Instance(VI_1) Entering BACKUP STATE
  • VRRP_Script(chk_nginx) failed

九、生产环境建议

  • 健康检查增强:除进程检查外,可增加端口探测(如 curl -f http://localhost);
  • 非抢占模式:若不希望主恢复后立即抢回 VIP,可在主节点配置 nopreempt
  • 多 VIP 支持:一个 Keepalived 实例可管理多个 virtual_ipaddress
  • 与 HAProxy 集成:将 VIP 绑定到 HAProxy 前端,实现“高可用 + 负载均衡”双保险。
收藏举报
Level 1
0
帖子
0
粉丝
0
获赞