1 Linux Virtual Server简介

1.1 LVS介绍

  • LVS是一个开源的负载均衡解决方案,本质上是运行在Linux操作系统上的应用程序

  • LVS的主要目标是购机哪一个高性能、高可用性的服务器集群,以提供可靠的服务

  • LVS官网:https://www.linuxvirtualserver.org/

  • LVS相关术语

    • VS:Virtual Server,负责调度
    • RS:Real Server,负责真正提供服务

1.2 LVS的核心组件

  • IPVS(IP Virtual Server,IP虚拟服务器):
    • 这是LVS的核心实现,它工作在内核空间中
    • 实际上是一个嵌入在Linux内核中增强了Layer4(传输层,如TCP/UDP)负载均衡的代码模块
    • 负责根据预先设定的调度算法,将发往虚拟机IP地址(VIP,即对外提供服务的IP地址)的网络连接,重定向到后端的真实服务器(RS)上
  • ipvsadm:
    • 这是用户空间中的一个管理工具
    • 它的作用类似于配置防火墙的iptables工具,用于管理员在命令行中定义和管理负载均衡的规则,比如:定义虚拟服务、添加后端真实服务器、指定调度算法等

1.3 LVS工作原理

VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选某RS。LVS是内核级功能,工作在INPUT链的位置,将法网INPUT的流量进行”处理“

1.4 LVS调度算法

静态算法(仅根据规则分配)

  • rr:轮询,请求依次分配
  • wrr:加权轮询,按权重分配
  • dh:目标地址哈希,同一IP始终发往同一RS
  • sh:源地址哈希,同一客户端始终发往同一RS

动态算法(根据负载情况分配)

  • lc:最少连接,分配给连接数最少的RS
  • wlc:加权最少连接(默认算法)
  • lblc:基于本地的最少连接
  • lblcr:带复制的基于本地的最少连接

2 LVS工作模式及其简单配置

  • lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
  • lvs-dr:操纵分装新的MAC地址,MAC头的修改
  • lvs-tun:在原请求IP报文之外新加一个IP首部
  • lvs-fullnat:修改请求报文的源和目标IP

快速选择指南

场景 推荐模式
小型集群,服务器在同一网段 DR模式(性能最好)
服务器需隐藏IP,LVS做网关 NAT模式(配置简单)
服务器跨机房部署 TUN模式
需要端口映射 NAT或FULLNAT

2.1 LVS的NAT(Network Address Translation,网络地址转换)模式

  • 原理:负载均衡作为网关。用户的请求进来,经过负载均衡器修改目标IP地址(从VIP改为RIP),然后转发给后端服务器。后端服务器的响应数据也必须先返回给负载均衡器,再由负载均衡器修改源IP地址后再发送给用户
  • 优点:后端服务器可以运行在私有IP地址上,比较安全;配置相对简单
  • 缺点:所有流量进出都经过负载均衡器,当访问量巨大时,负载均衡器本身很容易成为瓶颈

2.1.1 NAT的简单配置

  • 需要的设备:一台NAT模式加仅主机模式的LVS,两台仅主机模式RS,其中LVS需要作为RS的网关

  • 首先,要保证两台RS都可以上网

#开启Linux内核的IP转发功能
[root@LB ~]# cat /etc/sysctl.conf
...
net.ipv4.ip_forward = 1
...
#重新加载/etc/sysctl.conf配置文件
[root@LB ~]# sysctl -p
net.ipv4.ip_forward = 1
#-t nat:操作nat表(网络地址转换表)
#-A PSTOROUTING:在POSTROUTE链末尾添加规则
#-j MASQUREADE:伪装,将源IP磁环为出口的网卡IP
[root@LB ~]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE
[root@LB ~]# ip route
#dufault:默认录由(当访问任何不在直连网络的目标时使用)
#via 192.168.122.134:下一跳网关IP是LVS调度器的内网IP
#dev ens160:通过ens160这个网卡发送数据
#proto static:这条录由是手动静态添加的
#metric 100:录由优先级
default via 192.168.122.134 dev ens160 proto static metric 100 
192.168.122.0/24 dev ens160 proto kernel scope link src 192.168.122.135 metric 100
[root@web01 ~]# ping -c 3 qq.com
PING qq.com (113.108.81.189) 56(84) bytes of data.
64 bytes from 113.108.81.189 (113.108.81.189): icmp_seq=1 ttl=127 time=51.1 ms
64 bytes from 113.108.81.189 (113.108.81.189): icmp_seq=2 ttl=127 time=42.2 ms
64 bytes from 113.108.81.189 (113.108.81.189): icmp_seq=3 ttl=127 time=43.0 ms
  • 配置lvs
[root@LB ~]# yum -y install ipvsadm

[root@LB ~]# systemctl cat ipvsadm
# /usr/lib/systemd/system/ipvsadm.service
[Unit]
Description=Initialise the Linux Virtual Server
After=syslog.target network.target

