负载均衡器不会与客户端进行连接握手,只是负责传送数据包到各个服务器,速度要求非常快,从而达到多个服务器负载均衡。
负载均衡器因为没有和客户端或服务端进行握手连接,所以并不知道客户端和服务端是什么连接协议,所以后端服务器是镜像的,才可以负载均衡,这和nginx是不太一样的。
lvs这种负载均衡是基于四层概念的,而nginx是基于七层的,nginx属于应用层的,并且nginx属于反向代理,后台服务器不是镜像的。nginx有上限,大概5w个连接,但lvs的话只要你的硬件足够快,带宽足够大,连接过来的流量要远大于nginx。
S-NAT
NAT(网络地址转换)一般出现在路由器上,家里比如有2台电脑,一个是192.168.1.8
,一个是192.168.1.6
,路由器上一般有交换机,用来连接几台设备,路由器肯定也有一个地址192.168.1.1
那你为啥要买路由器?肯定是为了上网,所以要和运营商拉一根网线,运营商会给路由器分配一个ip地址,ip地址分公有地址和私有地址,比如分了一个公网地址6.6.6.6
,像什么192.168.xx.xx是属于私有地址,私有地址不会出现在互联网上的,会被丢弃的。
云端中肯定有台服务器,比如是8.8.8.8
百度,默认端口是80,运营商是可以访问到百度的,路由器的ip地址6.6.6.6
是运营商分配的,所以路由器肯定也可以访问到运营商的。
这样可以解决网络不够用的问题,所以为什么每家都有192.168.1.x 这样的ip地址并且还不会乱,因为这个是自己的私网地址。
这样看着好像没啥问题,比如说,192.168.1.8
这台电脑去访问百度时候,首先经过路由器,比如电脑的端口是12121
,ip+端口是192.168.1.8:12121
这样子到路由器这边了,路由器被运营商分配的公网地址是6.6.6.6
,会替换成6.6.6.6:12121
,这样网络才能被运营商识别,然后变成四元组6.6.6.6:12121 8.8.8.8:80
请求到百度,回来后路由器再把6.6.6.6:12121
给换成192.168.1.8:12121
,就找到192.168.1.8
这台电脑了,返回响应的数据包。
问题来了,如果电脑192.168.1.6
也去访问百度,它的端口刚好也是12121
,到了路由器时候,也给变成了6.6.6.6:12121
,变成的一样的四元组6.6.6.6:12121 8.8.8.8:80
去请求百度了,那么回来以后,路由器还能通过6.6.6.6:12121
找到192.168.1.6
这台电脑吗,因为两台电脑端口也是刚好一样的。
路由器是怎么解决的?
当一个电脑过来的时候,路由器会把电脑的ip进行一个标识,比如123
表示192.168.1.8
这台电脑,路由器再给替换成6.6.6.6:123
,然后请求百度,形成一个四元组,等返回时到了路由器时候,通过123
这个标识可以找到192.168.1.8:12121
当第二台电脑访问过来的时候,给它标识成321
表示192.168.1.6
这台电脑,连接到运营商时候就变成了6.6.6.6:321
,然后去请求百度,回来以后到了路由器,再通过321
这个标识找到192.168.1.6:12121
这个NAT模型每次修改的都是源ip地址,不是目标的ip地址,所以也叫S-NAT(资源NAT,source-NAT)
D-NAT
D-NAT(Destination-NAT):目的地址转换
先知道几个语义:
- CIP:客户端ip
- VIP:虚拟ip地址
- DIP:分发ip
- RIP:真实服务器ip地址
首先来请求的过程是死的,服务端是否使用负载均衡的技术,对客户端来说是透明的,它不知道,它只知道访问VIP。
CIP 去请求VIP 到负载均衡器,负载均衡器是连接服务端机器的,请求到服务端机器肯定要使用服务端机器的真实地址,不然服务端机器不识别,肯定没法搞。使用命令netstat -natp
查看到服务器与客户端的连接,具体的四元组,所以就看到了(CIP)客户端的ip端口和(RIP)服务器自己的ip端口。然后服务端机器进行转换四元组,要发送给客户端,但肯定不是直接发给客户端,因为当初第一步是CIP 去请求VIP 到负载均衡器,所以客户端是不认识服务端机器的RIP 的,而是原路返回发送给负载均衡器,负载均衡器进行地址转换,再返回到客户端。
这种模式有个瓶颈,D-NAT是非对称的,就是说客户端请求的时候,发送的数据包是很小的,但是服务端返回的数据是很大的,所以返回数据的时候就出现瓶颈了。
DR
对客户端来说是透明的,它不知道,它只知道访问VIP。
因为上面的D-NAT模型在服务端返回数据给客户端时候,又出现瓶颈,所以有的DR模型,主要是想在客户端请求负载均衡器,负载均衡器再给分发到服务端机器,服务端想要把数据返回给客户端时候,不再原路返回,直接发送给了客户端。
如果服务端直接把数据发给客户端,要有对应的VIP,因为客户端只知道请求VIP,它是不知道服务端的RIP 的,所以服务端肯定要得到VIP,这样就有了客户端可以识别的四元组。
最重要的一点就是,VIP 只能有一个地方存在,就是负载均衡器,服务端机器肯定不可以对外暴露VIP,所以现在需要一个技术,隐藏VIP,服务器机器可以得到VIP,但是对外隐藏,对内可见。
负载均衡器在分发给服务端机器时候,动用了链路层,发送了mac地址,服务端机器收到的就是CIP->VIP | RIP@MAC
这样的一个数据包,这样就获取了所需要的客户端地址、虚拟VIP、RIP对应的mac地址也能匹配上,所以就可以把数据包直接发给客户端。
不过这种模式主要是基于2层(使用链路层),必须负载均衡器和服务端机器在同一局域网内,所以速度非常快,成本也很低,
TUN
客户端请求到负载均衡器时候,发送的数据包CIP->VIP
,负载均衡器在给服务端机器分发数据包的时候,应该发送数据包DIP->RIP
到服务端机器,但是这个DIP->RIP
的数据包里面包裹了数据包CIP->VIP
(这个称为隧道技术),当服务端接收到数据包DIP->RIP
以后,获取到里面的CIP->VIP
,然后进行转换成VIP->CIP
就可以直接发送给客户端了。
这样就解决了DR模型中负载均衡器必须和服务端在同一局域网的限制问题。