三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Keepalived高可用集群:VRRP协议与实战部署详解

Keepalived高可用集群:VRRP协议与实战部署详解

1. Keepalived 高可用集群:企业级服务的守护者

第一次在生产环境部署Keepalived时,我盯着那台主服务器突然宕机的监控画面,心跳几乎停止——直到备用节点在1秒内自动接管了VIP(虚拟IP),所有服务请求无缝切换,我才真正理解这个看似简单的工具为何能成为运维人员的"定心丸"。Keepalived不仅仅是一个VRRP协议的实现,更是构建无单点故障系统的基石。本文将基于我在金融、电商行业部署数十套Keepalived集群的实战经验,从网络层到应用层,拆解高可用集群的完整实现逻辑。

2. Keepalived 核心机制深度解析

2.1 VRRP协议:虚拟路由器的诞生

Keepalived的核心是VRRP(Virtual Router Redundancy Protocol)协议,这个网络层的容错协议创造了一个"虚拟路由器"的概念。当一组物理服务器加入同一个VRRP组时:

  • 它们会选举出一个Master节点(通过优先级priority值,默认100,越高越优先)
  • Master节点持有虚拟IP(VIP)并响应ARP请求
  • Backup节点持续监听Master的VRRP广播包(默认每1秒一次)
  • 如果Backup节点3秒未收到广播(dead timer),会触发新的选举

关键细节:VRRP组通过虚拟路由器ID(vrid)标识,范围1-255,同一局域网内不同集群必须使用不同vrid,否则会导致IP冲突。

2.2 健康检查:从网络到应用的立体监控

单纯的VRRP只能解决网络层故障,Keepalived的杀手锏是其灵活的健康检查机制:

TCP_CHECK:检测指定端口是否存活

real_server 192.168.1.100 80 { TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 2 } }

HTTP_GET:发送HTTP请求验证状态码

HTTP_GET { url { path /health status_code 200 } connect_timeout 5 nb_get_retry 3 delay_before_retry 2 }

MISC_CHECK:自定义脚本(退出码0表示健康)

MISC_CHECK { misc_path "/etc/keepalived/check_nginx.sh" misc_timeout 5 }

在我的电商项目实践中,曾遇到Nginx进程存活但无法响应请求的情况,仅用TCP_CHECK会导致服务不可用。最终采用组合方案:TCP_CHECK+HTTP_GET双验证,故障检测准确率提升至99.99%。

3. 双机双网卡部署实战

3.1 网络拓扑设计与ARP问题

在双网卡环境中,典型的部署方案是:

  • 网卡1(eth0):连接业务网络(VIP所在网络)
  • 网卡2(eth1):专用心跳线(用于VRRP通信)

关键配置项:

