Keepalived高可用全解析:从原理到实战,告别单点故障
一篇文章掌握VRRP协议和Keepalived集群,让服务7x24小时不间断运行
前言
想象一下:你的网站流量很大,部署了多台Web服务器,前端用LVS做负载均衡。一切看起来很完美——直到某个深夜,LVS服务器突然宕机了。所有用户都无法访问网站,而你还在睡梦中。
这就是单点故障的典型场景。负载均衡器本身成为了整个架构中最脆弱的一环。
Keepalived正是为了解决这个问题而生的。它通过VRRP协议实现高可用,让多台服务器共享一个虚拟IP(VIP),一台宕机后另一台自动接管,用户几乎无感知。
本文将从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核心概念
VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)通过将多台路由设备组合成一台虚拟路由器,实现网关的高可用。
| 概念 | 说明 |
|---|---|
| VRRP路由器 | 运行VRRP协议的路由器(如R1、R2) |
| VRID | 虚拟路由器标识符,同一VRRP组的设备使用相同VRID |
| 虚拟路由器 | 由VRRP虚拟出来的逻辑设备(非真实物理设备) |
| 虚拟IP地址 | 虚拟路由器的IP地址(用户配置的网关地址) |
| 虚拟MAC地址 | 格式为0000-5e00-01xx(xx为VRID) |
| Master路由器 | 承担报文转发任务,响应ARP请求 |
| Backup路由器 | 侦听Master状态,随时准备接管 |
| Priority | 优先级(0-255),值越大越优先 |
3.3 VRRP报文格式
VRRP只有一种报文——Advertisement报文,基于组播方式发送,目的地址为224.0.0.18。
3.4 VRRP定时器
| 定时器 | 说明 | 默认值 |
|---|---|---|
| ADVER_INTERVAL | Master发送通告报文的时间周期 | 1秒 |
| MASTER_DOWN | Backup设备监听超时后切换为Master | 约3秒 |
MASTER_DOWN计算公式:
MASTER_DOWN = (3 × ADVER_INTERVAL) + Skew_time Skew_time = (256 - Priority) / 2563.5 VRRP主备选举过程
场景1:优先级不相等
场景2:优先级相等
当优先级相等时,比较接口IP地址,IP地址大的成为Master。
场景3:IP地址拥有者
当某台路由器的接口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.cloud | 10.1.8.11 | Master(主节点) |
| web2.shep.cloud | 10.1.8.12 | Backup(备节点) |
| client1.shep.cloud | 10.1.8.21 | 客户端 |
4.2 基础配置
# web1配置[root@web1 ~]hostnamectl set-hostname web1.shep.cloud[root@web1 ~]nmcli connection modify ens33 ipv4.method manual\ipv4.addresses10.1.8.11/24\ipv4.gateway10.1.8.2\ipv4.dns223.5.5.5\autoconnectyes[root@web1 ~]nmcli connection up ens33# web2配置(同理)[root@web2 ~]hostnamectl set-hostname web2.shep.cloud[root@web2 ~]nmcli connection modify ens33 ipv4.method manual\ipv4.addresses10.1.8.12/24\ipv4.gateway10.1.8.2\ipv4.dns223.5.5.5\autoconnectyes[root@web2 ~]nmcli connection up ens334.3 部署Nginx服务
# web1和web2都执行[root@web{1,2}~]wget-O/etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo[root@web{1,2}~]yuminstall-ynginx[root@web{1,2}~]echo"welcome to$(hostname)">/usr/share/nginx/html/index.html[root@web{1,2}~]systemctlenablenginx--now# 验证[root@client1 ~]curl10.1.8.11 welcome to web1.shep.cloud[root@client1 ~]curl10.1.8.12 welcome to web2.shep.cloud4.4 配置Keepalived
web1(Master节点)
[root@web1 ~]yuminstall-ykeepalived[root@web1 ~]cp/etc/keepalived/keepalived.conf{,.ori}[root@web1 ~]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 shep@123 } virtual_ipaddress { 10.1.8.100/24 } }[root@web1 ~]systemctlenablekeepalived--nowweb2(Backup节点)
[root@web2 ~]yuminstall-ykeepalived[root@web2 ~]cp/etc/keepalived/keepalived.conf{,.ori}[root@web2 ~]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 shep@123 } virtual_ipaddress { 10.1.8.100/24 } }[root@web2 ~]systemctlenablekeepalived--now4.5 配置文件参数说明
| 参数 | 说明 |
|---|---|
router_id | 路由器标识,集群中各节点必须不同 |
state | 初始角色(MASTER/BACKUP),实际由优先级决定 |
interface | VIP绑定的网卡接口 |
virtual_router_id | 虚拟路由器ID(1-255),同一集群必须相同 |
priority | 优先级(值越大越优先) |
advert_int | 心跳通告间隔(秒) |
authentication | 心跳认证凭据,同一集群必须相同 |
virtual_ipaddress | 虚拟VIP地址列表 |
4.6 验证高可用
# 查看VIP在哪台机器上[root@web1 ~]ip-bra show ens33 ens33 UP10.1.8.11/2410.1.8.100/24 fe80::.../64# ✅ VIP在web1上[root@web2 ~]ip-bra show ens33 ens33 UP10.1.8.12/24 fe80::.../64# ❌ web2没有VIP# 客户端访问[root@client1 ~]curl10.1.8.100 welcome to web1.shep.cloud# 模拟web1故障(停止keepalived)[root@web1 ~]systemctl stop keepalived# VIP切换到web2[root@web2 ~]ip-bra show ens33 ens33 UP10.1.8.12/2410.1.8.100/24 fe80::.../64# 客户端访问(无感知切换)[root@client1 ~]curl10.1.8.100 welcome to web2.shep.cloud# 恢复web1[root@web1 ~]systemctl start keepalived# VIP回到web1(抢占模式)[root@web1 ~]ip-bra show ens33 ens33 UP10.1.8.11/2410.1.8.100/24 fe80::.../64五、Keepalived日志配置
5.1 开启Debug日志
[root@web1 ~]vim/etc/sysconfig/keepalivedKEEPALIVED_OPTIONS="-D -d -S 0"参数说明:
| 参数 | 含义 |
|---|---|
-D | 后台守护进程模式(默认) |
-d | 开启Debug调试日志(生产环境慎用,日志量大) |
-S 0 | 使用syslog facility 0输出日志 |
5.2 单独输出Keepalived日志
[root@web1 ~]vim/etc/rsyslog.d/keepalived.conf local0.* /var/log/keepalived.log[root@web1 ~]systemctl restart rsyslog[root@web1 ~]systemctl restart keepalived[root@web1 ~]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 shep@123 } virtual_ipaddress { 10.1.1.10/24 } }⚠️如果不指定
mcast_src_ip,Keepalived可能从任意网卡发送心跳报文,备机收不到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 shep@123 }3. 防火墙放行VRRP协议
[root@web1 ~]firewall-cmd --add-protocol=vrrp--permanent[root@web1 ~]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_kind | LVS模式(NAT/DR/TUN) |
persistence_timeout | 持久连接超时时间(秒) |
protocol | 协议(TCP/UDP/SCTP) |
real_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-protocol=vrrp--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-protocol=vrrp--permanentfirewall-cmd--reload📝 点点关注,持续更新,欢迎技术讨论。