LVS (Linux virtual server)

LVS (Linux Virtual Server),是LInux内核层实现的高性能、高可用的负载均衡,核心作用是将前端的请求流量分发到后端多台真实服务器上,提高服务的并发处理能力和可用性
一.LVS运行原理
1.1 LVS集群体系结构

1.2 LVS的相关概念
- VS(Virtual Server):调度器
- RS(Real Server):业务服务器
- CIP(Client IP):客户端的IP
- VIP(Virtual server IP):外网的IP,用于客户访问
- DIP(Director IP)内网的IP,调度器负责访问内网的IP
- RIP(Real Server IP):真实的业务服务器
访问流程:CIP <---> VIP === DIP <---> RIP
1.2.1 LVS的部署命令
程序包:ipvsadm
1.2.1.1 ipvsadm命令
核心功能:
- 集群服务管理:增 删 改
- 集群服务的RS管理:增 删 改
- 查看
命令参数
bash
# 管理集群服务
ipvsadm -A(添加)|E(编辑) -t(tcp)| u(udp)|f(防火墙标签)
service-address(集群地址)
[-s scheduler(调度算法)]
[-p [timeout]] 会话持久
[-M netmask] 掩码
[--pepersistence_engine] 引擎类型
[-b sched-flags] 标记
ipvsadm -D -t|u|f service-address 删除
ipvsadm -C 清空
ipvsadm -R 重载
ipvsadm -S 保存
1.2.1.2 LVS集群中的增删改
1,管理集群服务中的增删改
ipvsadm -A | E | u | f service-address
bash
-A 添加
-E 修改
-t tcp服务
-u udp服务
-s 指定调度算法,默认为WLC
-p 设置持久连接超时
-f 火墙标记,是一个数字
2,管理集群中RealServer的增删改
ipvsadm -a|-e -t|-u|f service-address ...
bash
-a 添加realserver
-e 修改realserver
-t tcp协议
-u udp协议
-f 火墙标记
-r realserver地址
-g 直连路由模式
-i ip隧道模式
-m nat模式
-w 设置权重
-Z 清空计数器
-C 清空LVS策略
-L 列出LVS策略
--rate 输出速率信息
1.3 LVS集群的类型
LVS-NAT:修改请求报文的目标IP,多目标的DNAT
LVS-DR:封装新的MAC地址
LVS-TUN:在请求报文IP报文之外新加一个IP首部
LVS-FULLNAT:修改请求报文的源和目标IP
1.3.1 NAT模式
-
本质是多目标IP的DNAT,修改请求报文中的目标地址和目标端口修改为挑出的RS的RIP和PORT实现转发
-
RIP和DIP应在同一个网络,且使用私网地址;RS的网关要指向DIP
-
请求报文和响应报文都必须经由Director转发
-
支持端口映射,可修改的请求报文的目标PORT
-
VS必须是liunx系统,RS可以是任意OS系统
1.3.1.1 NAT模式数据逻辑

1,客户端发送请求,数据包中包含源IP,目标IP和访问端口(9000)
2,VS服务器收到请求后,把数据包中的DIP的VIP换为RS的RIP和相应端口
3,RS1响应请求,发送应答数据包,包中包含DIP,SIP,PORT(9000)
4,VS收到应答报文,改变包中的数据来源DIP改为VIP,目标端口改为80,然后传回给客户端
1.3.1.2 NAT模式集群案例

