前言
在当今高度数字化的时代,互联网服务的连续性、稳定性和高性能已成为企业生存与发展的生命线。无论是电子商务、金融支付、在线社交还是云计算服务,用户对访问速度和服务可用性的要求都达到了前所未有的高度。任何短暂的服务中断或性能瓶颈,都可能导致巨大的经济损失和不可逆的品牌信誉损害。
在这种背景下,传统的单服务器架构显得力不从心。它存在两个致命的弱点:
- 单点故障:一旦服务器硬件、网络或应用本身出现故障,整个服务将彻底瘫痪。
- 性能瓶颈:随着用户量和并发请求的激增,单台服务器的性能上限很快会被触及,无法进行水平扩展。
为了解决这些问题,集群技术应运而生。其核心思想是通过将多台服务器组合起来,形成一个统一的、虚拟的服务实体,共同对外提供服务。在这一领域,负载均衡 和 高可用性 是两个最为关键的技术支柱。
- 负载均衡:将涌入的海量用户请求,合理地分发到后端多台真实服务器上,从而充分利用集群中每台服务器的处理能力,消除单点性能瓶颈,实现规模的横向扩展。
- 高可用性:通过冗余和故障自动转移机制,确保当集群中的某个组件(如服务器、网络、服务进程)发生故障时,能够立即由备用组件接管工作,从而保证整个服务对外部用户而言几乎是"永不中断"的。
LVS 正是负载均衡领域的杰出代表。作为国内顶尖的开源项目,它工作在 Linux 内核层面,基于 IP 层和内容请求分发,提供了极高的吞吐量和连接处理能力,能够轻松应对数百万的并发连接,是构建大型网站基础架构的"定海神针"。
然而,LVS 调度器本身也可能成为新的单点。如果负载均衡调度器宕机,即使后端有成千上万台服务器,整个服务依然无法被访问。
此时,Keepalived 登场了。它是一个基于 VRRP 协议实现的高可用解决方案。Keepalived 可以为 LVS 调度器提供"热备份"。它通过竞选机制确定主备节点,主节点会虚拟出一个 VIP 对外提供服务。当主节点发生故障时,备节点会在极短时间内接管 VIP,从而接管所有流量,实现了 LVS 调度器自身的高可用。
LVS 与 Keepalived 的珠联璧合,构成了一个既具备超高负载处理能力,又拥有极强故障自愈能力的完整解决方案。 LVS 负责"冲锋陷阵",高效地分发流量;Keepalived 则作为"忠诚的卫士",在幕后保障着 LVS 调度器本身的安危。
本文将深入浅出地解析 LVS 的工作原理、三种工作模式,以及如何与 Keepalived 无缝集成,一步步指导您从零开始,构建一个坚实、可靠、高性能的现代互联网服务集群基础设施。让我们一同开启这段探索高可用与负载均衡核心技术的旅程。
keepalived
概念
- 基于 VRRP 协议实现高可用(HA)
- 初衷是为 LVS 负载均衡提供高可用方案,后来支持其他服务(如 Nginx、MySQL 等)
- 具体实现功能:
1.LVS集群管理
2.节点健康检查
3.故障自动切换
4.高可用vip接管
原理
- MASTER 节点发送心跳(通告)给 BACKUP 节点。
- BACKUP 节点收不到心跳时,接管 VIP。
- MASTER 恢复时,可抢回 VIP(抢占模式)或不抢回(非抢占模式)。
- 默认多播地址:224.0.0.18
- 优先级决定 MASTER 节点(数值越大优先)
keepalived主要模块
- core : 核心进程、配置文件加载解析
- vrrp : VRRP 协议实现,高可用
- check : 健康检查,支持 TCP/HTTP/脚本检查
脑裂
什么是脑裂
两个节点失去心跳连接,均认为对方挂掉
结果:
-
共享资源冲突
-
数据损坏(如数据库
脑裂的原因
- 心跳线故障(断线、老化)
- 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断了,老化)。
- 网卡/驱动故障
- 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
- 心跳网络设备故障
- 因心跳线间连接的设备故障(网卡及交换机)。
- 仲裁机器异常
- 因仲裁的机器出问题
- 防火墙阻挡 VRRP
- 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
- 配置不一致(virtual_router_id、优先级、实例名)
- Keepalive配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
- vrrp实例名字不一致、优先级一致。
解决方案
- 双心跳线冗余添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少"裂脑"发生几率。
- 磁盘锁(锁定共享资源)正在服务一方锁住共享磁盘,"裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁",另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
- 仲裁机制(Ping 参考 IP)例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
- 脚本监控报警
LVS+keepalived部署
环境
主 DR:192.168.10.103(MASTER)
备 DR:192.168.10.104(BACKUP)
VIP:192.168.10.180
Web 节点:
192.168.10.101
192.168.10.102
客户端:192.168.10.2
操作
1.关闭防火墙和selinux 代码:
关闭防火墙和增强服务
systemctl stop firewalld
setenforce 0
永久关闭SELinux(需重启)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
安装依赖包:
主 / 备 LVS 节点:安装 keepalived、ipvsadm和加载ip_vs
代码:
下载安装keepalived
yum -y install ipvsadm keepalived
加载lvs模块
modprobe ip_vs
cat /proc/net/ip_vs # 检查模块
后端 RealServer:安装 httpd或nginx(用于测试负载均衡)
yum install -y httpd && systemctl enable httpd
如果需要使用nginx可以看之前的nginx编译安装流程。当然也可以yum install -y nginx(不推荐,更新、模块、安装路径无法控制)
配置节点(DR)-keepalived
配置主节点-keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_01
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.10.180/32
}
}
配置备用节点-keepalived
#virtual_server 192.168.10.180 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.101 80 {
weight 1 # 服务器的权重
对后端服务器的TCP 层健康检查.(检测 80 端口是否存活)
TCP_CHECK {
connect_port 80 # 检查的端口(后端 HTTP 服务端口)
connect_timeout 3 # 连接超时时间(3 秒)
nb_get_retry 3 # 连接失败时的重试次数(3 次)
delay_before_retry 3 # 重试间隔(3 秒)
}
}
real_server 192.168.10.102 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
配置备用节点-keepalived
vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_02 # MASTER 为 LVS_01,BACKUP 为 LVS_02
smtp_server 127.0.0.1
}
vrrp_instance VI_1 {
state BACKUP # BACKUP 节点写 BACKUP
interface ens33
virtual_router_id 10
priority 90 # MASTER 高于 BACKUP
advert_int 1
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.10.180/32
}
}
virtual_server 192.168.10.180 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.101 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.102 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
主备节点参数优化:
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
普通节点
配置 VIP 到 lo 接口
配置 VIP 到 lo 接口
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
内容
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
ifup lo:0
ifconfig lo:0
route add -host 192.168.10.180 dev lo:0
ARP 参数调整,避免MAC冲突
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
启动服务
测试页面写入内容代码:
192.168.10.101
echo 'this is 192.168.10.101 web01!' > /var/www/html/index.html
192.168.10.102
echo 'this is 192.168.10.102 web02!' > /var/www/html/index.html
启动服务
systemctl restart httpd # rs节点
systemctl restart nginx # rs节点
systemctl restart keepalived # 主备节点
测试


总结
通过本文档的详细讲解和实操部署,我们完成了LVS+Keepalived高可用集群的完整搭建。关键收获:
技术要点:
深入理解了VRRP协议的工作原理和选举机制
掌握了Keepalived的配置语法和参数调优
学会了LVS DR模式的部署和ARP问题解决
理解了脑裂问题的成因和预防措施
最佳实践:
生产环境建议使用多播检测+第三方仲裁来避免脑裂
定期进行故障切换演练,确保高可用机制有效
建立完善的监控告警体系,实时掌握集群状态
扩展思考:
可以结合Consul等服务发现工具实现动态后端服务管理
考虑使用BGP协议实现跨机房的高可用方案
探索与Kubernetes等容器平台的集成方案
这套解决方案为企业关键业务提供了可靠的高可用保障,是构建稳健基础设施的重要技术支撑。