LVS原理及实例

目录

LVS原理

LVS概念

lvs集群的类型

lvs-nat

解释

传输过程

lvs-dr

解释

传输过程 

特点

lvs-tun

 LVS(Linux Virtual Server)常见的调度算法

防火墙标记(Firewall Marking)结合轮询调度

实战案例

lvs的nat模式配置

准备工作

配置过程

测试结果

lvs的dr模式综合实践

虚拟机配置(准备五个虚拟机)

​编辑​编辑​编辑​编辑​编辑配置过程

测试结果

lvs的防火墙标记解决轮询调度问题

错误示范

正确示范

​编辑测试结果


LVS原理

LVS(Linux Virtual Server,Linux 虚拟服务器)的基本原理是通过将多个真实服务器组合成一个虚拟服务器集群,实现对客户端请求的高效负载均衡和高可用性服务。 其主要工作流程如下:

1. 客户端向虚拟服务器(VIP)发送请求。

2. 负载均衡器(通常称为 Director)接收到请求。

3. Director 根据预先配置的负载均衡算法(如轮询、加权轮询、最少连接等)选择一个合适的真实服务器(Real Server)。

4. Director 将客户端请求转发到选定的 Real Server。

5. Real Server 处理请求,并将响应直接返回给客户端。

为了实现请求的转发,LVS 支持多种工作模式,如 NAT(Network Address Translation,网络地址转换)模式、TUN(IP Tunneling,IP 隧道)模式和 DR(Direct Routing,直接路由)模式。

在 NAT 模式中,Director 不仅负责调度,还对请求和响应数据包进行网络地址转换。

在 TUN 模式中,Director 将请求数据包封装后发送给 Real Server,Real Server 处理后直接将响应返回给客户端。

在 DR 模式中,Director 根据算法选择 Real Server 后,将请求的 MAC 地址修改为选定 Real Server 的 MAC 地址,然后通过局域网将请求直接发送给 Real Server,Real Server 处理后直接响应给客户端。

通过 LVS 的负载均衡机制,可以提高服务器集群的整体性能、可扩展性和可用性,确保客户端能够获得快速和可靠的服务。

LVS概念

名称意义
VS(Virtual Server)/虚拟服务器负责调度,将客户端的请求分配到合适的后端服务器
RS(Real Server)/真实服务器负责真正提供服务,处理来自 VS 调度分配的请求
CIP(Client IP)/客户端主机IP地址客户端用户计算机请求集群服务器的IP地址,该地址用作发送给集群的请求的源IP地址
VIP(Virtual serve IP)/虚拟IP地址Director用于向客户端计算机提供服务的IP地址
DIP(Director IP)/Director的IP地址Director用于连接内外网网络的IP地址
RIP(Real server IP)/真实IP地址在集群下面节点上使用的IP地址

访问过程:CIP<-->VIP == DIP<-->RIP

lvs集群的类型

(此处我们详细讲解lvs-nat和lvs-br)

lvs-nat

解释

LVS(Linux Virtual Server)的网络地址转换(NAT)模式是一种在网络层(第四层)实现负载均衡的方法。在NAT模式中,Director Server(DS)充当所有服务器节点的网关,既是客户端请求的入口,也是Real Server响应客户端的出口。优点是可以进行端口转换,缺点是存在性能瓶颈。它主要工作在OSI模型的第三层(网络层)和第四层(传输层)。NAT允许内部网络使用私有IP地址,并通过公共IP地址进行外部通信。

传输过程

1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口 (9000port)

2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口

3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口 (9000port)

4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)

5.VS服务器把修改过报文的响应数据包回传给客户端 6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞

客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通 过PREROUTING后被ipvs结果并作nat转发 因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工 作。所以在做lvs时要把iptables的火墙策略全清理掉。

lvs-dr

解释

