前置:高并发意味着后端服务不止一台,上文的百度也不会只有一台机器,这时候就需要负载均衡技术
压力现在给到负载均衡器这边,因此,负载均衡器必要要具备快,快速进行数据包的转发,不与源ip进行握手
思考一个问题:大家有没有这样的想法?你一个经常写业务代码的都比较慢了,你中间再加一个很少写业务代码的领导,效率能提升吗?
因此,我们要分析的,为什么Tomcat会比较慢?
注意:这里不是反向代理,这里并没有发生握手以及挥手的动作
假设我们使用Tomcat作为的负载均衡器的话,Tomcat是应用层的应用,与Tomcat进行交互的话,意味着,必须要进行建立连接,以及分手的过程,另外,上文讲到内核态与用户态,Tomcat的运行是在jvm虚拟机只上的,数据的传输,必须要经过的jvm虚拟机再与kernel进行交互,涉及到用户态内核态的转换,效率比较低下
如果我们只做数据包的转发,不进行握手的话,效率有没有可能会大幅度提高,结合上文的五层模型来看,数据包的转发在网络层以及数据链路层,这时候还没有进行拆包,看不到用户的真实域名,这时候要求后端服务是镜像的。必须要一样,看不到URL的话,数据包转发到不同服务器必须要得到相同反应
负载均衡器不能和客户端进行握手,握手了之后又会比较慢
如上图,经过上文的过程之后,我们的数据包到了路由器的位置,下一跳就是负载均衡器,假设均衡器能够直接将数据包在这里进行转发到后端服务,这时候,负载均衡器有没有与用户的请求建立tcp连接?效率是否有提升
lvs nat模型
1.对客户端来说,服务端是透明的,因此对于客户端来说,访问都是访问VIP cip-vip
2.客户端会发送一个cip到VIP的数据包,这个数据包一定要负载到server1 server2
3.我们现在思考一个问题,server1或者server2收到cip到VIP的数据包之后,会进行处理吗?
不会,发来的数据包,server1或者server2不会进行处理,为什么不会进行处理?
我们看看我们实际上网的过程
ip地址不能重复,因此即使在局域网环境下,ip地址也是不能重复
假设,我们的现在有两台电脑,同时要访问百度,一台电脑的ip地址192.168.1.6 一台是192.168.1.8 同时访问百度,使用的端口号都是12121,如下图所示:
我们来分析一下这个过程,看下会有什么问题:
1、client将数据包发送给路由器192.168.1.1
2.路由器将局域网地址转换成6.6.6.6的公网ip地址发送给百度
3.百度返回数据给6.6.6.6
4.如果百度同时返回数据给192.168.1.6:12121、192.168.1.8:12121,不能实现
实际上这个过程,真实的数据包是由6.6.6.6这个ip发出去的,在这个过程中,是由6.6.6.6与8.8.8.8进行通信,百度在处理完成之后,再数据包回传的时候,无法找到源头
整个过程变成了如下过程:
路由器必须要再准备一张表:
路由器随机生成一个端口号,记录端口号与源ip的映射关系,在进行ip替换的时候,不光进行ip替换,同时进行端口号的替换,变成如下过程:
因此,回答了server1 server2不能处理数据包的过程,我们要进行通信的时候,要进行通信,就必须将cip-vip替换成cip-rip
在进行的通信的时候,我们修改的是源ip地址,因此这种也会叫做S-NAT
S-nat的弊端:
一般情况下,客户端发送给服务端数据量比较小,服务端返回的数据量相对较大,网络不对称
1.瓶颈,服务器带宽成为瓶颈
2.算力消耗大,必须要进行地址转换,来回都需要
优点:可以实现负载均衡
为了解决这个问题,实现传输性能最大,带宽利用最大
Dr模型出现了,见lvs03