Linux Virtual Server (LVS) 负载均衡集群笔记

笔记说明:本文档旨在系统性地梳理LVS的核心概念、工作原理、调度算法,并提供NAT与DR模式的详细实验步骤,作为学习和配置LVS的参考手册。

一、LVS 核心概念与原理

1.1 LVS是什么

LVS (Linux Virtual Server) 是集成于Linux内核的高性能、高可用的负载均衡集群解决方案,由章文嵩博士发起。其核心作用是将客户端的大量请求,根据指定的策略,智能地分发到后端的多台真实服务器(Real Server,RS) 上,从而提升整个系统的并发处理能力和整体可用性。

1.2 核心术语

理解以下IP地址角色是掌握LVS的基础:

  • CIP (Client IP):客户端的IP地址。

  • VIP (Virtual IP):虚拟IP地址,是负载均衡集群对外提供服务的统一IP。

  • DIP (Director IP):调度器(LVS服务器)与内网真实服务器通信所使用的IP。

  • RIP (Real Server IP):后端真实服务器的IP地址。

  • VS (Virtual Server):虚拟服务器,即运行LVS的调度器本身。

  • RS (Real Server):真实服务器,实际处理请求的服务器。

一个完整的请求流转路径通常为:CIP -> VIP (VS) -> DIP -> RIP (RS)

1.3 LVS的四种工作模式深度解析

LVS根据报文转发和响应方式的不同,主要有四种工作模式:

  1. LVS-NAT (网络地址转换)

    • 原理:调度器作为网关。请求进入时,VS将报文目标地址从VIP改为选中的RIP (DNAT);响应返回时,VS再将源地址从RIP改回VIP (SNAT) 返回客户端。

    • 数据流Client -> VS (DNAT) -> RS -> VS (SNAT) -> Client

    • 特点

      • RS的网关必须指向VS的DIP。

      • 请求和响应报文都必须经过VS,VS容易成为性能瓶颈

      • 支持端口映射。

  2. LVS-DR (直接路由) ------ 【生产环境最常用】

    • 原理 :VS仅将请求报文的目标MAC地址修改为选中RS的MAC地址,并将报文转发出去。RS处理后,直接将响应报文发送给客户端,不再经过VS

    • 数据流Client -> VS (改写MAC) -> RS -> Client

    • 关键配置

      1. RS必须在lo接口上绑定VIP。

      2. RS必须进行ARP抑制,防止其网卡直接响应客户端的ARP请求。推荐内核参数如下:

        bash 复制代码
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore      # 仅回答目标IP为接收网卡IP的ARP请求
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce   # 通告ARP时使用最合适的本地地址
    • 特点:性能极高,响应流量不经过VS。但要求VS与RS必须在同一物理网络(广播域),且不支持端口映射。

  3. LVS-TUN (IP隧道)

    • 原理:VS将原始的IP报文封装在一个新的IP报文中(源为DIP,目标为RIP),通过IP隧道发送给RS。RS解封装后,直接响应客户端。

    • 特点:支持跨地域部署(RIP和VIP可以为公网IP),但RS需支持并配置IP隧道协议。

  4. LVS-FULLNAT

    • 原理:VS同时修改请求报文的源地址(CIP -> DIP)和目标地址(VIP -> RIP)。响应报文同样经过VS,进行相反的地址转换。

    • 特点 :部署最灵活,RIP和DIP可以跨网络。但双向流量均经过VS,且需要内核补丁支持(非内核原生)。

  5. 四种模式对比表

特性 NAT DR TUN FULLNAT
RS与VS网络要求 同一网络 同一广播域 可跨网络 可跨网络
RS网关指向 必须指向VS 指向网关路由器 指向网关路由器 指向网关路由器
响应路径 经过VS 直连客户端 直连客户端 经过VS
端口映射 支持 不支持 不支持 支持
主要瓶颈 VS(双向流量) VS(仅处理请求) 隧道封装开销 VS(双向流量)
1.4 调度算法

