LVS负载均衡集群指南 一、什么是集群集群Cluster 是指将多台独立的计算机服务器通过高速网络连接起来协同完成特定任务的计算系统。从外部看整个集群就像一台性能超强的超级计算机。为什么需要集群高可用性HA单点故障时自动切换保证服务7×24小时在线高性能HP将请求分散到多台服务器提升整体处理能力高可扩展性HS通过增加节点即可线性扩展性能二、集群分类根据功能和目标集群主要分为三大类类型英文缩写核心目标典型产品负载均衡集群LBLoad Balancing将请求流量分发到多个后端服务器LVS、Nginx、HAProxy高可用集群HAHigh Availability保证服务持续在线故障自动切换Keepalived、Heartbeat高性能集群HPHigh Performance并行计算解决大规模科学计算问题Hadoop、MPI关系图解三、LVS的作用LVSLinux Virtual Server是Linux内核自带的四层负载均衡软件由章文嵩博士开发现已成为Linux内核标准组件。核心作用请求分发将用户请求按规则分发到后端真实服务器RealServer服务隐藏后端服务器的真实IP对内网可见对外只暴露VIP虚拟IP水平扩展通过增加后端服务器提升服务能力高可用性配合Keepalived实现故障自动切换LVS vs Nginx七层负载对比项LVS四层Nginx七层工作层级传输层TCP/UDP应用层HTTP/HTTPS处理速度极快内核态较快用户态协议支持所有TCP/UDP协议仅HTTP/HTTPS等配置复杂度相对简单灵活但复杂典型场景大流量入口、数据库负载Web应用、API网关四、LVS的4种模式及原理图解LVS通过修改数据包来实现流量转发主要有4种工作模式1. NAT模式网络地址转换原理请求包到达LVS后将目标IPVIP改为RealServer的IPDNATRS处理请求后将响应包发回LVSLVS再将源IP改为VIP后返回客户端SNAT特点优支持端口映射RS可以使用任何操作系统缺进出流量都经过LVS成为瓶颈性能最低需修改IP和端口2. DR模式直接路由-最常用原理LVS和RS必须在同一物理网段二层可达RS的lo接口配置VIP非ARP响应LVS仅修改请求包的目标MAC地址IP和端口不变RS直接响应客户端不经过LVS特点优性能最高响应不走LVS可处理大规模流量缺LVS和RS必须在同一VLANRS需要配置VIP和抑制ARPRS配置示例# 在RS上配置VIP到lo ifconfig lo:0 172.25.254.100 netmask 255.255.255.255 up # 抑制ARP响应 echo 1 /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 /proc/sys/net/ipv4/conf/lo/arp_announce3. TUN模式隧道原理LVS将原始请求包封装在IPIP隧道中发送给RSRS解封装后处理请求直接响应客户端RS需要配置tunl接口和VIP特点优支持跨网段部署响应流量不经过LVS缺有隧道封装开销RS需要支持IPIP隧道4. FULLNAT模式全网络地址转换— 阿里开源原理同时修改源IP和目标IPLVS和RS可以跨网段部署RS默认网关指向LVS的内网IP特点优LVS和RS可跨网段解决了DR模式的网络限制缺进出流量都经过LVS性能折中五、LVS的13种调度算法LVS内核支持丰富的调度算法可分为静态算法和动态算法两类。静态算法不检查RS负载状态算法缩写原理适用场景轮询rr按顺序轮流分配RS性能一致时加权轮询wrr按权重比例分配RS性能有差异时目标地址散列dh同一目标IP固定到同一RS缓存服务器源地址散列sh同一源IP固定到同一RS需要会话保持动态算法检查RS负载状态算法缩写原理适用场景最小连接lc分配给连接数最少的RS长连接服务加权最小连接wlc按权重比例优先给连接数少的通用推荐最短期望延迟sed特殊wlc算法除以权重高性能场景永不排队nqsed优化版无空闲时不排队防止空闲RS等待局部最小连接lblc同一目标IP到同一RS的lc带缓存的Web带复制的局部最小连接lblcr先找目标IP找不到再用lc大规模缓存目标地址散列dh目标IP哈希防火墙集群源地址散列sh源IP哈希会话保持最少队列调度seq等待队列最短的优先算法选择建议# 最常用组合 # 短连接HTTPwlc 或 rr ipvsadm -A -t VIP:80 -s wlc # 长连接数据库lc ipvsadm -A -t VIP:3306 -s lc # 有缓存场景sh源地址哈希 ipvsadm -A -t VIP:80 -s sh六、LVS多端口轮询问题解决方案问题描述当后端服务有多个端口如HTTP的80和HTTPS的443我们需要将两种流量都负载均衡但LVS的传统做法是每个端口单独配置# 80端口 ipvsadm -A -t VIP:80 -s rr ipvsadm -a -t VIP:80 -r RS1:80 -m ipvsadm -a -t VIP:80 -r RS2:80 -m # 443端口 ipvsadm -A -t VIP:443 -s rr ipvsadm -a -t VIP:443 -r RS1:443 -m ipvsadm -a -t VIP:443 -r RS2:443 -m缺端口越多配置越繁琐且无法实现一组RS同时支持多个端口的策略统一。解决方案一防火墙标记FWM利用iptables给多个端口打上相同的防火墙标记LVS基于标记进行调度# 1. 用iptables给80和443端口打标记66 iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 80 -j MARK --set-mark 66 iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 443 -j MARK --set-mark 66 # 2. LVS使用-f指定防火墙标记而非端口 ipvsadm -A -f 66 -s rr # 3. 添加RS使用实际端口 ipvsadm -a -f 66 -r RS1:80 -m ipvsadm -a -f 66 -r RS2:80 -m # 443同理 ipvsadm -a -f 66 -r RS1:443 -m ipvsadm -a -f 66 -r RS2:443 -m优多个端口共享同一组调度策略和会话保持。解决方案二配置文件中统一管理# /etc/sysconfig/ipvsadm 配置示例 -A -f 66 -s wlc -a -f 66 -r 192.168.0.10:80 -m -w 2 -a -f 66 -r 192.168.0.10:443 -m -w 2 -a -f 66 -r 192.168.0.20:80 -m -w 1 -a -f 66 -r 192.168.0.20:443 -m -w 1七、LVS会话粘滞解决方案问题描述会话粘滞Session Sticky用户登录后后续请求必须转发到同一台RS否则会出现未登录或购物车丢失等问题。LVS默认的轮询算法会导致同一用户的请求被分发到不同RS造成会话失效。解决方案方案一源地址哈希sh算法 — 简单有效# 使用源地址哈希同一源IP始终到同一RS ipvsadm -A -t VIP:80 -s sh ipvsadm -a -t VIP:80 -r RS1 -m ipvsadm -a -t VIP:80 -r RS2 -m优点配置简单无额外开销缺点若RS宕机该IP的所有用户都会受影响无法解决NAT网络下多用户共享IP的问题方案二持久连接-p参数# 指定持久超时时间单位秒 ipvsadm -A -t VIP:80 -s rr -p 300 ipvsadm -a -t VIP:80 -r RS1 -m ipvsadm -a -t VIP:80 -r RS2 -m原理LVS在内存中维护一个连接跟踪表记录源IP→选定RS的映射超时时间内同一源IP的请求都发往同一RS。适用配合其他调度算法如wlc使用兼顾负载均衡和会话保持。方案三防火墙标记 持久连接解决多端口会话# 80和443标记为66 iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 80 -j MARK --set-mark 66 iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 443 -j MARK --set-mark 66 # LVS使用标记并开启持久 ipvsadm -A -f 66 -s rr -p 600 ipvsadm -a -f 66 -r RS1 -m ipvsadm -a -f 66 -r RS2 -m效果用户从HTTP跳转到HTTPS时仍然保持在同一台RS不会丢失会话。方案四应用层会话共享终极方案将Session存储在Redis/Memcached等共享缓存中后端RS无论哪台处理都能读取到用户会话。优点彻底解决粘滞问题后端RS可随意扩缩容缺点需要修改应用程序代码八、一键配置脚本实战以下是一个规范化的Bash脚本涵盖了LVS四种模式配置、算法切换、防火墙标记和会话保持等所有核心功能。#!/bin/bash # LVS 四种模式及高级功能完整配置脚本 (重构版) # 适用场景学习/测试 LVS 各项核心配置 # 基于截图内容整理添加了环境检查与逻辑控制 # 1. 基础环境变量 (按需修改) VIP172.25.254.100 RS1172.25.254.10 RS2172.25.254.11 INTERFACEeth0 # 若VIP绑定的网卡名称不一致请修改这里 # 2. 基础环境安装 (所有模式通用) install_env() { echo 开始安装 LVS 基础环境... # 截图中的 yum 或 apt此处用最通用的判断 if command -v yum /dev/null; then yum install -y ipvsadm elif command -v apt /dev/null; then apt update apt install -y ipvsadm else echo 不支持的系统包管理器请手动安装 ipvsadm exit 1 fi # 开启 IP 转发 (NAT 模式必须) echo 1 /proc/sys/net/ipv4/ip_forward echo 环境安装完成。 } # 3. 规则清理 (每次切换模式前执行) clear_rules() { echo 清空所有已有的 LVS 规则和绑定... ipvsadm -C ip addr del $VIP/32 dev $INTERFACE 2/dev/null echo 规则已清空。 } # 4. 四种核心模式配置函数 # 模式 A: NAT 模式 (配置 VIP 在 Director 上后端 RS 网关指向 Director) conf_nat() { clear_rules echo 配置 NAT 模式... ip addr add $VIP/32 dev $INTERFACE ipvsadm -A -t $VIP:80 -s rr ipvsadm -a -t $VIP:80 -r $RS1:80 -m ipvsadm -a -t $VIP:80 -r $RS2:80 -m # NAT 模式下后端 RS 的网关必须指向 Director 的 DIP需在 RS 手动配置 echo 注意NAT 模式请确保 RS 的默认网关指向本机内网 IP。 } # 模式 B: DR 模式 (企业常用VIP 绑定在 Lo 网卡抑制 ARP) conf_dr() { clear_rules echo 配置 DR 模式... # Director 上绑定 VIP ip addr add $VIP/32 dev $INTERFACE ipvsadm -A -t $VIP:80 -s rr ipvsadm -a -t $VIP:80 -r $RS1:80 -g ipvsadm -a -t $VIP:80 -r $RS2:80 -g echo 注意DR 模式需要在 RS 上执行以下命令 echo ip addr add $VIP/32 dev lo:0 echo echo 1 /proc/sys/net/ipv4/conf/lo/arp_ignore echo echo 2 /proc/sys/net/ipv4/conf/lo/arp_announce echo echo 1 /proc/sys/net/ipv4/conf/all/arp_ignore echo echo 2 /proc/sys/net/ipv4/conf/all/arp_announce } # 模式 C: TUN 模式 (IP 隧道) conf_tun() { clear_rules echo 配置 TUN (隧道) 模式... ip addr add $VIP/32 dev $INTERFACE ipvsadm -A -t $VIP:80 -s rr ipvsadm -a -t $VIP:80 -r $RS1:80 -i ipvsadm -a -t $VIP:80 -r $RS2:80 -i echo 注意TUN 模式需要 RS 支持隧道并配置 tunl0。 } # 模式 D: FULLNAT 模式 conf_fullnat() { clear_rules echo 配置 FULLNAT 模式 (需内核支持)... ip addr add $VIP/32 dev $INTERFACE ipvsadm -A -t $VIP:80 -s rr ipvsadm -a -t $VIP:80 -r $RS1:80 -f ipvsadm -a -t $VIP:80 -r $RS2:80 -f echo 注意FULLNAT 需要特殊的内核补丁 (如 LVS 全 NAT 版本)。 } # 5. 调度算法切换 (常用: 轮询 rr / 加权 wlc) # 用法示例change_algo wlc change_algo() { local new_algo$1 echo 正在将调度算法切换为: $new_algo # 需要先用 -E 编辑虚拟服务来修改调度算法 ipvsadm -E -t $VIP:80 -s $new_algo # 用 -e 编辑真实服务器保持后端权重等属性 ipvsadm -e -t $VIP:80 -r $RS1:80 -m -w 1 ipvsadm -e -t $VIP:80 -r $RS2:80 -m -w 2 echo 算法切换完成。 } # 6. 端口轮询 / FWMARK (防火墙标记) # 示例标记 80 和 443 为一组 conf_fwmark() { clear_rules echo 配置 FWMARK 标准解决多端口轮询问题... # 1. 配置 iptables 进行端口标记 iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 10 iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 10 # 2. 配置 LVS 按 FWMARK 转发 ipvsadm -A -f 10 -s rr ipvsadm -a -f 10 -r $RS1:80 -m ipvsadm -a -f 10 -r $RS2:80 -m echo FWMARK 配置完成。 } # 7. 会话保持 (粘滞 Persistent) # 方案 1: SH (源地址哈希) conf_sh_affinity() { clear_rules echo 配置 SH 哈希会话保持... ipvsadm -A -t $VIP:80 -s sh ipvsadm -a -t $VIP:80 -r $RS1:80 -g -w 1 ipvsadm -a -t $VIP:80 -r $RS2:80 -g -w 2 } # 方案 2: 持久化超时 (LVS 原生) conf_timeout_persistence() { clear_rules local persist_time300 # 设置 300 秒持久化 echo 配置 LVS 持久化超时 ($persist_time 秒)... ipvsadm -A -t $VIP:80 -s rr -p $persist_time ipvsadm -a -t $VIP:80 -r $RS1:80 -m ipvsadm -a -t $VIP:80 -r $RS2:80 -m } # 方案 3: Redis 共享会话 (仅提示LVS 只负责转发) conf_redis_session() { echo Redis 共享会话方案 (无需修改 LVS) echo 此方案不依赖 LVS 配置而是修改后端 Web 应用 (如 PHP/Java) 的 Session 存储。 echo LVS 无需特意配置持久化只需用轮询 rr/wlc应用层通过 Redis 共享 Session 即可。 echo 这样故障时也无需担心 Session 丢失。 } # 8. 策略保存与开机自启 save_rules() { echo 保存当前 LVS 规则... ipvsadm-save /etc/sysconfig/ipvsadm echo 规则已保存至 /etc/sysconfig/ipvsadm echo 启用开机自启动... systemctl enable ipvsadm --now 2/dev/null || echo 请手动执行: systemctl enable ipvsadm } # 9. 查看当前规则 show_rules() { echo 当前 LVS 配置: ipvsadm -Ln echo 连接统计: ipvsadm -Ln --stats } # 10. 使用示例菜单 show_menu() { echo LVS 一键配置脚本菜单 echo 1. 安装基础环境 echo 2. 配置 NAT 模式 echo 3. 配置 DR 模式 echo 4. 配置 TUN 模式 echo 5. 配置 FULLNAT 模式 echo 6. 切换调度算法 (需指定算法名) echo 7. 配置 FWMARK 多端口负载均衡 echo 8. 配置 SH 源地址哈希会话保持 echo 9. 配置持久连接会话保持 echo 10. 保存规则并设置开机自启 echo 11. 查看当前规则 echo 12. 清空所有规则 echo 0. 退出 } # 主程序 (支持命令行参数和交互菜单) main() { # 如果带了参数直接执行对应功能 case $1 in install) install_env ;; nat) conf_nat ;; dr) conf_dr ;; tun) conf_tun ;; fullnat) conf_fullnat ;; algo) change_algo $2 ;; fwmark) conf_fwmark ;; sh) conf_sh_affinity ;; persist) conf_timeout_persistence ;; save) save_rules ;; show) show_rules ;; clear) clear_rules ;; *) # 没有参数则显示交互菜单 while true; do show_menu read -p 请输入选项编号: choice case $choice in 1) install_env ;; 2) conf_nat ;; 3) conf_dr ;; 4) conf_tun ;; 5) conf_fullnat ;; 6) read -p 请输入算法名 (rr/wlc/wrr/sed/nq等): algo; change_algo $algo ;; 7) conf_fwmark ;; 8) conf_sh_affinity ;; 9) conf_timeout_persistence ;; 10) save_rules ;; 11) show_rules ;; 12) clear_rules ;; 0) echo 退出...; exit 0 ;; *) echo 无效选项请重新输入 ;; esac echo done ;; esac } # 执行主程序 main $