LVS(Linux Virtual Server)的 DR(Direct Routing,直接路由)模式,这种模式适用于非ARP设备的Real Server,Real Server网络是局域网,同样支持大量Real Server(高达100个),Real Server有自己的路由器。优点是性能最佳,缺点是不支持跨网段和端口转换。工作在数据链路层。在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs 上都要有vip

传输过程 

1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC

2.VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC

3.RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC

特点

1.Director和各RS都配置有VIP

2.确保前端路由器将目标IP为VIP的请求报文发往Director

3.在前端网关做静态绑定VIP和Director的MAC地址

lvs-tun

LVS(Linux Virtual Server)的 TUN(IP Tunneling,IP 隧道)模式是另一种负载均衡模式。

在 TUN 模式中,Director 接收到客户端请求后,根据负载均衡算法选择一台合适的 Real Server。然后,Director 将请求数据包重新封装在一个新的 IP 数据包中,并将其发送给所选的 Real Server。

Real Server 接收到数据包后,解封装得到原始的请求数据包,并进行处理。处理完成后,Real Server 直接将响应数据包返回给客户端,而不经过 Director。

TUN 模式的优点是可以跨越不同的网络区域对服务器进行负载均衡,Real Server 可以位于不同的物理网络。但它也有一些缺点,比如需要所有服务器支持 IP 隧道功能,会增加一定的系统开销。

 LVS(Linux Virtual Server)常见的调度算法

静态调度算法RR,WRR,DH,SH
动态调度算法LC,WLC,LBLC,LBLCR
静态调度算法

1. 轮询(Round Robin,RR):将请求依次分配给各个真实服务器,依次循环。

2. 加权轮询(Weighted Round Robin,WRR):给每个真实服务器设置一个权重,根据权重的比例将请求分配给服务器。权重越高,分配到的请求越多。

3.目标地址散列(Destination Hashing,  DH):根据请求的目标 IP 地址进行哈希运算,将请求分配到固定的服务器。

4.源地址散列(Source Hashing,  SH):根据请求的源 IP 地址进行哈希运算,将请求分配到固定的服务器。

动态调度算法

1. 最少连接(Least Connections,LC):将新的请求分配给当前连接数最少的真实服务器。

2. 加权最少连接(Weighted Least Connections,WLC):为真实服务器设置权重,综合考虑服务器的权重和当前连接数来分配请求。

3. 基于局部性的最少连接(Locality-Based Least Connections,LBLC):主要考虑请求的目标 IP 地址,优先将请求分配给同一 IP 地址对应的真实服务器。

4. 带复制的基于局部性最少连接(Locality-Based Least Connections with Replication,LBLCR):结合了 LBLC 和复制功能,对于目标 IP 地址相同的请求,如果对应的真实服务器没有活动连接,则可以在有活动连接的真实服务器中选择一个,并复制该连接。

防火墙标记(Firewall Marking)结合轮询调度

在 LVS 环境中,使用防火墙标记(Firewall Marking)结合轮询调度可以实现更灵活和定制化的负载均衡策略。

通过防火墙标记,可以为不同的连接或数据包打上特定的标记。然后,在 LVS 的配置中,可以根据这些标记来进行调度决策,而不仅仅依赖于默认的轮询方式。

实战案例

lvs的nat模式配置

准备工作

lvs主机需要两个网络适配器,其中一个为NAT模式,另外一个为仅主机模式,还需要两个server主机,一个为server1还有一个为server2,都为仅主机模式

配置过程

配置ip

lvs主机

