当前位置: 首页 > news >正文

从原理到实践: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部署中,存在两大核心隐患:

  1. 单点故障风险:无论是单独的Web服务器,还是LVS调度器,一旦出现硬件故障或软件崩溃,整个服务链路便会中断。
  2. 负载与可用性失衡:单纯的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的适配性堪称完美,核心功能可概括为三点:

  1. 故障自动切换(Failover):基于VRRP实现主备调度器的无缝切换,避免调度器单点故障。
  2. 节点健康检查(Health Checking):定期检测后端真实服务器(如Web节点)的状态,自动剔除故障节点,待节点恢复后再重新加入集群。
  3. 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:环境准备

  1. 安装依赖工具:所有节点均需安装基础工具,调度器额外安装ipvsadm和Keepalived。

    # 所有节点安装基础工具
    yum install -y net-tools vim# 主从调度器安装ipvsadm和Keepalived
    yum install -y ipvsadm keepalived
    
  2. 配置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
    
  3. 挂载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
    
  4. 部署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_idstatepriority三个参数。

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冲突:

  1. 创建配置脚本:
    vim /usr/local/sbin/lvs_dr_real.sh
    
  2. 脚本内容如下:
    #!/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
    
  3. 执行脚本并设置开机自启:
    # 赋予执行权限
    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)主调度器故障测试
  1. 在主调度器上禁用网卡(模拟故障):
    ifdown ens33
    
  2. 在从调度器上执行ip addr命令,查看是否已绑定VIP(192.168.10.72)——若绑定,则说明故障切换成功。
  3. 客户端继续访问http://192.168.10.72,确认服务是否正常可用。
  4. 恢复主调度器网卡:
    ifup ens33
    
    由于主调度器优先级更高,会重新抢占VIP,从调度器将释放VIP。
(2)Web节点故障测试
  1. 停止某台Web节点的Apache服务(模拟故障):
    systemctl stop httpd
    
  2. 在调度器上执行ipvsadm -ln命令,查看该节点是否已被标记为“Inactive”——若标记,则说明健康检查生效,故障节点已被剔除。
  3. 客户端访问VIP,确认请求是否不再分发到故障节点。
  4. 恢复Apache服务:
    systemctl start httpd
    
    调度器会自动检测到节点恢复,将其重新加入集群。

3. 日志查看

Keepalived的故障切换日志默认记录在/var/log/messages中,可通过以下命令查看切换过程:

tail -f /var/log/messages | grep Keepalived  # 实时查看Keepalived日志

六、常见问题与解决方案

  1. VIP无法漂移

    • 检查主从调度器的virtual_router_idauth_pass是否一致。
    • 确认主调度器优先级是否高于从调度器。
    • 检查防火墙是否阻止VRRP协议(VRRP使用224.0.0.18多播地址,需开放)。
  2. Web节点无法访问VIP

    • 确认Web节点的lvs_dr_real.sh脚本是否执行成功,lo:0接口是否绑定VIP。
    • 检查arp_ignorearp_announce参数是否设置正确。
  3. 负载均衡失效

    • 确认LVS工作模式(DR)与Web节点配置是否匹配。
    • 检查ipvsadm规则是否正确(可通过ipvsadm -ln查看)。

七、总结

LVS+Keepalived集群通过“LVS负载均衡+Keepalived高可用”的双重保障,完美解决了企业级应用的单点故障和高并发压力问题。其核心在于VRRP协议的虚拟IP漂移机制,以及Keepalived的健康检查能力。

在实际部署中,需注意主从调度器的配置一致性、Web节点的ARP参数调整、日志的实时监控等细节——这些细节直接决定了集群的稳定性。掌握这套方案,能为企业业务的持续运行提供坚实的技术支撑。


文章转载自:

http://E89BJkH7.rdsst.cn
http://xY0MOr0x.rdsst.cn
http://8cuhd02Y.rdsst.cn
http://SID5JeiX.rdsst.cn
http://xE1Uq0D6.rdsst.cn
http://KzOvfpid.rdsst.cn
http://6Ws7Rfrb.rdsst.cn
http://ZR8iWRfH.rdsst.cn
http://bDS7lygo.rdsst.cn
http://Tn1eucZp.rdsst.cn
http://6nQlBGLl.rdsst.cn
http://k0Aw4qB8.rdsst.cn
http://uZcmkMjM.rdsst.cn
http://tvTNXPXQ.rdsst.cn
http://uozKoPFX.rdsst.cn
http://hYRlUWXe.rdsst.cn
http://AmqY94Ee.rdsst.cn
http://VI0k3nxX.rdsst.cn
http://kCoT4hzm.rdsst.cn
http://1A6HVmYW.rdsst.cn
http://x094DBGx.rdsst.cn
http://xylN0Au7.rdsst.cn
http://hDkkzoQ0.rdsst.cn
http://Wo189CBx.rdsst.cn
http://WhioxWnI.rdsst.cn
http://nCOwT2te.rdsst.cn
http://vpvxtAm9.rdsst.cn
http://a5HeRkye.rdsst.cn
http://c65h1xln.rdsst.cn
http://NBXcYyGL.rdsst.cn
http://www.dtcms.com/a/376530.html

相关文章:

  • 多脚本大批量训练
  • java与node.js对比
  • tailwindcss 究竟比 unocss 快多少?
  • 排序---希尔排序(Shell Sort)
  • Windows系统下,配置VScode的git以及git终端
  • 机器学习实战(一): 什么是机器学习
  • Google SEO 优化里,AWS 的隐藏优势
  • 微信推客小程序系统开发技术实践
  • git下载、安装、使用
  • Transformer实战(17)——微调Transformer语言模型进行多标签文本分类
  • 单例模式(C++)详解(3)
  • Eyeshot 2025.3 3D 图形工具包
  • 【Linux手册】信号量与建造者模式:以 PV 操作保证并发安全,分步组装构建复杂对象
  • 【展厅多媒体】VR虚拟现实,构建展厅沉浸体验的重要技术
  • 京东京造K2 蓝牙/有线双模键盘键盘快捷键
  • Figma Make 输入指令浏览器无响应
  • 【设计模式】【观察者模式】实例
  • 【Linux手册】消息队列从原理到模式:底层逻辑、接口实战与责任链模式的设计艺术
  • 学习React-10-useTransition
  • Hive中的3种虚拟列以及Hive如何进行条件判断
  • 基于 C++ 的 IEC60870-5-104 规约的主从站模拟数据通信
  • css flex布局,设置flex-wrap:wrap换行后,如何保证子节点被内容撑高后,每一行的子节点高度一致。
  • 一款免费开源轻量的漏洞情报系统 | 漏洞情报包含:组件漏洞 + 软件漏洞 + 系统漏洞
  • 容器问答题上
  • uniapp发布成 微信小程序 主包内 main.wxss 体积太大
  • Uniapp中使用renderjs实现OpenLayers+天地图的展示与操作
  • 鸿蒙HAP包解包、打包、签名及加固全流程解析
  • [Leetcode 算法题单] 1456. 定长子串中元音的最大数目
  • 基于Springboot + vue实现的高校大学生竞赛项目管理系统
  • 为什么 socket.io 客户端在浏览器能连上,但在 Node.js 中报错 transport close?