Centos7.9环境下Keepalived高可用集群实战配置指南

张开发
2026/4/21 9:20:44 15 分钟阅读

分享文章

Centos7.9环境下Keepalived高可用集群实战配置指南
1. 环境准备与基础概念在CentOS 7.9系统上部署Keepalived高可用集群前我们需要先理解几个核心概念。简单来说Keepalived就像是个智能开关管理员当主服务器Master出现故障时它能自动把流量切换到备用服务器Backup上这个过程专业术语叫VIP漂移。我最早接触这个方案是在某次线上服务宕机事故后当时手动切换花了15分钟而用Keepalived可以实现秒级切换。准备两台CentOS 7.9服务器时建议采用最小化安装模式。我遇到过不少因为系统组件缺失导致的问题特别是开发工具包Development Tools这个组件的缺失。执行这个命令可以一次性安装所有基础依赖yum groupinstall Development Tools -y yum install openssl-devel net-snmp-devel libnl libnl-devel -y网络配置要特别注意两台服务器的网卡名称必须一致。曾经有次部署失败排查半天发现是主节点网卡叫ens33而从节点是eth0。可以通过ip addr命令查看网卡信息如果不一致需要修改网络配置文件。2. Keepalived安装实战2.1 在线安装方案对于能连接外网的环境yum安装是最快捷的方式。但要注意CentOS 7的默认仓库版本可能较旧我建议先更新仓库yum update -y yum install keepalived -y安装完成后别急着启动先备份默认配置文件是个好习惯cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak2.2 离线安装详解在生产环境中很多服务器不能连接外网。我整理了个离线安装包清单keepalived-2.2.8.tar.gzopenssl-devel-1.0.2k-26.el7.x86_64.rpmnet-snmp-devel-5.7.2-49.el7.x86_64.rpm编译安装时有个坑要注意如果遇到WARNING - this build will not support IPVS with IPv6警告说明libnl依赖没装全。我建议先执行rpm -ivh libnl-*.rpm --nodeps --force rpm -ivh libnl-devel-*.rpm --nodeps --force编译参数可以这样优化./configure --prefix/usr/local/keepalived --with-systemdsystemunitdir/usr/lib/systemd/system make make install这个参数会生成systemd服务文件方便用systemctl管理服务。3. 主从节点配置技巧3.1 主节点配置主节点的keepalived.conf配置有几个关键点需要注意。这是我优化过的配置模板global_defs { router_id LVS_MASTER # 建议用主机名角色命名 script_user root enable_script_security } vrrp_script chk_nginx { script /etc/keepalived/check_nginx.sh interval 2 weight -20 # 失败时降低优先级 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345678 # 建议用复杂密码 } virtual_ipaddress { 192.168.1.100/24 dev ens33 label ens33:1 } track_script { chk_nginx # 关联健康检查脚本 } }这里我增加了对Nginx的健康检查这是很多教程没提到的实用功能。创建检查脚本#!/bin/bash count$(ps -ef | grep nginx | grep -v grep | wc -l) if [ $count -eq 0 ]; then exit 1 else exit 0 fi记得给脚本执行权限chmod x /etc/keepalived/check_nginx.sh3.2 从节点配置差异从节点配置有三个关键区别state改为BACKUPpriority要比主节点低建议90router_id要唯一我建议把virtual_ipaddress的配置方式改成带子网掩码和标签的形式这样VIP切换更稳定。曾经遇到过VIP绑定不成功的情况后来发现是配置方式问题。4. 高级配置与故障排查4.1 非抢占模式配置生产环境我更推荐非抢占模式配置要点两台服务器都设置为BACKUP添加nopreempt参数优先级仍然要区分vrrp_instance VI_1 { state BACKUP nopreempt interface ens33 virtual_router_id 51 priority 100 # 主节点 ... }4.2 脑裂问题处理脑裂是最危险的故障我总结了几种处理方案防火墙配置推荐方案firewall-cmd --add-rich-rulerule protocol valuevrrp accept --permanent firewall-cmd --reload使用多播检测需要网络设备支持vrrp_instance VI_1 { ... mcast_src_ip 本机IP unicast_peer { 对端IP } }第三方仲裁方案最可靠vrrp_script chk_haproxy { script killall -0 haproxy interval 2 fall 2 rise 2 }4.3 日志分析技巧查看实时日志tail -f /var/log/messages | grep Keepalived常见错误分析IPVS: Cant initialize ipvs: 需要加载ip_vs模块VRRP_Instance(xxx) ignoring received advertisment... 虚拟路由ID冲突WARNING - script xxx is not executable 检查脚本权限5. 生产环境优化建议经过多个项目实践我总结了几条优化经验监控建议使用Prometheus监控Keepalived状态配置VIP漂移告警记录VIP切换历史性能调优vrrp_instance VI_1 { ... garp_master_delay 10 # 主节点延迟发送GARP garp_master_refresh 60 # 主节点刷新间隔 }安全加固修改默认配置文件权限为640使用复杂认证密码限制VRRP通信源IP多实例配置 对于需要多个VIP的场景可以配置多个vrrp_instance区块每个使用不同的virtual_router_id。最后提醒下配置完成后一定要做破坏性测试断网、关机、服务停止等各种异常场景都要模拟只有经过充分测试的高可用方案才是可靠的。我在实际项目中就遇到过测试不充分导致切换失败的情况后来养成了写测试用例的习惯。

更多文章