1. Keepalived高可用集群实战指南
作为运维工程师,服务器高可用性(HA)是保障业务连续性的基础能力。Keepalived作为轻量级高可用解决方案,通过VRRP协议实现虚拟IP(VIP)漂移,在主机故障时自动切换到备机。我在金融行业核心系统运维中,曾用Keepalived为支付网关构建高可用集群,平稳度过多次硬件故障。下面分享从安装到调优的全套实战经验。
2. 环境准备与基础概念
2.1 硬件与网络要求
实施前需确保:
- 至少两台同构服务器(建议配置完全一致)
- 千兆及以上网络互联
- 交换机端口开启组播支持(VRRP依赖组播通信)
- 防火墙开放VRRP协议(IP协议号112)
生产环境中遇到过因交换机未开启IGMP snooping导致VRRP报文被丢弃的案例,建议提前验证组播连通性。
2.2 Keepalived工作原理图解
+----------------+ +----------------+ | Master Node |<----->| Backup Node | | (Priority 100) | | (Priority 50) | +-------+--------+ +--------+-------+ | | | VIP 172.24.174.48 | +------------+------------+ | +------+------+ | Client | +-------------+VRRP协议通过多播地址224.0.0.18定期发送通告报文。当备份节点连续3个间隔未收到主节点通告时,会发起选举接管VIP。
3. 安装与初始化配置
3.1 多平台安装方案
3.1.1 标准仓库安装
# Ubuntu/Debian sudo apt update sudo apt install -y keepalived # CentOS/RHEL 7+ sudo yum install -y keepalived # openSUSE sudo zypper in keepalived3.1.2 源码编译安装
当需要特定版本或自定义功能时:
wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz tar xzf keepalived-2.2.4.tar.gz cd keepalived-2.2.4 ./configure --prefix=/usr/local/keepalived \ --with-systemdsystemunitdir=/usr/lib/systemd/system make -j$(nproc) sudo make install编译参数说明:
--with-init=systemd生成systemd单元文件--enable-snmp启用SNMP监控支持--enable-dbus启用DBus接口
3.2 服务管理配置
# 创建配置目录(源码安装时需要) sudo mkdir -p /etc/keepalived # 生成示例配置 sudo cp /usr/share/doc/keepalived/samples/keepalived.conf.* /etc/keepalived/ # 设置开机自启 sudo systemctl enable --now keepalived4. 核心配置详解
4.1 主备节点配置对比
| 参数项 | Master节点 | Backup节点 | 说明 |
|---|---|---|---|
| state | MASTER | BACKUP | 初始状态声明 |
| priority | 100 | 50 | 选举权重值 |
| advert_int | 1 | 1 | 心跳间隔(秒) |
| virtual_router_id | 51 | 51 | 必须一致的集群标识 |
| auth_pass | 1234 | 1234 | 认证密码 |
4.2 完整配置示例
主节点配置 (/etc/keepalived/keepalived.conf)
global_defs { router_id LVS_DEVEL # 唯一标识符 script_user root # 执行脚本的用户 enable_script_security } vrrp_script chk_nginx { script "/usr/bin/killall -0 nginx" # 进程存活检测 interval 2 # 检测间隔 weight -20 # 检测失败时降低的优先级 fall 2 # 连续失败次数 rise 2 # 连续成功次数 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass d0ntH4ckM3 } virtual_ipaddress { 172.24.174.48/24 dev eth0 label eth0:1 } track_script { chk_nginx # 关联健康检查脚本 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }备节点配置差异点
vrrp_instance VI_1 { state BACKUP priority 90 # 低于主节点 # 其他参数与主节点保持一致 }4.3 高级配置技巧
多VIP配置:单个实例支持多个VIP
virtual_ipaddress { 172.24.174.48/24 192.168.1.100/24 }抢占模式控制:
nopreempt # 禁止备节点抢占VIP preempt_delay 300 # 抢占等待时间(秒)网络接口绑定:
interface eth0:1 # 指定子接口 use_vmac # 使用虚拟MAC地址
5. 健康检查与故障转移
5.1 进程级健康检查
vrrp_script chk_httpd { script "/usr/bin/curl -s -o /dev/null -w '%{http_code}' http://localhost | grep 200" interval 3 timeout 2 rise 1 fall 2 user nobody }5.2 TCP端口检查
vrrp_script chk_mysql { script "/usr/bin/nc -z 127.0.0.1 3306" interval 5 weight -10 }5.3 自定义脚本通知
notify_master "/path/to/script.sh master 172.24.174.48" notify_backup "/path/to/script.sh backup 172.24.174.48" notify_fault "/path/to/script.sh fault 172.24.174.48"示例通知脚本:
#!/bin/bash case $1 in master) logger -t keepalived "切换为MASTER状态,VIP: $2" systemctl restart haproxy ;; backup) logger -t keepalived "切换为BACKUP状态" ;; fault) logger -t keepalived "进入FAULT状态" ;; esac6. 运维监控与排错
6.1 状态监控命令
# 查看VIP绑定状态 ip addr show eth0 # 检查VRRP通信 tcpdump -i eth0 vrrp -n # 查看选举日志 journalctl -u keepalived -f6.2 常见问题排查
问题1:VIP无法漂移
现象:主节点宕机后备节点未接管VIP
排查步骤:
- 检查备节点
keepalived服务状态 - 使用
tcpdump验证VRRP报文是否可达 - 确认防火墙未阻断组播通信
- 检查
virtual_router_id是否一致
问题2:脑裂现象
现象:两端同时持有VIP
解决方案:
- 配置
nopreempt避免反复切换 - 调整
advert_int和fall参数 - 添加第三方仲裁脚本
6.3 性能优化建议
心跳间隔调整:
advert_int 3 # 高负载环境下适当增大间隔日志级别控制:
global_defs { log_local7 # 使用syslog facility log_level info # 生产环境建议notice }资源限制:
vrrp_higher_prio_send_advert # 仅高优先级节点发送通告
7. 生产环境最佳实践
7.1 安全加固措施
密码加密:
auth_pass $(openssl rand -base64 12) # 生成随机密码权限控制:
chmod 600 /etc/keepalived/keepalived.conf chown root:root /etc/keepalived网络隔离:
vrrp_strict # 强制VRRP协议合规性检查
7.2 与LVS集成方案
virtual_server 172.24.174.48 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 192.168.1.10 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }7.3 多机房部署架构
vrrp_instance VI_2 { state MASTER interface eth1 # 跨机房专线接口 virtual_router_id 52 priority 100 virtual_ipaddress { 10.100.1.1/24 } unicast_peer { 10.100.1.2 # 对端机房网关地址 } }在金融行业某次容灾演练中,我们通过多机房Keepalived部署,实现了支付系统跨地域秒级切换,RTO控制在15秒内。关键点在于:
- 专线网络QoS保障
- 精确的优先级配置
- 完善的健康检查机制