LVS四层负载均衡

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负载不均衡问题,从负载重的复制到负载轻的

相关推荐
梦想很大很大8 小时前
拒绝“盲猜式”调优:在 Go Gin 项目中落地 OpenTelemetry 链路追踪
运维·后端·go
Sinclair9 小时前
内网服务器离线安装 Nginx+PHP+MySQL 的方法
运维
叶落阁主9 小时前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
甲鱼9292 天前
MySQL 实战手记:日志管理与主从复制搭建全指南
运维
碳基沙盒4 天前
OpenClaw 多 Agent 配置实战指南
运维
蝎子莱莱爱打怪7 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
DianSan_ERP7 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅7 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒7 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器
zhangfeng11337 天前
趋动云 如何ssh登录 服务区 项目server
运维·人工智能·ssh