[Service]
Type=oneshot
#启动的时候讲规则导入
ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"
#退出的时候将规则保存,并清空规
ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"
ExecStop=/sbin/ipvsadm -C
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • 配置lvs-nat规则
# -A 添加一个负载均衡集群
# -t 指定集群的入口地址和端口号,使用tcp
# -s 指定算法是rr轮询
# -p 指定同一客户端的请求在120秒内发往同一RS
[root@LB ~]# ipvsadm -A -t 192.168.140.137:80 -s rr -p 120

# -a 添加RS
# -m masquerade,使用NAT模式
# -g 是DR模式
# -i 是TUN模式
[root@LB ~]# ipvsadm -a -t 192.168.140.137:80 -r 192.168.122.135:80 -m

#查看lvs-nat的配置
[root@LB ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.140.137:80 rr
  -> 192.168.122.135:80           Masq    1      0          0         
  -> 192.168.122.136:80           Masq    1      0          0
  • 访问测试
C:\Users\金鱼游时烟花起>curl 192.168.140.137

访问测试

2.2 LVS的DR模式

  • 原理:LVS通过修改数据包的MAC地址实现请求转发,并利用真实服务器直接响应给客户端
  • 优点
    • 性能极高:调度器仅处理入站请求,出站流量由各RS独立处理,极大地降低了调度器的负载,支持大规模并发
    • 可扩展性强:系统吞吐量可通过增加后端真实服务器来线性扩展
    • 支持大多数操作系统:后端服务器只需支持TCP/IP协议栈,并能配置VIP抑制即可
  • 缺点:
    • 网络限制:所有的服务器必须在同一个物理网段(VLAN),无法跨地域部署
    • 后端配置复杂:需要在每台真实服务器上进行ARP抑制配置,增加了运维复杂性
    • 不支持端口映射:调度器转发时只修改MAC地址,不修改IP或端口,因此后端服务的端口必须与VIP的端口一致(例如:VIP的80端口只能转发给RS的80端口)

2.2.1 DR模式下数据包的传输

  • 这里以一台LVS,两台RS为例
  • LVS具有两个IP,一个本机ip,一个lo接口上的vip
  • RS在lo网卡上配置vip
  • 当有cip访问vip时,询问:”谁有vip“,由于RS禁止了arp,LVS做回应
  • LVS查询lvs表,然后修改mac地址发往RS
  • 数据包根据mac地址找到RS,RS拆包,lo发现目的ip地址是自己的,做出处理回应
  • 处理完成后,直接回复给客户端,响应不经过LVS

2.2.2 DR的简单配置

  • 需要的设备:一台LVS,两台RS
  • 修改RS的arp通告以及应答级别
    • IP地址冲突是通过arp发现是,关闭了就不会发现
[root@web01 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web01 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  • 给web01和web02都添加一个VIP到虚拟接口上
[root@web01 ~]# nmcli connection modify lo +ipv4.address 192.168.140.121/32
[root@web01 ~]# nmcli d reapply lo
  • 配置LB服务器
[root@LB ~]# nmcli connection modify lo +ipv4.address 192.168.140.121/32
[root@LB ~]# nmcli d reapply lo
[root@LB ~]# ipvsadm -A -t 192.168.140.121:80 -s rr -p 120
[root@LB ~]# ipvsadm -a -t 192.168.140.121:80 -r 192.168.140.138 -g
[root@LB ~]# ipvsadm -a -t 192.168.140.121:80 -r 192.168.140.139 -g
[root@LB ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.140.121:80 rr
  -> 192.168.140.138:80           Route   1      0          0         
  -> 192.168.140.139:80           Route   1      0          0

2.3 LVS的TUN模式

  • lvs在收到数据后,在原数据包外面套用一个隧道的原和目的IP的封装,RS收到后,将外面的隧道封装拆开,处理数据,然后直接回复给客户端image

TUN模式

2.4 LVS的FULLNAT模式

  • 通过同时修改请求报文的源IP和目标地址IP进行转发

3 各种模式对比

特性 NAT 模式 DR 模式 TUN 模式 FullNAT 模式
核心原理 修改数据包目标 IP (DNAT) 修改数据帧目标 MAC 在原 IP 包外二次封装 IP 头 同时修改源 IP 和目标 IP
数据入路径 客户端 → LVS → RS 客户端 → LVS → RS 客户端 → LVS → RS 客户端 → LVS → RS
数据出路径 RS → LVS → 客户端 RS → 客户端 (直接返回) RS → 客户端 (直接返回) RS → LVS → 客户端
LVS 负载压力 很大(处理双向流量) 极小(仅处理入站) 较小(仅处理入站) 很大(处理双向流量)
网络要求 RS 和 LVS 必须在同一子网 必须同一二层网络 (LAN) 三层路由可达 (可跨机房) 三层路由可达 (极灵活)
RS 网关设置 指向 LVS 的内网 IP 指向公网默认网关 指向公网默认网关 无需特殊设置
RS 特殊配置 需配置 VIP 并抑制 ARP 需配置 VIP 并支持 IPIP 协议 无 (如需 IP 则需加载 TOA)
跨网段能力 不支持 不支持 支持 完美支持
性能排名 4 (最低) 1 (最高) 2 3