1,VS调度器采用双网卡,一个是NAT 连接外网,一个是仅主机网卡与后端的服务器相连
2,Web服务器网关指向DIP,并且不需要连接外网
1.3.1.2.1 实验环境
| 主机名 | IP | VIP | 角色 |
|---|---|---|---|
| LVS | 192.168.146.100 | 192.168.136.100 | 调度器(VS) |
| RS1 | 192.168.146.10,GW192.168.146.100 | null | 后端服务器1 |
| RS2 | 192.168.146.20,GW192.168.146.100 | null | 后端服务器2 |
| Node | 192.168.136.10 | 测试机 |
1.3.1.2.2 配置命令
注意:RS的网关是DIP
1,RS1
[root@RS1 ~]# yum install httpd
[root@RS1 ~]# echo RS1 > /var/www/html/index.html
[root@RS1 ~]# systemctl enable --now httpd
2,RS2
[root@RS2 ~]# yum install httpd
[root@RS2 ~]# echo RS2 > /var/www/html/index.html
[root@RS2 ~]# systemctl enable --now http
3,LVS调度器
bash
[root@LVS ~]# yum install ipvsadm.x86_64 -y
[root@LVS ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@LVS ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@LVS ~]# ipvsadm -A -t 192.168.136.100:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.136.100:80 -r 192.168.146.10:80 -m -w 1
[root@LVS ~]# ipvsadm -a -t 192.168.136.100:80 -r 192.168.146.20:80 -m -w 1
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.136.100:80 wrr
-> 192.168.146.10:80 Masq 1 0 0
-> 192.168.146.20:80 Masq 1 0 0
[root@LVS ~]# systemctl enable --now ipvsadm.service
# 测试
# 修改权重
[root@LVS ~]# ipvsadm -e -t 192.168.136.100:80 -r 192.168.146.10:80 -m -w 2
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.136.100:80 wrr
-> 192.168.146.10:80 Masq 2 0 0
-> 192.168.146.20:80 Masq 1 0 0
[root@LVS ~]# for i in {1..10};do curl 192.168.136.100;done
RS1
RS2
RS1
RS2
RS1
RS2
RS1
RS2
RS1
RS2
# 修改权重
[root@LVS ~]# ipvsadm -e -t 192.168.136.100:80 -r 192.168.146.10:80 -m -w 2
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.136.100:80 wrr
-> 192.168.146.10:80 Masq 2 0 0
-> 192.168.146.20:80 Masq 1 0 0
[root@LVS ~]#
[root@LVS ~]# for i in {1..10};do curl 192.168.136.100;done
RS2
RS1
RS1
RS2
RS1
RS1
RS2
RS1
RS1
RS2

1.3.2 DR模式
DR:Direct Routing,直接路由,LVS默认模式(应用最广泛),通过给请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口MAC,目标MAC是某挑选出RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
1.3.2.1 DR模式数据逻辑

在DR模式中,RS接收到访问请求后不需要回传给LVS调度器,直接把数据回传给Client,所有RS和VS上都要有VIP
1.3.2.2 DR模式数据传输过程

1,客户端发送请求报文给到VS调度器,内容为客户端IP+客户端MAC+VIP+VIP的MAC
2,VS调度器接收到报文后把里面的VIP的MAC改为RS1的MAC,
3,RS1回复响应报文,数据包中内容为VIP+RS1的MAC+客户端IP+客户端IP的MAC
1.3.2.3 DR模式的特点
1,Director和各RS都配置有VIP
2,确保前端路由器将目标IP为VIP的请求报文发往Director
3, 在前端网关做静态绑定VIP和Director的MAC地址
4,RS的RIP可以使用私网地址,也可以是公网地址;RIP和DIP在同一IP网络;
5,RIP的网关不能指向DIP,以确保响应报文不会经由Director
6,RS和Director要在同一个物理网络
7,响应报文直接发往Client
8,不支持端口映射
1.3.2.4 部署DR模式集群案例
1.3.2.4.1 实验环境

