当前位置: 首页 > news >正文

LVS(Linux virtual server)-实现四层负载均衡

一、简介

LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩,阿里的四层SLB(Server LoadBalance)是基 于LVS+keepalived实现

LVS 官网: http://www.linuxvirtualserver.org/

二、LVS运行原理

2.1LVS 的集群结构

2.2lvs相关概念

  • RS:Real Server
  • CIP:Client IP
  • VIP: Virtual serve IP VS(连接)外网的IP
  • DIP: Director IP VS内网的IP
  • RIP: Real server IP

访问流程:CIP ->VIP == DIP-> RIP

2.3LVS的集群类型

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

以上4种类型前2种常用

2.3.1nat模式

lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发

2.3.1.1nat模式流程图

  1. 客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口
  2. VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
  3. RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口
  4. VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)VS服务器把修改过报文的响应数据包回传给客户端
  5. lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
2.3.1.2模拟lvs-nat集群实验(三层IP和四层端口)
实验前准备
设备名称IP
client172.25.250.111
lvs172.25.250.100(VIP|NAT)、192.168.252.100(DIP|仅主机)
rs1192.168.252.10
rs2192.168.252.20
设备的相关配置

lvs 调度器

#配置VIP和DIP(双网卡)
DIP
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.252.100/24
method=manual#VIP
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
address1=172.25.250.100/24,172.25.250.2
method=manual#激活VIP和DIP
nmcli connection reload
nmcli connection up eth0
nmcli connection up eth1#安装ipvsadm
dnf install ipvsadm -y#编写调度策略
ipvsadm -A -t 172.25.250.100:80 -s rr
ipvsadm -a -t 172.25.250.100:80 -r 192.168.252.10:80 -m
ipvsadm -a -t 172.25.250.100:80 -r 192.168.252.20:80 -m
ipvsadm-save / /etc/sysconfig.conf/ipvsadm
#查看调度策略
ipvsadm  -Ln #开启路由内核转发功能
vim /etc/sysctl.conf net.ipv4.ip_forward=1  
sysctl -p

rs1/2

#配置RIP
#RIP
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.252.20/24,192.168.252.100 #lvs上仅主机的网卡上的IP
method=manual#激活rip
nmcli connection reload
nmcli connection up eth0
测试

用client测试得到以下结果

2.3.2LVS-DR模式

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

2.3.2.1DR模式流程图

在DR模式中,RS接收到访问请求后不需要回传给LVS调度器,直接把回传数据发送给client,所以RS和Lvs上都要有vip

  1. 客户端发送数据帧给Lvs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
  2. LVS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端的MAC+VIP+RS1的MAC
  3. RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的MAC
2.3.2.2模拟DR集群实验(玩二层MAC地址)
实验前准备
设备名称IP
172.25.250.111client客户端
172.25.250.100(nat)/192.168.252.100(仅主机)router的双网卡对应的ip
192.168.252.111lvs的DIP
192.168.252.10RS1-rip
192.168.252.20RS2-rip
192.168.252.200集群对外的VIP
相关设备的配置

client

仅需修改网关,把网关设置为routernat网卡上的IPvim /etc/NetworkManager/system-connections/eth0.nmconnection[connection]id=eth0type=ethernetinterface-name=eth0[ethernet][ipv4]address1=172.25.250.111/24,172.25.250.100method=manual

router
#开启内核路由转发sysctl -a | grep ipv4.ip_forward
net.ipv4.ip_forward = 1
sysctl -p #开启防火墙和地址伪装
systemctl start firewalld
firewall-cmd --add-masquerade     #地址伪装

lvs-dr
#配置DIP和VIP
DIP
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address0=192.168.252.111/24,192.168.252.100   #把网关设置为router仅网卡设备上的IP
====================================================================
VIP
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address0=192.168.252.200/32
address1=127.0.0.1/8
====================================================================
#激活DIP和VIP
nmcli connection reload
nmcli connection up eth0
nmcli connection up eth0    #可能会遇到激活网卡后无VIP情况,需要看网卡设备激活状况
nmcli connection show 
# 编写调度策略
ipvsadm -A -t 192.168.252.200:80 -s rr 
#-A:添加策略 -t:tcp  IP:虚拟IP  -s:调度算法 -rr:轮询
#调度后端真实服务器
ipvsadm -a -t 192.168.252.200:80 -r 192.168.252.10:80 -g
ipvsadm -a -t 192.168.252.200:80 -r 192.168.252.20:80 -g#调度策略做永久保存
ipvsadm-save > /etc/sysconfig/ipvsadm
[root@dr-lvs system-connections]# cat /etc/sysconfig/ipvsadm
-A -t dr-lvs:http -s rr
-a -t dr-lvs:http -r 192.168.252.10:http -g -w 1
-a -t dr-lvs:http -r 192.168.252.20:http -g -w 1#重启服务
systenctl start ipvssadm 
#关闭防火墙