调度算法决定了VS如何选择后端RS。

  • 静态算法 (不考虑RS当前负载)

    • RR (轮询):请求依次平均分配。

    • WRR (加权轮询):根据权重比例分配,权重高的RS获得更多请求。

    • SH (源地址哈希):来自同一CIP的请求始终发往同一RS,实现会话保持。

    • DH (目标地址哈希):根据请求的目标IP(如不同URL)进行哈希分发。

  • 动态算法 (考虑RS当前连接数等负载)

    • LC (最少连接):将请求分配给当前活动连接数最少的RS。

    • WLC (加权最少连接) :在LC基础上加入权重因素,是LVS的默认调度算法

    • SED (最短期望延迟):基于WLC优化,避免权重低的RS长期空闲。

    • NQ (永不排队):对SED的改进,如果有RS空闲,请求直接分配过去。

1.5 ipvsadm 命令速查

ipvsadm是用户空间用来配置LVS规则的工具。

  • 集群服务管理

    bash 复制代码
    ipvsadm -A|E -t|u|f <服务地址> [-s 调度器]  # 添加/修改虚拟服务(-t TCP, -u UDP, -f 防火墙标记)
    ipvsadm -D -t|u|f <服务地址>                # 删除虚拟服务
    ipvsadm -C                                  # 清空所有配置规则
    ipvsadm -S > /etc/sysconfig/ipvsadm         # 保存当前规则到文件
    ipvsadm -R < /etc/sysconfig/ipvsadm         # 从文件恢复规则
  • 真实服务器管理

    bash 复制代码
    ipvsadm -a|e -t|u|f <服务地址> -r <RS地址> [-g|i|m] [-w 权重]  # 添加/修改RS(-g DR, -i TUN, -m NAT)
    ipvsadm -d -t|u|f <服务地址> -r <RS地址>                       # 删除指定RS
    ipvsadm -L -n [--rate] [--stats] [--timeout]                  # 查看规则、连接数、统计信息等

二、LVS-NAT 模式集群实验

2.1 实验环境规划
  • VS (调度器):双网卡

    • eth0: 172.25.254.100 (对外VIP,连接客户端网络)

    • eth1: 192.168.0.100 (对内DIP,连接RS网络)

  • RS1 (真实服务器)192.168.0.10,网关指向 192.168.0.100,提供Web服务。

  • RS2 (真实服务器)192.168.0.20,网关指向 192.168.0.100,提供Web服务。

  • 客户端172.25.254.99,通过访问VIP 172.25.254.100 来测试。

2.2 实验步骤
  1. VS主机配置

    • 配置两个网卡的IP地址。

    • 开启内核IP转发功能:

      bash 复制代码
      echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf && sysctl -p
  2. RS1与RS2配置

    • 配置网卡IP地址,并设置网关为 192.168.0.100

    • 安装并启动HTTP服务,创建内容不同的测试页面。

      bash 复制代码
      # RS1
      echo "RS1 - 192.168.0.10" > /var/www/html/index.html
      # RS2
      echo "RS2 - 192.168.0.20" > /var/www/html/index.html
  3. 在VS上配置LVS规则

    bash 复制代码
    # 清空现有规则
    ipvsadm -C
    # 添加一个VIP的TCP服务,使用加权轮询算法
    ipvsadm -A -t 172.25.254.100:80 -s wrr
    # 添加两台RS,使用NAT模式(-m),并设置权重
    ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 1
    ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1
    # 查看配置结果
    ipvsadm -Ln
  4. 验证与持久化

    • 在客户端多次访问 http://172.25.254.100,应看到两个RS页面轮询出现。

    • 修改RS1权重为2,再次测试,RS1出现的频率应约为RS2的两倍。

    • 保存规则并设置开机自启:

      bash 复制代码
      ipvsadm -S > /etc/sysconfig/ipvsadm
      systemctl enable --now ipvsadm

三、LVS-DR 模式集群实验

