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

发布于:2025-07-20 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、简介

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
client 172.25.250.111
lvs 172.25.250.100(VIP|NAT)、192.168.252.100(DIP|仅主机)
rs1 192.168.252.10
rs2 192.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.111 client客户端
172.25.250.100(nat)/192.168.252.100(仅主机) router的双网卡对应的ip
192.168.252.111 lvs的DIP
192.168.252.10 RS1-rip
192.168.252.20 RS2-rip
192.168.252.200 集群对外的VIP
相关设备的配置

client

仅需修改网关,把网关设置为routernat网卡上的IP

 vim /etc/NetworkManager/system-connections/eth0.nmconnection
	[connection]
	id=eth0
	type=ethernet
	interface-name=eth0

	[ethernet]

	[ipv4]
	address1=172.25.250.111/24,172.25.250.100
	method=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调度算法

静态算法:
RR roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
WRR Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
SH Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
DH Destination 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承接

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


网站公告

今日签到

点亮在社区的每一天
去签到