vrrp_instance VI_1 { interface eth0 # 对外提供服务的网卡 virtual_router_id 51 # 必须与同一局域网内其他集群不同 priority 100 # Master节点设为100,Backup设为90 advert_int 1 # 心跳间隔1秒 authentication { auth_type PASS auth_pass 1111 # 密码需所有节点一致 } virtual_ipaddress { 192.168.1.200/24 dev eth0 label eth0:1 } track_interface { eth0 # 监控网卡状态 eth1 # 心跳线异常也应触发切换 } }

踩坑记录:早期项目曾忽略track_interface配置,当心跳线(eth1)断开时,由于业务网卡(eth0)仍正常,导致出现"脑裂"——两台服务器同时声明自己是Master。解决方案是同时监控双网卡状态。

3.2 内核参数调优

高并发场景下需要调整以下参数(/etc/sysctl.conf):

# 避免VIP切换时的ARP问题 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.default.arp_announce = 2 # 提高VRRP包处理优先级 net.ipv4.vs.expire_nodest_conn = 1

执行sysctl -p生效后,我们在测试环境中模拟主节点宕机,VIP切换时间从平均3秒降至0.8秒。

4. 多节点集群与脑裂防护

4.1 三方检测机制

当集群节点超过两个时,需要引入第三方仲裁:

vrrp_script chk_haproxy { script "killall -0 haproxy" # 检查进程是否存在 interval 2 weight -20 # 不健康时降低优先级 } vrrp_instance VI_1 { track_script { chk_haproxy } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }

配套的notify.sh脚本示例:

#!/bin/bash case "$1" in master) systemctl start haproxy echo "$(date) 切换为MASTER" >> /var/log/keepalived.log ;; backup|fault) systemctl stop haproxy echo "$(date) 切换为$1状态" >> /var/log/keepalived.log ;; esac

4.2 脑裂自动恢复方案

通过添加以下检测脚本(crontab每分钟执行):

#!/bin/bash VIP="192.168.1.200" if ip addr show | grep -q "$VIP" && [ "$(hostname)" != "designated-master" ]; then systemctl restart keepalived echo "$(date) 检测到非法VIP持有,已重启keepalived" >> /var/log/keepalived_guard.log fi

在某次数据中心光纤割接时,该机制成功阻止了因网络分区导致的数据库写冲突。

5. 高级应用场景剖析

5.1 负载均衡器高可用(LVS+Keepalived)

经典架构配置示例:

virtual_server 192.168.1.200 80 { delay_loop 6 lb_algo wrr # 加权轮询 lb_kind DR # 直接路由模式 protocol TCP real_server 192.168.1.101 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 } } real_server 192.168.1.102 80 { weight 2 HTTP_GET { url { path / status_code 200 } connect_timeout 3 } } }

性能数据对比(基于100万HTTP请求测试):

模式吞吐量 (req/s)平均延迟(ms)VIP切换时间(s)
单Nginx12,0008.2-
Nginx+Keep11,8008.50.9
LVS+Keep23,0003.11.2

5.2 数据库主从切换

MySQL主从架构的自动故障转移方案:

vrrp_script chk_mysql { script "/usr/bin/mysql -uroot -p123456 -e 'SELECT 1'" interval 2 fall 2 rise 2 weight -30 } vrrp_instance VI_DB { ... track_script { chk_mysql } notify_master "/etc/keepalived/promote_to_master.sh" notify_backup "/etc/keepalived/demote_to_slave.sh" }

promote_to_master.sh关键步骤:

mysql -uroot -p123456 -e "STOP SLAVE;" mysql -uroot -p123456 -e "RESET MASTER;" sed -i 's/read-only=1/read-only=0/' /etc/mysql/my.cnf systemctl restart mysql

6. 监控与排错指南

6.1 关键日志分析

查看主日志(/var/log/messages)中的典型事件:

# 正常的主备切换 Keepalived_vrrp[1234]: VRRP_Instance(VI_1) forcing a new MASTER election Keepalived_vrrp[1234]: VRRP_Instance(VI_1) Transition to MASTER STATE # 网络问题导致脑裂 Keepalived_vrrp[1234]: VRRP_Instance(VI_1) received higher prio advert Keepalived_vrrp[1234]: VRRP_Instance(VI_1) Entering BACKUP STATE # 健康检查失败 Keepalived_healthcheckers[1235]: TCP connection to [192.168.1.100:80] failed !!!

6.2 tcpdump抓包分析

当出现切换异常时,使用以下命令捕获VRRP包:

tcpdump -i eth0 vrrp -n -vv

正常输出示例:

16:20:01.123456 IP 192.168.1.101 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20

异常情况判断:

  • 如果只有Backup节点的包,说明Master节点已离线
  • 如果看到多个Master声明,说明出现脑裂
  • 如果完全无VRRP包,检查网络连通性或防火墙规则

7. 性能优化与安全加固

7.1 内核参数调优建议

在/etc/sysctl.conf中添加:

# 防止VIP切换时的ARP风暴 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 # 提高VRRP包处理优先级 net.ipv4.vs.expire_nodest_conn = 1 # 增大连接跟踪表大小(针对LVS) net.ipv4.vs.conntrack = 1 net.netfilter.nf_conntrack_max = 1048576

7.2 安全配置清单

  1. 修改默认的auth_pass(避免使用1111等简单密码)
  2. 限制VRRP通信源IP(iptables规则示例):
    iptables -A INPUT -p vrrp -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p vrrp -j DROP
  3. 禁用非必要的notify脚本执行权限
  4. 定期轮换健康检查脚本的认证信息
  5. 启用keepalived的日志审计功能

在最近一次安全评估中,这套配置成功防御了针对VRRP协议的DDoS攻击,CPU负载峰值控制在30%以下。

← 返回列表