LVS实现负载均衡

LVS是什么

LVS(LinuxVirtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。

LVS基于内核网络层工作,有着超强的并发处理能力,单台LVS可以承受上万的并发连接。

LVS是基于四层网络协议的负载均衡软件,因此LVS在所有负载均衡软件中性能最强,稳定性最高,消耗CPU和内存少,并且可以对应用层的所有协议作负载均衡,包括http、DNS、ftp等。

LVS分层及组成

LVS负载均衡分为3层:

第一层:负载调度器(load balancer/Director),它是整个集群的总代理,它有两个网卡,一个网卡面对访问网站的客户端,一个网卡面对整个集群的内部。负责将客户端的请求发送到一组服务器上执行,而客户也认为服务是来自这台主机的。

第二层:服务器池(server pool/ Realserver),是一组真正执行客户请求的服务器,可以当做WEB服务器。

第三层:共享存储(sharedstorage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。一个公司得有一个后台账目吧,这才能协调。不然客户把钱付给了A,而换B接待客户,因为没有相同的账目。B说客户没付钱,那这样就不是客户体验度的问题了。

基于NAT技术实现的LVS请求转发原理

NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用户可以访问位于公司内部的私有IP主机。

第一步,用户通过互联网DNS服务器解析到公司负载均衡设备上面的外网地址,相对于真实服务器而言,LVS外网IP又称VIP(Virtual IP Address),用户通过访问VIP,即可连接后端的真实服务器(Real Server),而这一切对用户而言都是透明的,用户以为自己访问的就是真实服务器,但他并不知道自己访问的VIP仅仅是一个调度器,也不清楚后端的真实服务器到底在哪里、有多少真实服务器。

第二步,就是在TCP连接基础之上,去发送HTTP请求报文,把HTTP请求报文发送到LVS上去,LVS再根据预设的算法把这个HTTP请求报文转发给后端的Web服务器,也就是真实服务器,后端获取到一个完整的HTTP请求报文,接着就可以进行请求处理。

但是,假设你认为LVS是收到HTTP请求报文然后转发给Web服务器这样的一个原理,那你就完全大错特错了!对LVS的原理的理解就彻底错误了!

LVS是工作在四层网络协议(传输层)上的负载均衡的技术,Nginx是工作在七层网络协议(应用层)上的负载均衡的技术

由于LVS负载均衡系统核心代码是挂载在linux内核层面的,所以linux服务器拿到一个建立TCP连接过程中的初始SYN报文之后,这个SYN报文就会由linux内核转交给LVS的核心代码模块,此时LVS核心代码模块会根据负载均衡算法从后端Web服务器池子里挑选出来一台机器,然后使用NAT技术改写报文中的目标地址和端口为后端真实服务器的地址和端口,最后将报文转发给Web服务器。

而且此时客户端一定是想要跟LVS服务器建立一个TCP Socket网络连接的,此时LVS会把跟这个客户端的Socket连接记录到一个hash表里去,以及这个连接的请求转发到哪个Web服务器了,下次同一个Socket连接再发送后续的报文来的时候,LVS就会把这个连接的报文同样再次转发给上次转发的那台Web服务器去。

第三步,真实的服务器接收到报文后进行组装,处理请求后将响应数据包返回给LVS调度器,调度器在得到响应的数据包后会再次使用NAT技术将源地址和源端口修改为VIP及调度器相应的端口,修改完成后,由调度器将响应数据包发送回终端用户。

LVS会对每个连接进行监听,在不同的TCP状态下有不同的超时时间,如果超时没拿到请求,就把这个连接从hash表中删除。

LVS架构原理1

基于IP隧道技术的LVS请求与响应分离原理

在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以就需要将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。

IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。

每一台Web服务器都把自己的VIP配置在IP隧道设备上。

LVS拿到请求之后,把目标地址为VIP的请求报文封装到另外一个IP报文里,封装源IP为为DIP(LVS IP),目标IP为后端某台真实服务器的IP,接着转发IP报文,Web服务器拿到IP报文以后解析一下,拿到里面的请求报文,发现目标地址就是一个VIP,结果这个VIP就配置在IP隧道设备上,此时就可以处理这个请求。

Web服务器想要去发送响应,响应发送给谁呢?已经不是LVS了,此时会根据报文里的一些信息,然后Web服务器直接根据自己的路由表,找到需要返回响应的客户端,把响应报文返回给指定的客户端就可以了。

LVS架构原理2