LVS+Keepalived高可用群集 - 指南
目录
简介
一、Keepalived双机热备基础
1.1 Keepalived核心概念与VRRP协议原理
1.2 环境准备与软件安装
1.3 主服务器Keepalived配置
1.4 备用服务器Keepalived配置
1.5 双机热备功能测试
1.5.1 启动服务并验证VIP绑定
1.5.2 连通性测试与故障切换验证
1.5.3 Web服务切换测试
1.5.4 日志分析
二、LVS+Keepalived高可用负载均衡集群
2.1 LVS+Keepalived集群架构设计
2.2 基础环境配置
2.3 主调度器完整配置
2.4 从调度器配置
2.5 Web节点服务器配置(DR模式)
2.6 集群功能测试
2.6.1 负载均衡验证
2.6.2 高可用性测试
三、总结
简介
在当今互联网服务高并发、高可用的需求背景下,单点故障已成为系统稳定性的重大挑战。本文将讲解如何构建高可用的负载均衡集群,通过理论与实操,帮助读者掌握从环境搭建到故障切换的全流程技术要点。
一、Keepalived双机热备基础
1.1 Keepalived核心概念与VRRP协议原理
Keepalived最初是为LVS负载均衡器设计的高可用解决方案,其核心基于VRRP(虚拟路由冗余协议)实现故障切换与健康检查功能。VRRP协议通过将多台服务器组成一个热备组,共享一个虚拟IP地址(VIP),实现服务的持续可用。
- VRRP热备组工作机制:
- 热备组内同一时刻仅有一台主服务器(MASTER)提供服务
- 其他服务器处于备用状态(BACKUP),定期监听主服务器的心跳
- 当主服务器失效时,优先级最高的备用服务器接管VIP
- 主服务器恢复后,会重新夺回VIP控制权
1.2 环境准备与软件安装
以下是在OpenEuler24系统中搭建双机热备环境的具体步骤,两台服务器的IP规划如下:
- 主服务器:192.168.10.101
- 备用服务器:192.168.10.102
- 虚拟IP:192.168.10.100
# 安装Keepalived、ipvsadm(LVS管理工具)和Nginx(测试Web服务)yum install -y keepalived ipvsadm nginx # 设置Keepalived服务开机自启动systemctl enable keepalived # 关闭防火墙(生产环境需谨慎配置防火墙规则)systemctl stop firewalldsystemctl disable firewalld # 关闭SELinux安全机制setenforce 0sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
命令解析:
-
yum install
:通过包管理器安装所需软件,-y
参数自动确认安装 -
systemctl enable
:将Keepalived添加到系统启动项,确保服务器重启后服务自动运行 - 防火墙和SELinux的关闭是为了简化测试环境,生产环境应根据安全策略配置
1.3 主服务器Keepalived配置
# 进入Keepalived配置目录cd /etc/keepalived/ # 复制配置模板作为基础cp keepalived.conf.sample keepalived.conf # 编辑主配置文件vi keepalived.conf
global_defs { router_id HA_TEST_R1 # 本服务器在热备组中的标识名称} vrrp_instance VI_1 { state MASTER # 服务器角色状态,MASTER为主服务器 interface ens33 # 承载VIP的物理网络接口 virtual_router_id 1 # 虚拟路由ID,同一热备组内必须一致 priority 100 # 优先级,数值越大优先级越高,主服务器应设为最高 advert_int 1 # 心跳通告间隔(秒),用于主备服务器状态检测 authentication { auth_type PASS # 认证类型,PASS为密码认证 auth_pass 123456 # 认证密码,同一热备组内必须一致 } virtual_ipaddress { 192.168.10.100/24 # 虚拟IP地址,即漂移地址 }}
配置解析:
-
global_defs
:全局参数配置,router_id
用于标识不同服务器 -
vrrp_instance
:VRRP实例配置,VI_1
为实例名称
-
state
指定服务器角色,MASTER表示主服务器 -
interface
指定绑定VIP的物理接口,需根据实际环境修改 -
virtual_router_id
是热备组的唯一标识,同一组内必须相同 -
priority
决定故障切换顺序,主服务器应高于备用服务器 -
advert_int
设置心跳频率,默认1秒一次 -
authentication
配置认证信息,防止非法服务器加入热备组
-
virtual_ipaddress
定义漂移IP地址,客户端通过此地址访问服务
1.4 备用服务器Keepalived配置
备用服务器的配置与主服务器基本相同,仅需修改少数参数:
global_defs { router_id HA_TEST_R2 # 备用服务器标识名称,需与主服务器不同} vrrp_instance VI_1 { state BACKUP # 备用服务器状态标识 interface ens33 # 同主服务器的网络接口 virtual_router_id 1 # 保持与主服务器一致的虚拟路由ID priority 99 # 优先级低于主服务器,确保主服务器优先接管 advert_int 1 # 心跳间隔与主服务器一致 authentication { auth_type PASS auth_pass 123456 # 认证信息必须与主服务器完全一致 } virtual_ipaddress { 192.168.10.100/24 # 相同的虚拟IP地址 }}
关键差异说明:
-
router_id
改为HA_TEST_R2
,确保每台服务器标识唯一 -
state
设置为BACKUP
,表明这是备用服务器 -
priority
设为99,比主服务器的100低,保证正常情况下主服务器持有VIP
1.5 双机热备功能测试
1.5.1 启动服务并验证VIP绑定
# 启动Keepalived服务systemctl start keepalived # 查看网络接口配置,确认VIP是否绑定ip addr show dev ens33
主服务器输出示例:
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:93:80:fb brd ff:ff:ff:ff:ff:ff inet 192.168.10.101/24 brd 172.16.16.255 scope global ens33 inet 192.168.10.100/32 scope global ens33 # 自动绑定的VIP地址
备用服务器输出示例:
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:d1:f0:b5 brd ff:ff:ff:ff:ff:ff inet 192.168.10.102/24 brd 172.16.16.255 scope global ens33 # 备用服务器此时不会绑定VIP
1.5.2 连通性测试与故障切换验证
# 在客户端持续ping VIP地址ping -t 192.168.10.100 # 模拟主服务器故障(停止Keepalived服务)systemctl stop keepalived # 观察ping命令输出,应只有1-2个包丢失# 恢复主服务器服务systemctl start keepalived
1.5.3 Web服务切换测试
# 在主服务器设置Nginx测试页面echo "主服务器提供服务" > /usr/share/nginx/html/index.htmlsystemctl start nginx # 在备用服务器设置不同的测试页面echo "备用服务器提供服务" > /usr/share/nginx/html/index.htmlsystemctl start nginx # 在客户端浏览器访问http://192.168.10.100# 正常应显示主服务器页面# 停止主服务器Keepalived服务后刷新页面# 应显示备用服务器页面# 恢复主服务器服务后再次刷新# 应重新显示主服务器页面
1.5.4 日志分析
# 查看Keepalived日志tail -f /var/log/messages # 主服务器日志关键信息Sep 11 13:36:42 localhost Keepalived_vrrp[18280]: VRRP_Instance(VI_1) Transition to MASTER STATE# 表示主服务器恢复后重新获取MASTER状态 # 备用服务器日志关键信息Sep 11 13:12:44 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Entering MASTER STATE# 表示备用服务器接管VIP时的状态切换
二、LVS+Keepalived高可用负载均衡集群
2.1 LVS+Keepalived集群架构设计
LVS(Linux Virtual Server)是Linux内核级的负载均衡解决方案,结合Keepalived可以构建同时具备负载均衡和高可用特性的集群系统。本案例采用DR(直接路由)模式,其架构如下:
- 主调度器:192.168.10.101(Keepalived+LVS)
- 从调度器:192.168.10.102(Keepalived+LVS)
- 虚拟IP:192.168.10.100
- Web服务器池:
- web01: 192.168.10.103
- web02: 192.168.10.104
- NFS共享服务器:192.168.10.105(提供Web内容共享)
2.2 基础环境配置
# 加载LVS核心模块modprobe ip_vs # 查看LVS模块版本信息cat /proc/net/ip_vs # 安装Keepalived和ipvsadmyum install -y keepalived ipvsadm # 备份原始配置文件cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
命令解析:
-
modprobe ip_vs
:手动加载LVS内核模块,确保系统支持LVS功能 -
cat /proc/net/ip_vs
:验证LVS模块是否正确加载及版本信息 - 备份配置文件是为了防止配置错误导致服务不可用
2.3 主调度器完整配置
! Configuration File for keepalived global_defs { router_id LVS_HA_R1 # 主调度器标识名称} vrrp_instance VI_1 { state MASTER # 主调度器状态 interface ens33 # 绑定VIP的物理接口 virtual_router_id 62 # 虚拟路由ID,同一热备组内一致 priority 100 # 最高优先级 advert_int 1 # 心跳间隔1秒 authentication { auth_type PASS # 密码认证 auth_pass 1111 # 认证密码 } virtual_ipaddress { 192.168.10.100 # 集群VIP地址 }} # 虚拟服务器配置(LVS负载均衡规则)virtual_server 192.168.10.100 80 { delay_loop 3 # 健康检查间隔3秒 lb_algo rr # 负载均衡算法:轮询(Round Robin) lb_kind DR # 集群工作模式:直接路由(DR) persistence_timeout 50 # 连接保持时间50秒 protocol TCP # 应用层协议:TCP # 第一个真实服务器配置 real_server 192.168.10.103 80 { weight 1 # 服务器权重,1表示正常参与负载均衡 TCP_CHECK { # TCP健康检查方式 connect_port 80 # 检查目标端口 connect_timeout 10 # 连接超时时间 retry 3 # 重试次数 delay_before_retry 3 # 重试间隔 } } # 第二个真实服务器配置 real_server 192.168.10.104 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 10 retry 3 delay_before_retry 3 } }}
关键配置解析:
-
virtual_server
块定义LVS虚拟服务器,指定VIP和服务端口(80) -
delay_loop
设置健康检查频率,确保及时发现故障节点 -
lb_algo
指定负载均衡算法,rr
为轮询算法,简单均衡流量 -
lb_kind DR
表示使用直接路由模式,调度器仅处理入向请求,响应由节点服务器直接返回 -
persistence_timeout
实现会话保持,同一客户端的请求会被分配到同一节点 -
real_server
定义真实服务器,weight
表示服务器权重,可根据服务器性能调整 -
TCP_CHECK
配置健康检查参数,确保只有健康的节点参与负载均衡
2.4 从调度器配置
从调度器的配置与主调度器基本相同,仅修改以下参数:
global_defs { router_id LVS_HA_R2 # 从调度器标识} vrrp_instance VI_1 { state BACKUP # 从调度器状态 priority 90 # 优先级低于主调度器}
2.5 Web节点服务器配置(DR模式)
DR模式下,节点服务器需要特殊配置以处理VIP请求:
#!/bin/bash# VIP配置脚本,需在所有Web节点执行 vip='192.168.10.100' # 集群VIP地址 case "$1" instart) # 配置ARP参数,防止ARP广播暴露真实服务器 echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce echo "2" > /proc/sys/net/ipv4/conf/default/arp_announce echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "1" > /proc/sys/net/ipv4/conf/default/arp_ignore echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce # 临时添加VIP到lo接口 ip addr add $vip/32 dev lo label lo:0 # 临时添加本地路由 ip route add local $vip/32 dev lo # 永久生效配置(通过rc.local) echo "ip addr add $vip/32 dev lo label lo:0" | tee -a /etc/rc.local echo "ip route add local $vip/32 dev lo" | tee -a /etc/rc.local chmod +x /etc/rc.local ;;stop) # 恢复ARP参数 echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce echo "0" > /proc/sys/net/ipv4/conf/default/arp_announce echo "0" > /proc/sys/net/ipv4/conf/default/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce # 移除临时VIP ip addr del $vip/32 dev lo label lo:0 # 移除临时路由 ip route del local $vip/32 dev lo # 移除rc.local中的永久配置 sed -i "/ip addr add $vip/32 dev lo label lo:0/d" /etc/rc.local sed -i "/ip route add local $vip/32 dev lo/d" /etc/rc.local ;;*) echo "Usage: $0 {start|stop}" exit 1 ;;esacexit 0
配置解析:
- ARP参数配置:
-
arp_announce=2
:限制ARP通告时使用指定接口的IP -
arp_ignore=1
:忽略对VIP的ARP请求,避免真实服务器响应ARP广播
- VIP绑定:将VIP添加到
lo:0
虚拟接口,确保节点服务器能响应VIP请求 - 本地路由:添加到VIP的本地路由,确保响应包正确发送
-
rc.local
配置确保服务器重启后配置依然生效
2.6 集群功能测试
2.6.1 负载均衡验证
# 在调度器上查看LVS规则ipvsadm -ln # 输出示例IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.10.100:80 rr -> 192.168.10.103:80 Route 1 0 0 -> 192.168.10.104:80 Route 1 0 0 # 查看连接状态ipvsadm -lnc # 输出示例TCP 192.168.10.100:80 192.168.1.10:54321 192.168.10.103:80 FIN_WAIT# 显示客户端请求被分配到不同的真实服务器
2.6.2 高可用性测试
- 停止主调度器Keepalived服务,观察VIP是否切换到从调度器
- 模拟某一Web节点故障,验证LVS是否自动将其移除
- 恢复故障节点,验证是否重新加入集群
- 同时访问集群VIP,验证流量是否在正常节点间均衡分配
三、总结
- 认证安全强化:
- 生产环境中应使用更安全的认证方式,避免明文密码
- 定期更换热备组认证密码
- 健康检查优化:
- 根据服务特性调整健康检查参数,避免误判
- 对于复杂服务,可自定义健康检查脚本
- 网络配置优化:
- 确保调度器与节点服务器在同一二层网络,以支持DR模式
- 配置合适的防火墙规则,只开放必要端口
- 日志与监控:
- 配置集中式日志服务器,便于故障排查
- 使用Prometheus等工具监控集群状态与性能指标
- 容灾扩展:
- 建议至少部署3台调度器(2主1备),提高可用性
- 预留足够的节点服务器,支持业务流量突发增长
在实际应用中,需根据业务特点灵活调整配置参数,并建立完善的监控与应急预案,确保集群在各种场景下都能稳定高效运行。