从网络到分布式-02高并发负载均衡-LVS的DR,TUN,NAT模型推导
分布式是为了处理高并发的情况,但分布式也需要一个集中的,统一的请求入口,但问题就是,为什么这个请求入口就可以处理tomcat服务器处理不了的并发量?
原因:
2,由于tomcat是一个应用层软件,而应用层占用的内存都是用户态的内存,每次请求的处理都需要经过用户态与内核态的转换,所以,这个过程也很耗时。
3,tomcat是基于Java语言开发的。
而集中处理的请求入口服务器之所以快,就是可以不经过类似三次握手这样的流程。直接从网络层或链路层就把请求发出去了,所以,很快。
所以,解决高并发的一个方向就是减少网路模型的深度,而这个深度可以在传输层,但不经过和client握手操作,只是在传输层看一下端口号就行。
注意:上述的LVS负载均衡服务器和nginx的区别就是,nginx不要求负载后的服务器是镜像的(功能相同),而上述的服务器则要求负载后处理请求的服务器是镜像的。因为这些服务器是低层次的(四层负载技术),不经过和client的握手操作,不知道数据包中的内容,无法做到针对性的分发。而nginx则是应用层的,能够知道数据包的内容,就可以针对数据包的内容进行目的性的转发,把特定的请求发送到特定服务器上。
二,LVS介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
LVS的三种模式:NAT模式,DR模式,TUN隧道模式
1,LVS的NAT模式
NAT:Network Address Translation,网络地址转换
192.168.1.x:私网地址
6.6.6.6:公网地址(暴露在互联网上的地址)
如上图:192.168.1.8想要访问8.8.8.8:80会怎么访问呢?
192.168.1.8 先去访问自己的交换机,通过交换机找到相应的网关;由于百度和源IP是不同网段的,因此,需要通过网关进行网络的转换。网关可以通过自身的网络路由,把访问的IP地址转换为目的网段的网关地址,而目的网关的IP地址就可以在自己的网段找到真正的目的服务器。
NAT模式的负载均衡
后端服务器之所以会处理请求,是因为转发服务器发送的目的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模式(直接路由模式)
和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隧道模式
隧道模式:即负载均衡自身会给RIP服务器发送数据包,这个数据包和client的数据包不同,只是一个载体;当client发送过来数据包后,负载服务器会用自身的数据包装载着client的数据包发送到某一台RIP上,RIP撕掉外层的数据包,就可以获取真正的数据信息。而且,client的数据包本身也包含VIP到CIP的记录,也就可以直接返回给client。不需要再经过负载服务器。
TUN隧道模式修改了DR模式的缺点
二,隐藏VIP方法
1,条件1:
/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:
如上图,是一个lo环回接口,也就是虚拟网卡,虚拟网卡就是内核中的一个软件。既然在内核,就不能对外可见,也不能被直接访问;但却对内可见,也可以访问。 而且,虚拟网卡上也可以设置子网卡,设置的子网卡和虚拟网卡拥有一样的特性。
这样,结合条件1和条件2,就可以满足LVS的DR模式中RIP的VIP的特性了-对外隐藏,对内可见。
三,LVS负载均衡策略
分为两种:静态策略和动态策略
静态就比较简单,直接可以进行负载;
而动态负载,例如lc最少连接,就需要知道每台RIP服务器某时刻连了多少请求;
而这个功能的实现,就需要负载服务器进行偷窥clinet数据包的IP和端口号,并进行记录,才能实现连接的时时减少和增加。
四,linux访问LVS
Linux默认是集成了LVS的,在Linux内核中叫ipvs内核模块。但由于是封装到内核中了,所以,无法直接访问,因此,Linux中如果想要访问ipvs模块,需要安装一个交互工具-ipvsadm
命令:yum install -y ipvsadm
1,设置负载服务器接收client请求时的规则
-A:暂时理解为接收的规则配置标识
-s scheduler:设置负载策略
2,设置负载服务器向RIP服务器发出信息时的设置
-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集群搭建的线路简化图
环境: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的偷窥记录
FIN_WAIT:连接过,偷窥了所有的包
SYN_RECV:基本上lvs都记录了,证明LVS没事,一定是后边的服务器的网络层出问题了。
netstat -natp:查看RIP服务器上的socket连接;而在LVS服务器上则看不到