小赵68

导航

从网络到分布式-02高并发负载均衡-LVS的DR,TUN,NAT模型推导

一,为什么LVS比tomcat和nginx负载能力更优秀的软件

 

分布式是为了处理高并发的情况,但分布式也需要一个集中的,统一的请求入口,但问题就是,为什么这个请求入口就可以处理tomcat服务器处理不了的并发量?

原因:

1,tomcat或nginx是一个应用层的软件,每一次请求达到tomcat,都需要经过osi七层模型的所有过程,而像传输控制层的三次握手是十分耗费资源的,因此,导致tomcat相应变慢,并发变小

2,由于tomcat是一个应用层软件,而应用层占用的内存都是用户态的内存,每次请求的处理都需要经过用户态与内核态的转换,所以,这个过程也很耗时。

3,tomcat是基于Java语言开发的。

而集中处理的请求入口服务器之所以快,就是可以不经过类似三次握手这样的流程。直接从网络层或链路层就把请求发出去了,所以,很快。

所以,解决高并发的一个方向就是减少网路模型的深度,而这个深度可以在传输层,但不经过和client握手操作,只是在传输层看一下端口号就行。

 

注意:上述的LVS负载均衡服务器和nginx的区别就是,nginx不要求负载后的服务器是镜像的(功能相同),而上述的服务器则要求负载后处理请求的服务器是镜像的。因为这些服务器是低层次的(四层负载技术),不经过和client的握手操作,不知道数据包中的内容,无法做到针对性的分发。而nginx则是应用层的,能够知道数据包的内容,就可以针对数据包的内容进行目的性的转发,把特定的请求发送到特定服务器上。

 

 

二,LVS介绍

LVSLinux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。

LVS的三种模式:NAT模式,DR模式,TUN隧道模式

 

1,LVS的NAT模式

NAT:Network Address Translation,网络地址转换

image-20210823194721202

192.168.1.x:私网地址

6.6.6.6:公网地址(暴露在互联网上的地址)

image-20210823195433524

如上图:192.168.1.8想要访问8.8.8.8:80会怎么访问呢?

192.168.1.8 先去访问自己的交换机,通过交换机找到相应的网关;由于百度和源IP是不同网段的,因此,需要通过网关进行网络的转换。网关可以通过自身的网络路由,把访问的IP地址转换为目的网段的网关地址,而目的网关的IP地址就可以在自己的网段找到真正的目的服务器。

 

NAT模式的负载均衡

image-20210823202310763

后端服务器之所以会处理请求,是因为转发服务器发送的目的IP和自身IP匹配上了。匹配不上,后端服务器会直接丢弃这个请求。

 

由于LVS负载均衡服务器是起到负载作用的,因此是不知道用哪台服务器做应答的,也就不知道目的服务器的IP。那么负载均衡服务器是怎么实现数据传递的呢?

是由于NAT的存在,当一个请求达到服务器的时候,是携带的目的IP就是负载服务器自身的VIP。但负载服务器会自动把虚拟IP换成目的服务器中任何一台的IP(NAT的地址转换),这样,就能实现请求的发送了。此时,netstat -natp显示的是CIP和RIP的信息。

而当目的服务器返回数据的时候,由于是RIP直接返回给CIP,如果是不经过负载服务器就返回,client是无法接受的,因为,client是没有发送给RIP 数据包的。而经过负载服务器后,负载服务器就可以再次把RIP换位VIP ,client就可以接收到数据包了。

2,NAT模式的缺点

上述NAT模式的负载均衡,针对中小型企业,不需要经常上传图片或电影的,就可以满足。

也存在一定的弊端:

1,非对称模型:请求的数据包小,返回的数据包大,宽带成了瓶颈;

2,经过服务器时的IP地址转换消耗算力;

 

 

3,LVS的DR模式

DR模式(直接路由模式)

image-20210823204502809

和NAT模式不同的是,DR模式是基于2层(链路层)进行数据包的地址更换的。

NAT由于需要在路由器中进行IP地址的转换,是在三到四层的改动(可以跨局域网),比较消耗算力;因此,DR对此进行了改进,

1,是在路由器中收到client的请求后,直接更改MAC地址,改为目的服务器的MAC地址(虽然之前也要有MAC地址,但却不是目标服务器的MAC地址,因此不知道是哪台);

2,是由后端服务器直接返回数据包到client,改进了NAT的两个弊端。此种改进就要求RIP服务器也要有自己的VIP,而且,不能暴露,当RIP 收到负载服务器的请求后,用VIP进行包装,包装后,就可以和返回数据包一起直接返回给client,client也可以识别到。

两个疑问:

1,负载服务器的VIP和RIP的VIP值是不是相同的?(是相同的)

2,RIP 直接返回给client,得需要多少网线才能解决?(母鸡)

 

4,DR模式的缺点

此时负载服务器和RIP服务器必须在同一局域网才行。

为什么负载服务器必须和RIP在同一局域网才行?

因为不在同一局域网,就无法通过MAC地址进行寻址,只能网关进行IP的转发,找到正确的网段才行。

都是MAC地址负责寻址,IP地址只在负责连接两个不同网段的路由器上才发挥指导作用。

 

 

