从原理到实践:LVS+Keepalived构建高可用负载均衡集群
从原理到实践:LVS+Keepalived构建高可用负载均衡集群
文章目录
- 从原理到实践:LVS+Keepalived构建高可用负载均衡集群
- 一、为什么需要LVS+Keepalived?
- 二、核心原理:Keepalived与VRRP协议
- 1. VRRP的核心思想
- 2. Keepalived的三大功能
- 三、LVS+Keepalived集群拓扑设计
- 四、实战部署:LVS+Keepalived集群搭建
- 阶段1:环境准备
- 阶段2:配置主从调度器(核心步骤)
- 1. 主调度器配置(192.168.10.73)
- 2. 从调度器配置(192.168.10.74)
- 3. 启动Keepalived服务
- 阶段3:配置Web节点(DR模式必需)
- 五、集群测试与验证
- 1. 负载均衡测试
- 2. 高可用(故障切换)测试
- (1)主调度器故障测试
- (2)Web节点故障测试
- 3. 日志查看
- 六、常见问题与解决方案
- 七、总结
在企业级应用部署中,“单点故障”是悬在运维人员头顶的“达摩克利斯之剑”——单台服务器一旦宕机,服务中断、业务停滞、用户流失等问题便会接踵而至。为解决这一痛点,LVS(Linux Virtual Server)与Keepalived的组合成为了构建高可用负载均衡集群的经典方案。本文将从原理剖析入手,一步步带大家掌握LVS+Keepalived集群的部署与实战技巧。
一、为什么需要LVS+Keepalived?
在传统的单服务器或单纯LVS部署中,存在两大核心隐患:
- 单点故障风险:无论是单独的Web服务器,还是LVS调度器,一旦出现硬件故障或软件崩溃,整个服务链路便会中断。
- 负载与可用性失衡:单纯的LVS能实现负载均衡,但调度器本身没有冗余机制;单纯的双机热备能解决单点问题,却无法分担访问压力。
而LVS+Keepalived的组合恰好弥补了这些不足:
- LVS:作为四层负载均衡器,负责将客户端请求高效分发到后端服务器池,支撑高并发访问。
- Keepalived:基于VRRP协议实现调度器的热备冗余,同时提供节点健康检查,确保集群“零中断”运行。
二、核心原理:Keepalived与VRRP协议
想要用好LVS+Keepalived,首先要理解其核心——VRRP(虚拟路由冗余协议) ,这是Keepalived实现高可用的底层逻辑。
1. VRRP的核心思想
VRRP将多台服务器(或路由器)组成一个“热备组”,通过一个虚拟IP(VIP) 对外提供服务。热备组内有明确的角色分工:
- 主节点(MASTER):优先级最高的节点,负责处理客户端请求,同时定期向备节点发送“心跳”消息。
- 备节点(BACKUP):处于待命状态,持续监听主节点的心跳;一旦检测到主节点失效,立即通过优先级选举接替VIP,成为新的主节点。
这种“虚拟IP漂移”机制,能在主节点故障时实现毫秒级切换,对客户端完全透明。
2. Keepalived的三大功能
Keepalived并非只为LVS设计,但其与LVS的适配性堪称完美,核心功能可概括为三点:
- 故障自动切换(Failover):基于VRRP实现主备调度器的无缝切换,避免调度器单点故障。
- 节点健康检查(Health Checking):定期检测后端真实服务器(如Web节点)的状态,自动剔除故障节点,待节点恢复后再重新加入集群。
- LVS集群管理:可直接调用ipvsadm工具配置LVS虚拟服务器、管理后端节点,无需手动执行复杂命令。
三、LVS+Keepalived集群拓扑设计
一个标准的LVS+Keepalived集群至少包含以下角色(以Web服务为例),拓扑结构如下:
[Internet] → [外网交换机] → [主调度器(MASTER)/从调度器(BACKUP)] → [内网交换机]↓[Web服务器池(节点1~节点N)] ← [NFS共享存储]
各组件说明:
- 调度器(2台):主调度器(如192.168.10.73)、从调度器(如192.168.10.74),共享VIP(如192.168.10.72)。
- Web节点(N台):运行Web服务,通过NFS共享存储保证内容一致性(如节点IP:192.168.10.77~80)。
- NFS服务器(1台):存储Web站点文件,避免各节点内容不一致问题(如IP:192.168.10.250)。
四、实战部署:LVS+Keepalived集群搭建
以下部署基于CentOS 7系统,假设已配置好基础网络、关闭防火墙(或开放必要端口)及SELinux。
阶段1:环境准备
-
安装依赖工具:所有节点均需安装基础工具,调度器额外安装ipvsadm和Keepalived。
# 所有节点安装基础工具 yum install -y net-tools vim# 主从调度器安装ipvsadm和Keepalived yum install -y ipvsadm keepalived
-
配置NFS共享(仅NFS服务器操作):
# 安装NFS服务 yum install -y nfs-utils rpcbind# 创建共享目录并授权 mkdir -p /var/www/html chmod 777 /var/www/html# 配置exports文件 echo "/var/www/html 192.168.10.0/24(rw,sync,no_root_squash)" >> /etc/exports# 启动服务并设置开机自启 systemctl start rpcbind nfs systemctl enable rpcbind nfs
-
挂载NFS到Web节点(所有Web节点操作):
# 创建Web目录并挂载NFS mkdir -p /var/www/html mount -t nfs 192.168.10.250:/var/www/html /var/www/html# 设置开机自动挂载 echo "192.168.10.250:/var/www/html /var/www/html nfs defaults 0 0" >> /etc/fstab
-
部署Web服务(所有Web节点操作):
# 安装Apache yum install -y httpd# 为每个节点创建差异化测试页面(便于后续验证负载均衡) echo "Web Node 1 (192.168.10.77)" > /var/www/html/index.html # 节点1 echo "Web Node 2 (192.168.10.78)" > /var/www/html/index.html # 节点2 # 其余节点同理# 启动Apache并设置开机自启 systemctl start httpd systemctl enable httpd
阶段2:配置主从调度器(核心步骤)
Keepalived的配置核心是/etc/keepalived/keepalived.conf
,主从调度器的配置差异仅在于router_id
、state
和priority
三个参数。
1. 主调度器配置(192.168.10.73)
编辑主配置文件:
vim /etc/keepalived/keepalived.conf
配置内容如下:
! Configuration File for keepalived# 全局参数配置
global_defs {router_id HA_MASTER # 主调度器标识(唯一)
}# VRRP热备实例配置
vrrp_instance VI_1 {state MASTER # 角色:主节点interface ens33 # 承载VIP的物理网卡(根据实际网卡名修改)virtual_router_id 1 # 虚拟路由ID(主从必须一致,范围0-255)priority 100 # 优先级(主节点需高于备节点,如100)advert_int 1 # 心跳间隔(1秒)# 认证配置(主从必须一致)authentication {auth_type PASSauth_pass 123456}# 虚拟IP(VIP)virtual_ipaddress {192.168.10.72/24 # 集群对外服务的VIP}
}# LVS虚拟服务器配置(关联后端Web节点)
virtual_server 192.168.10.72 80 {delay_loop 6 # 健康检查间隔(6秒)lb_algo rr # 负载均衡算法(rr:轮询;wrr:加权轮询;lc:最小连接)lb_kind DR # LVS工作模式(DR:直接路由模式,性能最优)persistence_timeout 50 # 会话保持时间(50秒内同一客户端请求定向到同一节点)protocol TCP # 协议类型# 后端Web节点1配置real_server 192.168.10.77 80 {weight 1 # 权重(数值越大,分配到的请求越多)# 健康检查方式(TCP_CHECK:端口检查)TCP_CHECK {connect_timeout 3 # 连接超时时间(3秒)retry 3 # 重试次数delay_before_retry 3 # 重试间隔}}# 后端Web节点2配置(其余节点同理)real_server 192.168.10.78 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}
}
2. 从调度器配置(192.168.10.74)
从调度器配置与主调度器基本一致,仅需修改3处参数:
global_defs {router_id HA_BACKUP # 从调度器标识(唯一)
}vrrp_instance VI_1 {state BACKUP # 角色:备节点interface ens33virtual_router_id 1priority 90 # 优先级(低于主节点,如90)advert_int 1authentication {auth_type PASSauth_pass 123456}virtual_ipaddress {192.168.10.72/24}
}# LVS虚拟服务器配置与主调度器完全一致,此处省略
3. 启动Keepalived服务
主从调度器均执行以下命令:
# 启动服务
systemctl start keepalived
# 设置开机自启
systemctl enable keepalived
# 查看服务状态
systemctl status keepalived
阶段3:配置Web节点(DR模式必需)
LVS-DR模式下,Web节点需要绑定VIP到回环网卡,并调整ARP响应参数,避免IP冲突:
- 创建配置脚本:
vim /usr/local/sbin/lvs_dr_real.sh
- 脚本内容如下:
#!/bin/bash VIP=192.168.10.72 # 绑定VIP到回环网卡 ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up # 添加路由(避免VIP数据包通过物理网卡发送) route add -host $VIP dev lo:0 # 关闭ARP响应(防止节点响应VIP的ARP请求) echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
- 执行脚本并设置开机自启:
# 赋予执行权限 chmod +x /usr/local/sbin/lvs_dr_real.sh # 执行脚本 sh /usr/local/sbin/lvs_dr_real.sh # 添加到rc.local实现开机自启 echo "/usr/local/sbin/lvs_dr_real.sh" >> /etc/rc.local chmod +x /etc/rc.local
五、集群测试与验证
部署完成后,需从高可用和负载均衡两个维度进行测试,确保集群功能正常。
1. 负载均衡测试
在客户端浏览器中多次访问http://192.168.10.72
(VIP),观察页面内容是否在“Web Node 1”“Web Node 2”等节点间轮询切换——若切换,则说明LVS负载均衡生效。
也可通过调度器执行ipvsadm -lnc
命令,查看连接记录,验证请求是否分发到各后端节点:
ipvsadm -lnc # 查看当前连接状态
2. 高可用(故障切换)测试
(1)主调度器故障测试
- 在主调度器上禁用网卡(模拟故障):
ifdown ens33
- 在从调度器上执行
ip addr
命令,查看是否已绑定VIP(192.168.10.72)——若绑定,则说明故障切换成功。 - 客户端继续访问
http://192.168.10.72
,确认服务是否正常可用。 - 恢复主调度器网卡:
由于主调度器优先级更高,会重新抢占VIP,从调度器将释放VIP。ifup ens33
(2)Web节点故障测试
- 停止某台Web节点的Apache服务(模拟故障):
systemctl stop httpd
- 在调度器上执行
ipvsadm -ln
命令,查看该节点是否已被标记为“Inactive”——若标记,则说明健康检查生效,故障节点已被剔除。 - 客户端访问VIP,确认请求是否不再分发到故障节点。
- 恢复Apache服务:
调度器会自动检测到节点恢复,将其重新加入集群。systemctl start httpd
3. 日志查看
Keepalived的故障切换日志默认记录在/var/log/messages
中,可通过以下命令查看切换过程:
tail -f /var/log/messages | grep Keepalived # 实时查看Keepalived日志
六、常见问题与解决方案
-
VIP无法漂移:
- 检查主从调度器的
virtual_router_id
、auth_pass
是否一致。 - 确认主调度器优先级是否高于从调度器。
- 检查防火墙是否阻止VRRP协议(VRRP使用224.0.0.18多播地址,需开放)。
- 检查主从调度器的
-
Web节点无法访问VIP:
- 确认Web节点的
lvs_dr_real.sh
脚本是否执行成功,lo:0接口是否绑定VIP。 - 检查
arp_ignore
和arp_announce
参数是否设置正确。
- 确认Web节点的
-
负载均衡失效:
- 确认LVS工作模式(DR)与Web节点配置是否匹配。
- 检查
ipvsadm
规则是否正确(可通过ipvsadm -ln
查看)。
七、总结
LVS+Keepalived集群通过“LVS负载均衡+Keepalived高可用”的双重保障,完美解决了企业级应用的单点故障和高并发压力问题。其核心在于VRRP协议的虚拟IP漂移机制,以及Keepalived的健康检查能力。
在实际部署中,需注意主从调度器的配置一致性、Web节点的ARP参数调整、日志的实时监控等细节——这些细节直接决定了集群的稳定性。掌握这套方案,能为企业业务的持续运行提供坚实的技术支撑。