3.1 实验环境规划
  • 路由器 (router):连接内外网,并配置SNAT。

    • eth0: 172.25.254.100 (连接客户端)

    • eth1: 192.168.0.100 (连接VS和RS)

  • VS (调度器)eth0 配置DIP和VIP。

    • DIP: 192.168.0.50/24

    • VIP: 192.168.0.200/24 (作为地址2添加)

  • RS1192.168.0.10/24,网关指向 192.168.0.100,lo接口绑定VIP。

  • RS2192.168.0.20/24,网关指向 192.168.0.100,lo接口绑定VIP。

  • 客户端172.25.254.99/24,网关指向 172.25.254.100

3.2 实验步骤
  1. 路由器 (router) 配置

    • 配置双网卡IP,开启IP转发。

    • 配置SNAT,确保内网服务器能访问外网,并让响应包能正确返回客户端。

      bash 复制代码
      iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100
      iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100
  2. 调度器 (vsnode) 配置

    • 配置DIP 192.168.0.50 和 网关 192.168.0.100

    • 在同一网卡上添加VIP 192.168.0.200/24 作为辅助地址(配置方法参考原文中的address2)。

  3. RS1 / RS2 配置

    • 基础网络 :配置RIP 192.168.0.x,网关指向路由器 192.168.0.100

    • 在lo接口绑定VIP :创建一个loopback类型的连接,并添加地址 192.168.0.200/32

      bash 复制代码
      # 示例:复制eth0配置并修改为loopback类型
      cp /etc/NetworkManager/system-connections/eth0.nmconnection /etc/NetworkManager/system-connections/lo.nmconnection
      # 编辑 lo.nmconnection,修改 type=loopback, interface-name=lo, address1=127.0.0.1/8, address2=192.168.0.200/32
    • ARP抑制这是DR模式成功的关键。 必须配置,防止RS的网卡响应针对VIP的ARP请求。

      bash 复制代码
      echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
      echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
      # 可写入 /etc/sysctl.conf 永久生效
  4. 在VS上配置LVS规则 (使用DR模式)

    bash 复制代码
    ipvsadm -C
    ipvsadm -A -t 192.168.0.200:80 -s rr  # VIP为192.168.0.200
    ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g    # -g 表示DR模式
    ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g
    ipvsadm -Ln
  5. 验证

    • 在客户端 172.25.254.99 上多次访问 http://192.168.0.200,应看到RS1和RS2的页面内容轮询出现。可以通过在RS上抓包或查看VS统计信息 (ipvsadm -Ln --stats) 来确认流量分发。

总结

LVS是构建高性能Linux服务器集群的强大工具。在生产环境中,DR模式 因其卓越的性能而应用最广,但其配置也相对复杂,关键在于ARP抑制 。NAT模式配置简单,适合小型或对性能要求不高的场景。掌握 ipvsadm 命令和四种模式的原理,是灵活运用LVS的基础。

相关推荐
老四啊laosi1 小时前
【Linux系统】15. 进程控制
linux·进程控制
Houz-2 小时前
【13180】 计算机操作系统第一章操作系统概论——第一节操作系统概念
笔记·职场和发展·学习方法
一只程序熊2 小时前
uniappx richtext img 图片无法显示
linux·服务器·数据库
三水不滴2 小时前
利用SpringCloud Gateway 重试 + 降级解决第三方接口频繁超时问题,提升性能
经验分享·笔记·后端·spring·spring cloud·gateway
charlie1145141912 小时前
嵌入式C++教程——Lambda捕获与性能影响
开发语言·c++·笔记·嵌入式·现代c++·工程实践
Felven2 小时前
国产沐创N20 100G网卡性能测试
linux·性能测试·国产100g网卡·沐创
一目Leizi2 小时前
澳洲 IoT 网络安全规则(Cyber Security 2025)与英国 PSTI 笔记
笔记·物联网·web安全
左左右右左右摇晃2 小时前
WebSocket 与 HTTP 的核心区别
笔记
senijusene2 小时前
Linux软件编程: 线程属性与线程间通信详解
java·linux·jvm·算法