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

相关推荐
2601_9491465310 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天10 小时前
大模型幻觉问题
运维·服务器
Gofarlic_OMS11 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师11 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
dixiuapp11 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
Elastic 中国社区官方博客11 小时前
如何防御你的 RAG 系统免受上下文投毒攻击
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索
小锋学长生活大爆炸11 小时前
【教程】免Root在Termux上安装Docker
运维·docker·容器
进击切图仔11 小时前
常用 Docker 命令备份
运维·docker·容器
NotStrandedYet12 小时前
《国产系统运维笔记》第8期:挑战国产化流媒体部署——银河麒麟+龙芯架构编译SRS实战全记录
运维·kylin·国产化·银河麒麟·龙芯·信创运维·srs编译安装
默|笙13 小时前
【Linux】fd_重定向本质
linux·运维·服务器