5,TUN隧道模式

image-20210824185712664

 

隧道模式:即负载均衡自身会给RIP服务器发送数据包,这个数据包和client的数据包不同,只是一个载体;当client发送过来数据包后,负载服务器会用自身的数据包装载着client的数据包发送到某一台RIP上,RIP撕掉外层的数据包,就可以获取真正的数据信息。而且,client的数据包本身也包含VIP到CIP的记录,也就可以直接返回给client。不需要再经过负载服务器。

TUN隧道模式修改了DR模式的缺点

 

 

 

 

二,隐藏VIP方法


1,条件1:

image-20210824194631940

/proc/:此文件只有在启动系统后才能看到,修改此文件夹中的内容,不能使用vi或vim,而需要使用echo;修改完后即时生效。

 

当请求访问到上图中的任一网卡时,arp_ignore响应级别:

1)当是0级别的时候,访问其中一个,就可以知道另一个的IP地址并进行响应;

2)当是1级别的时候,访问其中一个,不能知道另一个网卡的IP地址,相当于把另一个给隐藏了;

 

当请求访问到上图中的任一网卡时,arp_announce通告级别:

1)当是0的时候,自身会把所有网卡上的所有IP地址都告诉客户端;

2)当是1的时候,自身只会把对应网卡的所有IP地址告诉客户端;(一个网卡可以配置多个IP地址)

3)当是2的时候,自身只会把对应网卡的一个可暴露的IP地址告诉客户端;

 

2,条件2:

image-20210824200941862

如上图,是一个lo环回接口,也就是虚拟网卡,虚拟网卡就是内核中的一个软件。既然在内核,就不能对外可见,也不能被直接访问;但却对内可见,也可以访问。 而且,虚拟网卡上也可以设置子网卡,设置的子网卡和虚拟网卡拥有一样的特性。

这样,结合条件1和条件2,就可以满足LVS的DR模式中RIP的VIP的特性了-对外隐藏,对内可见。

 

三,LVS负载均衡策略


分为两种:静态策略和动态策略

image-20210824203159613

静态就比较简单,直接可以进行负载;

而动态负载,例如lc最少连接,就需要知道每台RIP服务器某时刻连了多少请求;

而这个功能的实现,就需要负载服务器进行偷窥clinet数据包的IP和端口号,并进行记录,才能实现连接的时时减少和增加。

 

 

四,linux访问LVS


Linux默认是集成了LVS的,在Linux内核中叫ipvs内核模块。但由于是封装到内核中了,所以,无法直接访问,因此,Linux中如果想要访问ipvs模块,需要安装一个交互工具-ipvsadm

命令:yum install -y ipvsadm

1,设置负载服务器接收client请求时的规则

image-20210824203703916

-A:暂时理解为接收的规则配置标识

-s scheduler:设置负载策略

 

2,设置负载服务器向RIP服务器发出信息时的设置

image-20210824204444728

-a~-r中间的参数:即设置针对哪些请求IP和端口号向-r后面的服务器转发;即实现一负载多请求的分类;例如分别针对80和8080向1,2,3和4,5,6 RIP服务器分别转发。

-c:显示的是偷窥到的连接信息,负载服务器自身是没有连接的。

-S:把配置过的请求和后端服务器的映射以及一些配置,保存到内核,下次启动,之前的请求映射和规则不会丢失

ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -g

这个命令的意思就是针对172.16.100.1:80的请求,转发到192.168.10.8,采用的模式是DR模式

如果想要实现对172.16.100.1:80请求的负载,多次执行以上命令即可。

 

 

使用VMware实现lvs集群搭建的线路简化图

image-20210825185351953

环境:node01(lvs服务器),node02(RIP服务器),node03(RIP服务器)

搭建步骤:

1,给lvs服务器设置虚拟网卡

ifconfig eth0:8 192.168.150.100/24

(24:即255.255.255.0的缩写,255即二进制上全是1,三个255,即24个1)

2,RIP服务器修改内核并设置隐藏VIP

1)修改内核:

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

2)设置隐藏的VIP

ifconfig lo:3 192.168.150.100 netmask 255.255.255.255

子网掩码设置为255.255.255.255的原因是:避免和真正的IP共用一个网关,导致没有隐藏起来,而收到了请求,但回环IP收到请求后,又发不出去,导致请求没任何相应。

 

3,RIP中的服务

node02~node03

执行命令:

yum install -y httpd

service httpd start

vim /var/www/html/index.html

内容:from 192.168.150.12/13

 

4,LVS服务器的配置

1)下载ipvsadm

yum install -y ipvsadm

2)执行LVS的配置命令,进行负载配置

3)配置好后,浏览器进行访问

4)ipvsadm -lnc:查看LVS的偷窥记录

image-20210825200135815

FIN_WAIT:连接过,偷窥了所有的包

SYN_RECV:基本上lvs都记录了,证明LVS没事,一定是后边的服务器的网络层出问题了。

netstat -natp:查看RIP服务器上的socket连接;而在LVS服务器上则看不到

 

posted on 2021-08-26 19:54  小赵68  阅读(165)  评论(0编辑  收藏  举报