LVS(Linux Virtual Server)Linux虚拟服务器,通过虚拟IP来接受请求,通过一定的方法(由LVS的模式决定)转发到对应的real server(RS)实际服务器,达到流量分发、负载均衡的目的。该项目是由我国的章文嵩博士主导立意的项目。
原理 LVS的负载均衡是基于底层IP协议来实现的,所以在了解其原理前,需要对计算机网络有一定的认知,OSI七层模型,已经个层的作用。
LVS的实现只用到了OSI的底三层,不同的LVS模式,采用的方法不同。由于LVS的转发只涉及到OSI的底层协议。如TCP协议通讯,LVS不与client端建立TCP连接(可以理解成省去了TCP的三次握手),直接与real server建立连接,LVS只做数据包的转发。对比传统的七层,作用于应用层的负载均衡器(如Nginx)有着显著的性能优势。
有很多互联网公司,当在Nginx压力过大的情况下,都再用在Nginx的http服务器前面会搭建一个LVS负载均衡器来提升系统在并发情况下的高可用性。
直接路由模式(DR)地址转换模式(NAT)IP隧道模式(TUN)
在后面继续聊LVS前,必需先了解相关专业术语。客户端(浏览器)ip地址CIP;LVS服务器需要提供两个IP地址,一个是虚拟IP地址,即客户端访问的IP地址(VIP),另外一个是LVS服务器对内网的真是IP地址(DIP);然后真实应用服务器也需要提供两个IP地址,一个是本机的局域网IP地址(RIP),然后还需要提供一个与VIP保持一致的虚拟IP地址(RVIP)。
CIP:客户端地址,为源IP;
VIP:也就是虚拟系统的对外IP,用户接受客户端请求的。
DIP:LVS服务器所在局域网的主机IP地址,用来再局域网中地址通讯的。
RIP:真实服务器的局域网IP地址,用户局域网内的主机路由;
RVIP:真实服务器VIP,与LVS的VIP相同。用于处理目标IP为VIP的请求,该VIP需要对外不可见,不然会与本局域网的LVS的VIP地址冲突,可以修改linux内核ARP协议参数,来达到该IP对主机可见,但是对外不可见的目的。(ARP协议主要用于定位目标IP的mac地址)。 直接路由模式
直接路由模式,也是企业中用得最多的一种模式,由LVS来hold流量,然后转发连接请求到RServer,然后又RS处理并返回对应的处理结果到源IP(客户端)。结构图如图所示:
在用户请求过来时,达到LVS服务器,然后LVS通过相应的负载均衡算法,在不修改数据报文的情况下,将mac地址修改为对应真实服务器的mac地址。由真实服务器处理完数据包后,直接返回数据包到CIP,由于真实服务器具备VIP的网络接口能力,所以返回数据包的源地址可以是VIP,这样客户端CIP就能正常的处理。在计算机网络中,如果返回数据包的目标IP、源IP与请求数据包源IP、目标IP不一致,则会导致客户端不会处理该返回数据包,会直接丢弃。
这里有个疑问点:为什么LVS能找到真实服务器的mac地址呢?
首先得明白IP协议路由的原理,通过目标IP地址与本机的路由规则表进行掩码的与运算,得到下一跳的IP地址。ARP地址广播协议会使各主机保存自己路由表中相关IP地址的MAC地址,然后通过mac地址直接进行网络连接发送数据包。
这里LVS就是通过拦截客户端访问的IP:PORT来与自己的IPVS配置进行判断,如果出发拦截则进行负载均衡的计算,得到真实的目标IP,再通过主机的ARP协议得到真实服务器的MAC地址,通过修改数据包的MAC地址来达到下一次将数据包发送到对应的真实服务器上。这种手段,在计算机网络中又叫做MAC欺骗。
优点:
真实服务器响应数据包不需要通过LVS服务器转发,在网络带宽上效率是最优的。
缺点:
从LVS到真实服务器是通过MAC欺骗来实现的,所以在IP路由上只能伪装到下一跳MAC地址,这也就表明了LVS服务器与真实服务器需要处理统一局域网内,两者之间只能有一跳的距离。 地址转换模式
地址转换模式,与SNAT有点相似,都是对地址进行转换,从而使得网络中各数据包能够正常的传递。
CIP请求到LVS服务器后,首先是对CIP请求的ip地址和端口进行拦截,符合拦截规则的话则进行负载均衡,确定好某一台RS的IP后,将数据包中目标地址转换成RS的IP地址,在将该数据包通过IP路由规则转发给对应的下一跳主机。对于响应数据包,同样的线响应到LVS服务器,然后LVS对相应数据包的源地址进行修改,修改成LVS服务器的VIP地址,这样保证的数据包发送与处理的安全可靠性。
RS真实服务器或者LVS到RS整个链路中需要具备能使得RS的响应数据包能到转发LVS服务器上,然后又LVS服务器进行源地址的转换。
优点:
RS与LVS可以跨局域网部署,伸缩性强。很多人都说NAT不能跨子网部署,其实是能实现的,只是在同一子网内,部署起来很简单,RS只需要修改默认公网网关就行,返回数据包先到LVS服务器再由LVS服务器走子网网关出去。
缺点:
缺点很明显,就是请求数据包和相应数据包都走LVS,这样LVS的网络IO的压力将非常大,同事网络带宽也成为了主要瓶颈。 IP隧道模式
隧道模式是中和前面两种模式的优缺点。我们都知道DR模式不能跨局域网,而NAT模式LVS的性能存在瓶颈。所以TUN模式就需要做到返回数据包不用路由到LVS服务器,能使用到DR模式的有真是服务器直接返回给客户端;同时TUN模式也需要兼顾NAT模式的跨局域网的能力。这就有了IP隧道模式,即开辟一条LVS到真是服务器的IP隧道(有点类似一些VPN的实现)。
原理是由LVS拦截对应的请求后,用一个新的请求头包含住原来的请求数据包,新的请求头目标IP设置为某台真实服务器IP。那么就需要建立一条LVS与RS的IP隧道,使得新的数据包能根据现有网络的路由规则最后到达RS服务器上,然后RS进行处理。这样就具备了跨子网部署的能力。
真实服务器RS就需要具备VIP的相应网络接口用来处理源IP为CIP目标IP为VIP的数据包。处理完成后后RS的VIP网络接口将相应数据包发送回CIP。这样相应数据包就与CIP客户端直连了具备DR模式的能力。
优点:
这就不需要多说了,同时兼备了NAT和DR的能力。
缺点:
需要所有服务器需要具备IP隧道的能力,即RS节点需要合法IP(LVS肯定有合法IP),这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。 三种模式的总结
不管是使用哪种模式总有一定的局限性,具体还得根据自身业务来做规划。在搭建LVS的时候,DR、TUN需要真实服务器虚拟一个IP与LVS的VIP保持一致,且需要修改arp参数来对外隐藏,NAT需要RS或者RS到LVSIP路有中具备定向路由回LVS服务器上来做源地址的切换(NAT这个问题可以采用FULLNAT解决,即LVS上源地址和目标地址全换,那么从RS回来的数据包则不需要做定向路由到LVS上了)。
采用LVS虽然一定程度上解决了流量压力大的问题(太大也hold不住,单台服务器始终存在瓶颈),但是LVS部署起来的成本还是很高的,且LVS既然是单台服务器就肯定会存在单点问题(服务器宕机)。生产上一般可以用keepalived采用主备的形式来保证高可用。当主LVS宕机时,备机上的keepalived就会将LVS的VIP漂移到备机上来,这样内部应用还是可以用的。