Keepalived高可用全解析从原理到实战告别单点故障一篇文章掌握VRRP协议和Keepalived集群让服务7x24小时不间断运行前言想象一下你的网站流量很大部署了多台Web服务器前端用LVS做负载均衡。一切看起来很完美——直到某个深夜LVS服务器突然宕机了。所有用户都无法访问网站而你还在睡梦中。这就是单点故障的典型场景。负载均衡器本身成为了整个架构中最脆弱的一环。Keepalived正是为了解决这个问题而生的。它通过VRRP协议实现高可用让多台服务器共享一个虚拟IPVIP一台宕机后另一台自动接管用户几乎无感知。本文将从VRRP原理讲起涵盖Keepalived架构、配置文件详解、主备切换实验、脑裂问题与解决方案等核心内容让你全面掌握Keepalived高可用技术。一、HA集群能解决哪些问题1.1 HA集群的适用场景并不是所有服务都适合放入HA集群。在部署前需要弄清楚一个问题服务放到HA集群中可用性是否会增加服务类型放入HA集群的效果原因DNS、LDAP效果不大自带故障转移和负载均衡客户端可配置多个服务器RabbitMQ、Galera效果显著未自带Failover机制HA集群提供故障转移能力1.2 HA集群无法解决的问题应用程序bug导致崩溃即使配置HA集群应用同样会崩溃只是会转移到其他节点——但其他节点也存在相同bug网络架构故障集群本身正常但网络不可达客户端仍然无法访问因此部署HA集群时需要全链路考虑避免任何单点故障。二、Keepalived简介Keepalived是一个用C语言编写的路由软件主要目标是为Linux系统提供负载均衡和高可用性能力。2.1 Keepalived两大核心功能功能说明健康检查检测集群中各个服务节点的状态自动剔除故障节点VRRP实现通过虚拟路由冗余协议实现主备切换和高可用2.2 Keepalived检测层次Keepalived工作于TCP/IP参考模型的三层、四层、七层层级检测方式说明三层网络层ICMP协议Ping检测服务器是否存活四层传输层TCP端口检测检测服务端口是否正常如80、22七层应用层自定义脚本检测应用程序是否正常工作三、VRRP协议详解3.1 为什么需要VRRP在局域网中主机通常配置一个默认网关来访问外部网络。如果该网关设备发生故障所有主机的网络流量都会中断。传统解决方案是部署多个网关但这会引发IP地址冲突问题。VRRP既能实现网关备份又能解决多个网关之间的冲突。3.2 VRRP核心概念VRRPVirtual Router Redundancy Protocol虚拟路由器冗余协议通过将多台路由设备组合成一台虚拟路由器实现网关的高可用。概念说明VRRP路由器运行VRRP协议的路由器如R1、R2VRID虚拟路由器标识符同一VRRP组的设备使用相同VRID虚拟路由器由VRRP虚拟出来的逻辑设备非真实物理设备虚拟IP地址虚拟路由器的IP地址用户配置的网关地址虚拟MAC地址格式为0000-5e00-01xxxx为VRIDMaster路由器承担报文转发任务响应ARP请求Backup路由器侦听Master状态随时准备接管Priority优先级0-255值越大越优先3.3 VRRP报文格式VRRP只有一种报文——Advertisement报文基于组播方式发送目的地址为224.0.0.18。3.4 VRRP定时器定时器说明默认值ADVER_INTERVALMaster发送通告报文的时间周期1秒MASTER_DOWNBackup设备监听超时后切换为Master约3秒MASTER_DOWN计算公式MASTER_DOWN (3 × ADVER_INTERVAL) Skew_time Skew_time (256 - Priority) / 2563.5 VRRP主备选举过程场景1优先级不相等场景2优先级相等当优先级相等时比较接口IP地址IP地址大的成为Master。场景3IP地址拥有者当某台路由器的接口IP地址与虚拟IP地址相同时该路由器无条件成为Master优先级自动为255。3.6 Master与Backup状态行为Master状态行为Backup状态行为定期发送VRRP通告报文接收Master的VRRP报文以虚拟MAC响应ARP请求不对虚拟IP的ARP请求做响应转发目的MAC为虚拟MAC的IP报文丢弃目的MAC为虚拟MAC的IP报文允许ping通虚拟IP丢弃目的IP为虚拟IP的报文四、Keepalived实践搭建高可用Web集群4.1 环境规划主机名IP地址角色web1.shep.cloud10.1.8.11Master主节点web2.shep.cloud10.1.8.12Backup备节点client1.shep.cloud10.1.8.21客户端4.2 基础配置# web1配置[rootweb1 ~]hostnamectl set-hostname web1.shep.cloud[rootweb1 ~]nmcli connection modify ens33 ipv4.method manual\ipv4.addresses10.1.8.11/24\ipv4.gateway10.1.8.2\ipv4.dns223.5.5.5\autoconnectyes[rootweb1 ~]nmcli connection up ens33# web2配置同理[rootweb2 ~]hostnamectl set-hostname web2.shep.cloud[rootweb2 ~]nmcli connection modify ens33 ipv4.method manual\ipv4.addresses10.1.8.12/24\ipv4.gateway10.1.8.2\ipv4.dns223.5.5.5\autoconnectyes[rootweb2 ~]nmcli connection up ens334.3 部署Nginx服务# web1和web2都执行[rootweb{1,2}~]wget-O/etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo[rootweb{1,2}~]yuminstall-ynginx[rootweb{1,2}~]echowelcome to$(hostname)/usr/share/nginx/html/index.html[rootweb{1,2}~]systemctlenablenginx--now# 验证[rootclient1 ~]curl10.1.8.11 welcome to web1.shep.cloud[rootclient1 ~]curl10.1.8.12 welcome to web2.shep.cloud4.4 配置Keepalivedweb1Master节点[rootweb1 ~]yuminstall-ykeepalived[rootweb1 ~]cp/etc/keepalived/keepalived.conf{,.ori}[rootweb1 ~]vim/etc/keepalived/keepalived.conf! Configuration File for keepalived global_defs { router_id web1 } vrrp_instance nginx { state MASTER interface ens33 virtual_router_id 51 priority 110 advert_int 1 authentication { auth_type PASS auth_pass shep123 } virtual_ipaddress { 10.1.8.100/24 } }[rootweb1 ~]systemctlenablekeepalived--nowweb2Backup节点[rootweb2 ~]yuminstall-ykeepalived[rootweb2 ~]cp/etc/keepalived/keepalived.conf{,.ori}[rootweb2 ~]vim/etc/keepalived/keepalived.conf! Configuration File for keepalived global_defs { router_id web2 } vrrp_instance nginx { state BACKUP interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass shep123 } virtual_ipaddress { 10.1.8.100/24 } }[rootweb2 ~]systemctlenablekeepalived--now4.5 配置文件参数说明参数说明router_id路由器标识集群中各节点必须不同state初始角色MASTER/BACKUP实际由优先级决定interfaceVIP绑定的网卡接口virtual_router_id虚拟路由器ID1-255同一集群必须相同priority优先级值越大越优先advert_int心跳通告间隔秒authentication心跳认证凭据同一集群必须相同virtual_ipaddress虚拟VIP地址列表4.6 验证高可用# 查看VIP在哪台机器上[rootweb1 ~]ip-bra show ens33 ens33 UP10.1.8.11/2410.1.8.100/24 fe80::.../64# ✅ VIP在web1上[rootweb2 ~]ip-bra show ens33 ens33 UP10.1.8.12/24 fe80::.../64# ❌ web2没有VIP# 客户端访问[rootclient1 ~]curl10.1.8.100 welcome to web1.shep.cloud# 模拟web1故障停止keepalived[rootweb1 ~]systemctl stop keepalived# VIP切换到web2[rootweb2 ~]ip-bra show ens33 ens33 UP10.1.8.12/2410.1.8.100/24 fe80::.../64# 客户端访问无感知切换[rootclient1 ~]curl10.1.8.100 welcome to web2.shep.cloud# 恢复web1[rootweb1 ~]systemctl start keepalived# VIP回到web1抢占模式[rootweb1 ~]ip-bra show ens33 ens33 UP10.1.8.11/2410.1.8.100/24 fe80::.../64五、Keepalived日志配置5.1 开启Debug日志[rootweb1 ~]vim/etc/sysconfig/keepalivedKEEPALIVED_OPTIONS-D -d -S 0参数说明参数含义-D后台守护进程模式默认-d开启Debug调试日志生产环境慎用日志量大-S 0使用syslog facility 0输出日志5.2 单独输出Keepalived日志[rootweb1 ~]vim/etc/rsyslog.d/keepalived.conf local0.* /var/log/keepalived.log[rootweb1 ~]systemctl restart rsyslog[rootweb1 ~]systemctl restart keepalived[rootweb1 ~]tail-f/var/log/keepalived.log六、多网卡心跳配置重要当服务器有多个网卡时必须指定心跳报文的源IP否则可能导致脑裂。vrrp_instance nginx { state MASTER interface ens36 mcast_src_ip 20.0.0.11 # 指定心跳组播报文的源IP virtual_router_id 51 priority 110 advert_int 1 authentication { auth_type PASS auth_pass shep123 } virtual_ipaddress { 10.1.1.10/24 } }⚠️如果不指定mcast_src_ipKeepalived可能从任意网卡发送心跳报文备机收不到VRRP包两台机器都会认为自己是Master产生脑裂七、脑裂问题与解决方案7.1 什么是脑裂在Keepalived高可用集群中脑裂Split-Brain是指主从节点之间因通信中断导致各自认为对方故障从而同时争抢虚拟IP引发集群状态混乱的现象。7.2 脑裂产生的原因原因说明网络问题主从节点间心跳线路故障、断网或延迟过高防火墙规则VRRP协议端口UDP 112被屏蔽资源耗尽CPU/内存耗尽无法响应心跳请求配置错误virtual_router_id、auth_pass等参数不一致7.3 脑裂的危害双节点同时持有VIP客户端请求混乱数据库等场景可能引发数据不一致双写冲突集群失去高可用意义甚至因资源竞争导致服务崩溃7.4 如何避免脑裂1. 增加心跳检测线路vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 track_interface { eth0 eth1 # 备用心跳线路 } }2. 启用VRRP认证authentication { auth_type PASS auth_pass shep123 }3. 防火墙放行VRRP协议[rootweb1 ~]firewall-cmd --add-protocolvrrp--permanent[rootweb1 ~]firewall-cmd--reload4. 部署第三方检测工具使用fence机制或脚本检测到脑裂时强制隔离异常节点vrrp_instance VI_1 { # ...其他配置 notify_master /etc/keepalived/check_split_brain.sh master notify_backup /etc/keepalived/check_split_brain.sh backup }5. 监控与告警通过Zabbix、Prometheus等工具监控Keepalived状态发现双主节点同时存在时及时告警。八、Keepalived LVS 联动配置Keepalived最初就是为LVS设计的可以在配置文件中直接管理LVS规则。! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.100 } } # LVS配置 virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 } real_server 192.168.201.101 443 { weight 1 } }参数说明delay_loop健康检查间隔秒lb_algo负载均衡算法rr/wrr/lc/wlc等lb_kindLVS模式NAT/DR/TUNpersistence_timeout持久连接超时时间秒protocol协议TCP/UDP/SCTPreal_server后端真实服务器配置写在最后本文从VRRP原理到Keepalived实战全面介绍了高可用集群的核心技术知识点核心内容VRRP协议虚拟路由器、Master选举、优先级机制Keepalived健康检查、VRRP实现、LVS联动主备切换状态转移、抢占模式、无缝切换脑裂问题产生原因、危害、解决方案日志配置Debug日志、独立日志文件 关键经验总结Keepalived的state只是初始状态实际Master由priority决定高优先级抢占多网卡环境务必配置mcast_src_ip否则可能因心跳发送错误导致脑裂同一集群的virtual_router_id和auth_pass必须一致生产环境慎开-ddebug模式日志量巨大配合健康检查脚本可实现对后端服务的精细监控核心命令速查# 安装yuminstall-ykeepalived# 配置文件/etc/keepalived/keepalived.conf# 服务管理systemctl start|stop|restart|status keepalived# VIP查看ip-bra show ens33ipaddr show ens33# 日志tail-f/var/log/keepalived.logtail-f/var/log/messages|grepKeepalived# 防火墙放行VRRPfirewall-cmd --add-protocolvrrp--permanentfirewall-cmd--reload跳发送错误导致脑裂3.同一集群的virtual_router_id和auth_pass必须一致4.生产环境慎开-ddebug模式日志量巨大5.配合健康检查脚本可实现对后端服务的精细监控核心命令速查# 安装yuminstall-ykeepalived# 配置文件/etc/keepalived/keepalived.conf# 服务管理systemctl start|stop|restart|status keepalived# VIP查看ip-bra show ens33ipaddr show ens33# 日志tail-f/var/log/keepalived.logtail-f/var/log/messages|grepKeepalived# 防火墙放行VRRPfirewall-cmd --add-protocolvrrp--permanentfirewall-cmd--reload 点点关注持续更新欢迎技术讨论。