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
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 调度器

bash 复制代码
#配置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

bash 复制代码
#配置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

bash 复制代码
仅需修改网关,把网关设置为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
bash 复制代码
#开启内核路由转发
 sysctl -a | grep ipv4.ip_forward
net.ipv4.ip_forward = 1
sysctl -p 

#开启防火墙和地址伪装
systemctl start firewalld
firewall-cmd --add-masquerade     #地址伪装
lvs-dr
bash 复制代码
#配置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

bash 复制代码
#配置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 |

相关推荐
-曾牛41 分钟前
Linux搭建LAMP环境(CentOS 7 与 Ubuntu 双系统教程)
linux·运维·ubuntu·网络安全·渗透测试·centos·云计算运维
小嵌同学42 分钟前
Linux 内存管理(2):了解内存回收机制
linux·运维·arm开发·驱动开发·嵌入式
绵绵细雨中的乡音1 小时前
消息队列与信号量:System V 进程间通信的基础
linux
简CC1 小时前
Linux——文件压缩和解压
linux·运维·服务器
cq_run2 小时前
centos9部署jdk
linux·运维·服务器
程序员小胡06192 小时前
操作系统系统面试常问(进程、线程、协程相关知识)
linux·面试·职场和发展
小张是铁粉3 小时前
linux配置nvc远程连接
linux·服务器·centos
知北游天3 小时前
Linux:多线程---深入生产消费模型&&环形队列生产消费模型
linux·缓存
阿巴~阿巴~3 小时前
Linux“一切皆文件“设计哲学 与 Linux文件抽象层:struct file与file_operations的架构解析
linux·运维·服务器
TE-茶叶蛋4 小时前
React 服务器组件 (RSC)
服务器·前端·react.js