LVS (Linux Virtual Server) 结合 Keepalived 是实现高可用、高性能网络服务(如 Web、数据库、邮件等)的经典解决方案。它利用 LVS 提供强大的四层(传输层,TCP/UDP)负载均衡能力,并通过 Keepalived 实现负载均衡器本身的高可用性(HA),避免单点故障。
核心组件与工作原理
LVS (IPVS):
角色:核心负载均衡器。工作在内核空间 (
ip_vs
模块),效率极高。功能:接收客户端请求,根据配置的调度算法 (如轮询
rr
、加权轮询wrr
、最少连接lc
、加权最少连接wlc
、源地址哈希sh
等),将请求转发给后端真实服务器集群 (Real Servers
, RS)。工作模式 (关键选择):
NAT (Network Address Translation):
LVS 修改请求和响应的 IP 地址/端口。
进出流量都经过 LVS,易成为瓶颈。RS 网关需指向 LVS。
DR (Direct Routing):
最常用、高性能模式。
LVS 只修改请求帧的 MAC 地址,将其直接路由给选中的 RS。
RS 处理请求并直接将响应发送回客户端 (不经过 LVS)。
要求 LVS 和所有 RS 在同一物理网络/VLAN (不能跨路由器)。RS 需要配置 VIP (Virtual IP) 在 loopback 接口上并抑制 ARP 响应 (
arp_ignore=1
,arp_announce=2
)。
TUN (IP Tunneling):
在 LVS 和 RS 之间建立 IP 隧道。
LVS 将请求封装在 IP 隧道包中发送给 RS。
RS 解封装后处理请求,并将响应直接发送回客户端。
允许 LVS 和 RS 在不同网络,但配置复杂,性能开销略高于 DR。
Keepalived:
角色:实现 LVS 负载均衡器本身的高可用性 + 管理 LVS 配置 + 监控后端 RS 健康状态。
核心机制:VRRP (Virtual Router Redundancy Protocol)。
多个 LVS 节点(通常是两个:
Master
和Backup
)组成一个 VRRP 组。组内所有节点都配置一个相同的虚拟路由器 ID (VRID)。
组内选举出一个
Master
节点。Master
节点持有虚拟 IP 地址 (VIP),这个 VIP 就是客户端访问服务的地址。Master
节点定期发送 VRRP 通告 (advert
) 给组内其他节点,宣告自己存活。Backup
节点监听通告。如果Backup
在指定时间内 (advert_int
+n * priority delay
) 没有收到Master
的通告,它会发起选举,成为新的Master
并接管 VIP。优先级 (
priority
) 决定选举结果(值高的优先)。
功能:
LVS 高可用 (VRRP):自动进行故障转移(Failover),确保 VIP 始终可用。
管理 LVS 规则:Keepalived 根据其配置文件 (
keepalived.conf
) 自动在活动节点 (Master
) 上配置 LVS 的虚拟服务器 (virtual_server
) 和后端 RS (real_server
)。健康检查 (Health Checking):
对后端 RS:Keepalived (
Master
) 定期检查配置的每个real_server
的健康状态(如 TCP 连接检查、HTTP GET 检查、自定义脚本检查等)。如果检测到 RS 故障,它会将其从 LVS 转发池中移除。当 RS 恢复后,再将其重新加入。对 LVS 节点自身服务:可配置脚本检查本机上的关键服务(如
ipvsadm
服务本身、或依赖的进程),如果检查失败,Keepalived 可以主动降低自身优先级 (priority
),触发主备切换,让更健康的节点接管。这有助于处理“僵死”节点(网络通但服务挂的情况)。
典型架构 (以 DR 模式为例)
+-----------------------+ | Client | +----------+------------+ | (请求目标: VIP) | +----------v------------+ +-----------------------+ | | VRRP | | | LVS/Keepalived <--------> LVS/Keepalived | | (Master) | | (Backup) | | [VIP:eth0] | | [VIP:未激活] | +----------+------------+ +-----------------------+ | (DR 模式: 转发请求到 RS, 目标 MAC 是选中的 RS) | +----------v---------------------------+ | Switch / VLAN | +-----+--------------+-----------------+ | | +-------v----+ +------v-------+ | Real Server| | Real Server | | (RS1) | | (RS2) | | [VIP:lo:0] | | [VIP:lo:0] | <-- VIP 配置在 loopback 接口,抑制 ARP +------------+ +--------------+ | | | (响应直接发送给客户端,源IP是VIP) | +-----v----------------------+ | Client | +----------------------------+
关键配置文件 (keepalived.conf
) 主要部分
global_defs { notification_email { ... } # 报警邮件设置 (可选) router_id LVS_DEVEL # 标识本节点 } # VRRP 实例配置 - 实现 LVS 节点 HA vrrp_instance VI_1 { state MASTER # 初始状态 MASTER 或 BACKUP interface eth0 # 绑定 VRRP 的物理接口 virtual_router_id 51 # VRRP 组 ID (必须相同) priority 100 # 选举优先级 (MASTER 通常更高) advert_int 1 # VRRP 通告间隔 (秒) authentication { # VRRP 认证 (可选,简单密码) auth_type PASS auth_pass 1111 } virtual_ipaddress { # 要管理的 VIP (可以有多个) 192.168.1.100/24 dev eth0 label eth0:0 # VIP 配置在 eth0:0 } # 可选的脚本跟踪接口/脚本检查 track_script { chk_haproxy # 引用下面定义的脚本检查 (可选) } } # 定义一个 LVS 虚拟服务器 (Virtual Server) virtual_server 192.168.1.100 80 { # VIP 和端口 delay_loop 6 # 健康检查间隔 (秒) lb_algo wrr # 调度算法 (加权轮询) lb_kind DR # 工作模式 (DR) persistence_timeout 50 # 会话保持时间 (秒,可选) protocol TCP # 协议 # 真实服务器 1 (Real Server) real_server 192.168.1.11 80 { weight 1 # 权重 (用于 wrr, wlc 等算法) # TCP 健康检查 TCP_CHECK { connect_timeout 3 # 连接超时 nb_get_retry 3 # 重试次数 delay_before_retry 3 # 重试间隔 connect_port 80 # 检查端口 } # 或者 HTTP_GET 健康检查 # HTTP_GET { # url { path /healthz } # connect_timeout 3 # nb_get_retry 3 # delay_before_retry 3 # } } # 真实服务器 2 (Real Server) real_server 192.168.1.12 80 { weight 2 TCP_CHECK { ... } # 同上 } } # 可选的额外脚本检查 (用于 track_script) vrrp_script chk_haproxy { script "/usr/bin/killall -0 haproxy" # 检查 haproxy 进程是否存在 (示例) interval 2 # 检查间隔 weight 2 # 检查失败时优先级变化值 (可负) }
优点
高性能:LVS 内核转发,效率极高,尤其 DR/TUN 模式避免响应瓶颈。
高可用:Keepalived 实现 LVS 节点故障自动转移,服务不中断。
可扩展性:后端 RS 可以水平扩展以应对增长流量。
透明性:客户端只感知 VIP,后端服务器变化对客户端透明。
灵活性:支持多种负载均衡算法和健康检查方式。
成熟稳定:技术成熟,在大型互联网公司广泛使用多年。
缺点/注意事项
配置复杂性:尤其 DR 模式下的 ARP 抑制和网络拓扑要求。
单点配置:Keepalived 主节点负责 LVS 配置管理,需确保配置同步(通常靠同步配置文件解决,Keepalived 自身不负责配置同步)。
脑裂 (Split-Brain) 风险:如果 VRRP 通告因网络分区无法传递,可能导致两个节点都认为自己是 Master 并持有 VIP。需要合理设置优先级、通告间隔,并在网络设计上尽量避免分区。有时需依赖额外的监控和仲裁机制。
模式限制:
DR/TUN:要求后端应用不能依赖源 IP(因为客户端 IP 直达 RS,RS 看到的源 IP 是真实客户端 IP,但 LVS 可能修改了 TCP 选项如时间戳,某些应用需注意)。
NAT:LVS 可能成为带宽和连接数瓶颈,且需要 RS 网关指向 LVS。
功能层级:LVS 是四层负载均衡,不感知应用层内容(如 HTTP URL、Cookie)。如需七层负载均衡(更智能的路由),需要在 RS 上部署 Nginx/Haproxy 或使用专门的七层负载均衡器。
部署步骤概要
规划:确定 VIP、真实服务器 IP、网络拓扑(推荐同一 VLAN DR 模式)、调度算法、健康检查方式。
配置后端 RS:
安装并配置应用服务 (Nginx, Apache, Tomcat 等)。
配置 VIP 在 loopback 接口 (仅 DR/TUN 模式需要)。
配置 ARP 抑制 (
arp_ignore=1
,arp_announce=2
)。确保 RS 防火墙允许 VIP 和健康检查流量。
配置 LVS/Keepalived 节点 (所有节点):
安装
ipvsadm
(管理工具) 和keepalived
。编辑
/etc/keepalived/keepalived.conf
(如上示例)。确保配置文件在节点间一致(主备的
state
和priority
不同)。开启内核转发 (
net.ipv4.ip_forward=1
for NAT)。确保 VRRP 通告端口 (通常是 112) 和健康检查端口在防火墙允许。
启动服务:
在所有 LVS 节点启动
keepalived
服务:systemctl start keepalived && systemctl enable keepalived
检查日志 (
journalctl -u keepalived -f
),确认 Master 选举成功,VIP 绑定正确。在 Master 节点使用
ipvsadm -Ln
检查 LVS 规则和后端 RS 状态。
测试:
访问 VIP 测试服务是否正常。
模拟故障测试:
关闭 Master 的 keepalived:观察 Backup 是否接管 VIP 和 LVS 规则。
关闭一个后端 RS:观察 LVS Master 是否将其从池中移除 (
ipvsadm -Ln
查看状态)。恢复 RS:观察是否重新加入池。
(可选) 模拟网络分区测试脑裂处理。
总结
LVS + Keepalived 是一个强大、高效且成熟的四层高可用负载均衡解决方案。它特别适合处理高流量、对性能要求苛刻且需要高可用性的场景(如 Web 前端、API 网关、缓存层等)。虽然配置(尤其是 DR 模式)相对复杂并需要注意网络拓扑和 ARP 问题,但其卓越的性能和稳定性使其在基础设施领域占据重要地位。理解其工作原理和不同模式的特点对于成功部署和维护至关重要。