[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.connection 
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
address1=192.168.0.100/24
method=manual


 server1主机

[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual


server2主机配置

[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual


在lvs主机中配置
lvs中打开内核路由功能,ip_forward = 1通常表示启用了 IP 转发功能,使网络适配器分别为nat和仅主机之间连通

vim /etc/sysctl.conf            #在最后一行添加
net.ipv4.ip_forwaed = 1                #启用了 IP 转发功能sysctl -p             #使配置生效


下载ipvsadm

yum install ipvsadm -y


配置规则

ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10 -m
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10 -mipvsadm -Ln
watch -n 1 ipvsadm -Ln --rate    #也可以使用监控命令来看


在server主机配置

yum install httpd -y        #两个都要下载httpdecho webserver1-192.168.0.10 > /var/www/html/index.html        #server1中配置
ystemctl restart httpdecho webserver1-192.168.0.10 > /var/www/html/index.html         #server2中配置
systemctl restart httpd

测试结果

lvs的dr模式综合实践


 

nodeipvip角色模式
client172.25.254.200客户端NAT
router

192.168.0.100

172.25.254.100

路由器NAT,仅主机
lvs192.168.0.50lo:192.168.0.200/32调度器仅主机
webserver1192.168.0.10lo:192.168.0.200/32真实服务器仅主机
webserver2192.168.0.20lo:192.168.0.200/32真实服务器仅主机

虚拟机配置(准备五个虚拟机)


配置过程

配置ip

配置client主机

[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth0


配置router主机

[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=172.25.254.100/24,172.25.254.2
dns=114.114.114.114;
method=manual[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.connection 
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
address1=192.168.0.100/24
method=manual[root@router ~]# nmcli connection reload
[root@router ~]# nmcli connection up eth0
[root@router ~]# nmcli connection up eth1

配置lvs主机(vip使用环回来创建)

[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.50/24,192.168.0.100
method=manual[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth0[root@lvs ~]# ip addr add dev lo 192.168.0.200/32

配置server1主机(vip使用环回来创建)

[root@server1 ~]# cat /etc/NetworkManager/system-connections/eth0.connection
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual[root@server1 ~]# nmcli connection reload
[root@server1 ~]# nmcli connection up eth0[root@server1 ~]# ip addr add dev lo 192.168.0.200/32

配置server2主机(vip使用环回来创建)

[root@server2 ~]# cat /etc/NetworkManager/system-connections/eth0.connection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual[root@server2 ~]# nmcli connection reload
[root@server2 ~]# nmcli connection up eth0[root@server2 ~]# ip addr add dev lo 192.168.0.200/32


修改Linux内核参数。

server1和server2上面都要做

(rs主机中使vip不对外响应,将RS上的VIP配置为lo接口的别名,限制Linux仅对对应接口的ARP请求做响应;)

限制响应级别 :arp_ignore

0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

限制通告级别 :arp_announce

0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 


配置ipvsadm
在lvs主机中进行配置 IP 虚拟服务器

yum install ipvsadm -yipvsadm -A -t 192.168.0.200:80 -s wrr
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2


启用 IP 转发功能
在router主机进行配置

(设置持久连接,保持客户端与后端服务器的连接关系)

vim /etc/sysctl.conf            #在最后一行添加
net.ipv4.ip_forward = 1ipvsadm -p


 配置web服务

yum install httpd -yecho 11111111 > /var/www/html/index.html        #server1中配置
ystemctl restart httpdecho 22222222 > /var/www/html/index.html         #server2中配置
systemctl restart httpd

测试结果

for i in {1..10}; do curl 192.168.0.200; done

lvs的防火墙标记解决轮询调度问题

错误示范

ipvsadm -A -t 192.168.0.200:80 -s rr
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g
ipvsadm -A -t 192.168.0.200:443 -s rr
ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:80 -g
ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:80 -g

错误结果

[root@lvs ~]# curl  -k https://192.168.0.200;curl 192.168.0.200
1111111
1111111


正确示范

FWM:FireWall Mark

MARK target 可用于给特定的报文打标记,

--set-mark value

其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服 务:可将多个不同的应用使用同一个集群服务进行调度

#在lvs主机打标记:

#并且lvs主机基于标记定义集群服务:

iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 66ipvsadm -A -f 66 -s rr    #设定调度规则
ipvsadm  -a -f 66 -r 192.168.0.10 -g
ipvsadm  -a -f 66 -r 192.168.0.20 -g


测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/399304.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Linux实现FTP云盘1

关于FTP服务器 FTP&#xff08;文件传输协议&#xff09;服务器是在互联网上提供文件存储和访问服务的计算机&#xff0c;它们依照FTP 协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。 程序运行&#xff0c;服务端不断接收客户端指令&#xff0c;服务 端可同时处…

提取含有特定字符的行和列grep函数(含有替换)

目录 ①grep提取含有特定字符的列 ②grep提取含有特定字符的行 R语言进行字符的替换和删减gsub&#xff0c;substr函数R语言进行字符的替换和删减gsub&#xff0c;substr函数_r语言数据框字符替换-CSDN博客 ①grep提取含有特定字符的列 在一个dataframe中&#xff0c;需要提…

Element学习(axios异步加载数据、案例操作)(5)

1、这次学习的是上次还未完成好的恶element案例&#xff0c;对列表数据的异步加载&#xff0c;并渲染展示。 ——>axios来发送异步请求 &#xff08;1&#xff09; &#xff08;2&#xff09;在vue当中安装axios &#xff08;注意在当前的项目目录&#xff0c;并且安装完之后…

Xcode 在原生集成flutter项目

笔者公司有一个从2017年就开始开发的iOS和安卓原生项目&#xff0c;现在计划从外到内开始进行项目迁徙。 1》从gitee拉取flutter端的代码&#xff1b;&#xff08;Android报错Exception: Podfile missing&#xff09; 2》替换Xcode里的cocopods里Podfile的路径 然后报警 然后…

Linux从0到1——进程池

Linux从0到1——进程池 1. 进程池的概念2. 进程池实现思路3. 进程池的代码实现3.1 创建管道&#xff0c;创建子进程3.2 封装任务3.3 Work接口3.4 发送任务3.5 回收资源&#xff0c;关闭管道&#xff08;重点&#xff09;3.6 改造CreatChannels接口 4. 完整代码 1. 进程池的概念…

ECMAScript6模板字面量:反引号、${}占位符的使用

ECMAScript 6 中引入了模板字面量&#xff0c;主要通过多行字符串和字符串占位符对字符串进行增强操作。如下&#xff1a; //使用ECMAScript6模板字面量拼接字符串&#xff0c;例如&#xff1a;2024年8月12日 15:38:28 星期一 let dateRet ${Year}年${Month}月${Dates}日 ${H…

lvs、集群

1.集群和分布式 当多个用户当用户访问一个服务器时&#xff0c;服务器server1可能就会崩&#xff0c;假如这时候我们新加一个服务器server2来缓解server1的压力&#xff0c;那么就需要一个调度器lvs来分配&#xff0c;所以现在就是用户的访问就需要通过调度器之后到达服务器&a…

简述MYSQL聚簇索引、二级索引、索引下推

一丶聚簇索引 InnoDB的索引分为两种&#xff1a; 聚簇索引&#xff1a;一般创建表时的主键就会被mysql作为聚簇索引&#xff0c;如果没有主键则选择非空唯一索引作为聚簇索引&#xff0c;都没有则隐式创建一个索引作为聚簇索引&#xff1b;辅助索引&#xff1a;也就是非聚簇索…

KillWxapkg 自动化反编译微信小程序,小程序安全评估工具,发现小程序安全问题,自动解密,解包,可还原工程目录,支持修改Hook,小程序

纯Golang实现&#xff0c;一个用于自动化反编译微信小程序的工具&#xff0c;小程序安全利器&#xff0c;自动解密&#xff0c;解包&#xff0c;可还原工程目录&#xff0c;支持微信开发者工具运行 由于采用了UPX压缩的软件体积&#xff0c;工具运行时可能会出现错误报告&…

在等保测评中,如何平衡技术风险和非技术风险的评估?

在等保测评中平衡技术风险和非技术风险的评估&#xff0c;需要一个综合的方法来确保所有相关的风险都得到适当的考虑。以下是一些关键步骤&#xff1a; 1. 全面风险识别&#xff1a;首先识别所有可能影响组织的风险&#xff0c;包括技术风险&#xff08;如系统漏洞、恶意软件&…

企业大模型落地从0到0.1

现在人工智能里的“大明星”——大模型&#xff0c;正在悄悄改变各行各业。这就像给企业装上了一颗聪明的大脑&#xff0c;能帮助解决各种棘手问题&#xff0c;提升工作效率。今天&#xff0c;我们就来分析下企业如何一步一步让这个“大脑”在自家地盘里真正派上用场&#xff0…

九、OpenCVSharp 中的图像形态学操作

文章目录 简介一、腐蚀1. 腐蚀的原理和数学定义2. 结构元素的形状和大小选择3. 腐蚀操作的代码实现和效果展示二、膨胀1. 膨胀的概念和作用2. 与腐蚀的对比和组合使用(如开运算、闭运算)三、开运算1. 开运算的定义和用途(去除小的明亮区域)2. 开运算在去除噪声和分离物体方…

数据结构--树与二叉树

数据结构分类 集合 线性结构(一对一) 树形结构(一对多) 图结构(多对多) 数据结构三要素 1、逻辑结构 2、数据的运算 3、存储结构&#xff08;物理结构&#xff09; 树的概念 树的分类 满二叉树和完全二叉树 二叉排序树 平衡二叉树 二叉树分类总结 二叉树的存储结构 …

Element-UI自学实践

概述 Element-UI 是由饿了么前端团队推出的一款基于 Vue.js 2.0 的桌面端 UI 组件库。它为开发者提供了一套完整、易用、美观的组件解决方案&#xff0c;极大地提升了前端开发的效率和质量。本文为自学实践记录&#xff0c;详细内容见 &#x1f4da; ElementUI官网 1. 基础组…

Linux os下借助Qt+libvlc是实现多路拉取摄像头rtsp数据流并实时显示

前言 应客户方的一个实际项目需求&#xff0c;需要在Linux操作系统下拉取多路摄像头的RTSP数据流并实时显示。 该项目的硬件平台基于飞腾2000四核处理器与景嘉微显卡&#xff0c;搭载了Kylin V10操作系统。 当前景嘉微GPU最多支持同时连接16路摄像头&#xff0c;拉取1920x108…

在等保测评中,如何平衡资产识别的全面性和准确性,避免过度关注某些资产而忽视其他潜在风险?

在等保测评中平衡资产识别的全面性和准确性&#xff0c;避免过度关注某些资产而忽视其他潜在风险&#xff0c;可以通过以下策略实现&#xff1a; 1. 全面审计&#xff1a;确保进行一次全面的审计&#xff0c;包括所有类型的资产&#xff0c;避免遗漏任何关键组件。 2. 风险导…

上海亚商投顾:三大指数小幅调整,两市成交不足5000亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 大指数昨日窄幅震荡&#xff0c;临近尾盘小幅下挫。环保板块开盘大涨&#xff0c;永清环保、清研环境、中兰环…

OpenCV图像滤波(10)Laplacian函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 计算图像的拉普拉斯值。 该函数通过使用 Sobel 运算符计算出的 x 和 y 的二阶导数之和来计算源图像的拉普拉斯值&#xff1a; dst Δ src ∂…

LeetCode刷题笔记第191题:位1的个数

LeetCode刷题笔记第191题&#xff1a;位1的个数 题目&#xff1a; 想法&#xff1a; 通过位运算判断二级制形式中有多少个1&#xff0c;代码及解释如下&#xff1a; class Solution:def hammingWeight(self, n: int) -> int:return sum(1 for i in range(32) if n & …

Latex或者word里面mathtype类型的数学公式如何变成mathematica里面的形式

详细步骤如下&#xff1a; 第一步&#xff1a;Latex里面的公式复制粘贴到word里面&#xff0c;转变成mathtype类型的数学公式&#xff08;若已经是word里面mathtype类型的数学公式&#xff0c;这一步可以省略&#xff09;&#xff0c;如下&#xff1a; 第二步&#xff1a;将ma…