RS1/2

#配置RIP和VIP
#RIP
[connection]
id=eth0
uuid=7ba00b1d-8cdd-30da-91ad-bb83ed4f7474
type=ethernet
interface-name=eth0
timestamp=1752646309[ipv4]
address1=192.168.252.20/24,192.168.252.100
dns=8.8.8.8;
method=manual#VIP
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
address1=192.168.252.200/32
address2=127.0.0.1/8
method=manual
#开启arp抑制,防止客户端请求穿透LVS的调度策略,直接访问后端服务器
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
#net.ipv4.conf.all.arp_announce = 2
#net.ipv4.conf.all.arp_announce =1
#arp_announce 只响应同本机所有接口   arp_ignore 忽略arp报文
测试

排错过程:

得出后端真实服务器的web没有启动

2.3.3实验过程中的问题和排错

2.3.3.1问题

可能会出现VIP配置没问题,但是查不到vip的情况

原因之前激活过的网卡已占用设备位置,所以需要把之前激活的网卡删除再重新激活后配置的网卡

执行nmcli connection delete 加上已占用网卡的uuid 

        nmcli connection up lo

排错:
  • 后端服务器的防火火墙未关闭
  • 后端web服务没有起/网关
  • 配置的ip冲突
  • 编写策略有问题,是基于VIP去调度后端真实服务器

2.3.4TUN模式(了解)

转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)

2.3.4.1TUN模式流程图

  1. 客户端发送请求数据包,包内有源IP+vip+dport
  2. 到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
  3. RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP)+port,响应数据包通过网络直接回传给client
2.3.4.2TUN模式的特点
  • DIP, VIP, RIP都应该是公网地址
  • RS的网关一般不能指向DIP
  • 请求报文要经由Director,但响应不能经由Director
  • 不支持端口映射
  • RS的OS须支持隧道功能

2.3.5fullnet模式(了解)

2.3.5.1fullnet流程图

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

CIP --> DIP

VIP --> RIP

2.3.6LVS工作模式总结

NAT模式TUN模式DR模式
RS操作系统不限支持隧道禁用arp
调度器和服务器网络可跨网络可跨网络不可跨网络
调度服务器数量服务器数量
RS服务器网关指向到调度器DIP指向到路由指向到路由

2.4LVS调度算法

静态算法:
RRroundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
WRRWeighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
SHSource Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
DHDestination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态算法:
LC

least connections(最少链接发)

适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)

WLC

Weighted LC(权重最少链接)

默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight

SED

Shortest Expection Delay,

初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight

但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接

NQNever Queue,第一轮均匀分配,后续SED
LBLCLocality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
LBLCRLBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS

http://www.xdnf.cn/news/1149787.html

相关文章:

  • Spring Boot 与微服务详细总结
  • 软件测试理论02—测试流程体系
  • 云端成本治理利器:亚马逊云科技智能仪表盘(AWS Cost Intelligence Dashboard)深度解析
  • 练习三:熟知前端知识
  • Django3 - Web前端开发基础 HTML、CSS和JavaScript
  • web.m3u8流媒体视频处理
  • 服装公司生产管理系统,如何实战提升生产效率?
  • 张量交换维度(转置),其实是交换了元素的排列顺序
  • 如何实现电脑自动关机与定时任务管理
  • ABP VNext + Temporal:分布式工作流与 Saga
  • react+antd 可拖拽模态框组件
  • 尚庭公寓-----day2 业务功能实现
  • 物联网系统中的可视化大屏定义
  • 华为仓颉编程语言语法简介与示例
  • React 的 `cache()` 函数
  • 医疗AI与融合数据库的整合:挑战、架构与未来展望(下)
  • Java行为型模式---状态模式
  • 6-大语言模型—预训练:数据处理
  • SpringBoot项目部署至云服务器
  • simulink系列之汽车应用层信号处理
  • Django母婴商城项目实践(九)- 商品列表页模块
  • LVS的简介以及架构
  • Entity Component System架构
  • 【项目分享】动手做一个TypeC转TTL模块(附带原理图)
  • 加法速算之尾数法
  • Windows11下编译好的opencv4.8-mingw,可下载后直接用
  • java: DDD using sql server 2019 or Oracle21c
  • Linux 密码生成利器:pwgen 命令详解
  • 测试计划(抽奖系统)
  • 考研复习-数据结构-第七章-查找