1.3.2.4.2 配置命令
RS的配置与NAT模式的配置相同
1,DR
bash
# 开启内核路由功能
[root@DR ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1
# 数据转发策略
[root@DR ~]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.146.100
[root@DR ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.136.100
# 配置网络
[root@DR ~]# sh vmset.sh eth0 192.168.136.100 DR
[root@DR ~]# sh vmset.sh eth1 192.168.146.10 DR
2,LVS(调度器)
bash
# 添加VIP
[root@LVS ~]# vim /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.146.100/32 # vip
# 注意网关
[root@LVS ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=cdf80ff8-490d-4a3e-a1ec-90910407a6e7
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address1=192.168.146.200/24,192.168.146.10 # 网关为DR对内网卡的IP
dns=8.8.8.8
# 添加策略
[root@LVS ~]# ipvsadm -A -t 192.168.146.100:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.146.100:80 -r 192.168.146.101:80 -g
[root@LVS ~]# ipvsadm -a -t 192.168.146.100:80 -r 192.168.146.102:80 -g
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.146.100:80 wrr
-> 192.168.146.101:80 Route 1 0 0
-> 192.168.146.102:80 Route 1 0 0
# 测试
[Administrator.WIN-G01HRFS4OB1] ⮞ for N in {1..6};do curl 192.168.146.100;done
RS2
RS1
RS2
RS1
RS2
RS1

1.3.3 TUN模式
转发方式:不修改请求报文的IP头部,而在IP头部另外封装一个IP头部,将报文发往挑选出的目标RS;RS直接响应给客户端
1.3.3.1 TUN模式数据传输过程

1,客户端发送请求报文,包含源IP+VIP+端口
2,到达VS调度器给客户端发来的数据重新添加IP报文头部,添加的报文头部包含DIP+RS发送到对应的RS
3,RS收到调度器发送的数据包做出响应,生成的响应包含VIP+CIP+port,直接传输给client
1.3.3.2 TUN模式特点
1,DIP,VIP,RIP都是公网地址
2,RS的网关一般不能指向DIP
3,请求报文要经由Director,但响应是直接给Director
4,不支持端口映射
5,RS的OS必须支持隧道功能
1.3.4 Fullnet 模式

fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
1.4 LVS工作模式总结
| NAT模式 | TUN模式 | DR模式 | |
|---|---|---|---|
| RS操作系统 | 不限 | 支持隧道 | 禁用arp |
| 调度器和服务器网络 | 可跨网络 | 可跨网络 | 不可跨网络 |
| 调度服务器数量服务器数量 | 少 | 多 | 多 |
| RS服务器网关 | 指向到调度器DIP | 指向到路由 | 指向到路由 |
- LVS-NAT与LVS-fullnat:请求和响应报文都经由Director
- LVS-NAT:RIP的网关要指向DIP
- LVS-Fullnat:RIP和DIP未必在同一网络,但要能通信
- LVS-DR和LVS-TUN:请求报文要经由Director,但响应报文由RS直接发往Client
- LVS-DR:通过封装新的MAC首部实现,通过MAC网络转发
- LVS-TUN:通过在源IP报文首部添加新IP头部转发,实现远距离传输
1.5 LVS调度算法
1.5.1 LVS调度算法类型
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态和动态算法
静态算法:仅根据算法本身进行调度,不考虑RS的负载情况
动态算法:主要依据RS的当前负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1.5.2 LVS静态调度算法
1,RR:Roundrobin轮询 RS将被分别调度,RS配置有差别时不推荐
2,WRR:Weight Roundrobin ,加权轮询 根据RS的配置进行加权调度
3,SH:Source Hashing ,实现session sticky,源地址hash,将来自于同一个IP地址的请求始终发往第一次挑选中的RS,实现会话绑定
4,DH:Destination Hashing 目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS
1.5.3 LVS动态调度算法
主要依据当前RS的负载状态进行调度
1,LC(Least Connections --- 最少连接法)
适用于长连接应用Overhead(负载值)= activeconns(活动连接数)* 256 + inactiveconns(而非活动连接数)
2,WLC(Weight LC --- 权重最少连接)
默认调度方法为Onerhead=(connections * 256 + inconnections)/weight
3,SDE:Shortest Expection Delay
初始连接高权重优先Overhead=(activeconns + 1 + inactiveconns) * 256 / weight
4,NQ:Never Queue,第一轮均匀分配,后续SED
5,LBLC:Locality-Based LC,动态的DH算法
6,LBLCR:LBLC with Reolication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的