如果一台服务器承受过多的压力,那么服务可能会崩溃,所以,我们应该让一台服务器承受的压力在合理范围内,但是如果服务端必须要承受较大的压力,那么一台服务器可能无法满足我们的要求,所以我们可以使用多台服务器分摊这些压力,当一定数量的服务器作为一个整体对外提供服务,并且分摊压力时,那么我们可以称这些服务为“负载均衡集群”。

使用LVS即可实现“负载均衡集群”。

LVS是Linux Virtual Server 的缩写,从字面意思上翻译,LVS应该译为“Linux虚拟服务器”,但是这样的翻译对于初学者来说可能不容易理解,我们暂且不用纠结,等了解完了概念,我们自然会明白它的含义。

通过LVS实现负载均衡集群的方案属于“软件方案”,当然,既然有“软件方案”那么肯定有对应的“硬件方案”,但是,硬件方案所需的成本比较高,我们需要购买特定的负载均衡硬件设备,以达到负载均衡的目的,比较知名的负载均衡硬件设备厂商有F5,Citrix等,但是硬件方案并不是此处讨论的重点,我们了解即可。而能够实现负载均衡之目的软件也不只有LVS一种,我们也可以通过nginx,haproxy等软件实现负载均衡的目的。当然,这篇文章就是介绍LVS的,所以其他方法我们不用理会,先来看看LVS是怎样实现负载均衡的。

LVS有多种模式(或者称为模型),在不同的模型下,LVS实现负载均衡的方式也不同,也就是说,我们可以不同的“姿势”来配置LVS,但是为了尽量降低我们认识的LVS的门槛,我们可以先从较为简单的,容易理解的模式开始。

我们先了解一下LVS的NAT模型(此模型较为容易理解),LVS-NAT模型结构示意图如下。

初识LVS和LVS_NAT-LMLPHP

上面所示意的场景中,有三种角色。负载

角色—:客户端

角色二:LVS服务器,我们说过,LVS是实现负载均衡的软件方案,所以,上图中的LVS主机即安装了LVS的服务器。

角色三:真正用来分摊压力,处理请求的服务器,我们称之为RealServer

上图中的LVS服务器与各个RealServer组成了一个“负载均衡”。

聪明如你一定看懂了,上图中,LVS服务器只负责接收来自客户端的请求,然后将客户端请求分派至后端得Realserver上,用户请求被分摊后,真正处理客户端请求得是上图中的RealServer,当RealServer将客户端请求报文处理完毕后,会将响应报文统一返回到LVS所在的服务器,最后再用由LVS服务器将响应报文返回到客户端,上述整个过程中,LVS服务器并没有处理客户端请求,LVS服务器只负责将来自前端的压力尽量均衡的分配至后端主机,真正处理客户端请求的上图中的后端主机(即RealServer),上图为了示意简洁,所以只使用了两台服务器作为RealServer,而在实际使用的过程中,RealServer的数量可以更多。

举个例子,假设上图中的负载均衡集群提供的是web服务,那么上图中的RealServer1服务器RealServer2服务器中都会提前安装好httpd,假设在某一时刻,有1000个请求报文“web”,那么这1000个请求会发往LVS服务器,LVS服务器中并没有安装httpd,所以它也不会去处理这些请求,但是LVS服务器会尽量均衡的将1000个请求报文发送到后端的RealServer中,当RealServer中的httpd处理完这些请求后,由RealServer将对应的响应报文返回LVS,最后再由LVS将响应报文返回给客户端。

所以,我们往往称LVS服务器为“调度器”(Scheduler),或者称LVS服务器为“导演”(director),因为真正干活的(处理请求的)服务器是后端的RealSsrver,LVS服务器只负责调度。

从上图可以看出,LVS服务器是直接面向客户端,所以,LVS服务器必须有一个公网IP,才能服务在互联网上,我们称配置在LVS服务器上的公网IP为VIP,即Virtual IP,在LVS-NAT模型中,负载均衡集群内部的主机都是通过内网IP通讯的,也就是说,LVS-NAT集群内部的主机需要在相同网段的内网中,而集群中的每个主机配置有一个内网IP,LVS服务器当然也属于负载均衡集群内部的主机。所以它也需要配置一个内网IP,我们称配置在LVS服务器上的内网IP为DIP,可以理解为Director IP ,也就是负责调度的导演IP,而每个RealServer上都有一个与DIP在同一网段的内网IP,我们称配置在RealServer上的内网IP为RIP,我们将客户端的IP简称Client IP,即CIP,所有机器的IP配置如下图所示

初识LVS和LVS_NAT-LMLPHP

其实,从名字上也能看出,LVS-NAT模型是利用了NAT的特性,NAT为“Network Address Ttanslation”的缩写,译为“网络地址转换”,什么是“网络地址转换”,在哪场景中需要用到“网络地址转换”,

既然LVS-NAT模型是利用了“网络地址转换”那么,在整个过程中,报文的IP到底发生了怎样的转换呢?通过如下示意图,即可明白报文IP的转换过程,为了使示意图更加简洁明了,图中只画出了一个RealServer,同时,我们可以配合图下方的描述,来理解报文中IP被转换的整个过程。

初识LVS和LVS_NAT-LMLPHP

正如上图所示,客户端的请求会发生LVS主机,此时,客户端请求报文的源IP为CIP,目标IP的LVS的VIP,当LVS收到客户端的请求报文时,会将请求报文中的目标IP修改为后端某个RealServer的RIP,就以上图为例,当LVS收到客户端请求报文时,会将报文中VIP修改为RIP1或者RIP2,具体将VIP修改为哪个RealServer的RIP,取决于LVS使用的具体算法,最好理解的负载均衡算法就是轮询算法了,用大白话说,轮询算法就是如果这次将报文的目标IP修改为RIP1,那么下次就将目标IP被修改为RIP2,在下次就再将目标IP修改为RIP1,以此类推,当然,除了轮询算法,还有很多别的算法可供我们选择,但是此处我们暂时先不考虑这么多,当客户端请求报文的目标IP被修改对应的RIP后,请求报文的源IP为CIP,目标IP已经改为RIP,那么报文自然会被LVS转发到对应的RealServer中,当RealServer收到对应的请求报文时,会发现报文的目标IP就是自己的RIP,于是就会收到报文,处理后进行响应,因为RealServer收到请求报文时,源IP为CIP,目标IP为RIP,所以RealServer在进行响应时,响应报文的源IP则为RIP,目标IP则为CIP,但是CIP对于RealServer来说肯定不在一个网络内,因为CIP是一个公网IP,所以,我们要将所有RealServer的网关指向DIP,当RealServer产生响应报文时,会将响应报文发往网关DIP,而DIP就是LVS的内网IP,当LVS收到对应的响应报文时,响应报文的源IP为RIP,目标IP为CIP,此时,LVS会将响应报文的源IP修改为VIP,修改后的响应报文的源IP为VIP,目标IP为CIP,于是响应报文被发往客户端,客户端会收到响应报文,其实上述整个过程是一个DANT的过程,所以,此种LVS模型被称之为LVS-NAT模型。

上图中,LVS服务器主要负责调度,所以,我们也称上图中的LVS主机为调度器,聪明如你一定想到了,我们需要在角色为调度的主机一定的配置,比如,我们需要定义,当客户端访问调度器的VIP+80端口时,就表示客户端想要访问http服务,当然,对于客户端来说,LVS集群是透明的,客户端并不知道有一个“集群”的存在,客户端只知道访问VIP:80时,可以访问到自己的需要的网页,但是我们则必须清楚整个集群结构的来龙去脉,所以,我们需要在调度器上配置,当客户端访问VIP+80端口时,就代表客户端访问了一个“http集群”,同时,我们需要定义这个集群中那些主机扮演“RealServer”,还需要定义调度通过什么算法,将请求负载到后端的RealServer中。

如果我们想要实现这些定义,需要借助一个管理工具,它就是ipvsadm

我们可以将ipvsadm理解成一个用户工具,我们需要借助这个工具定义LVS集群规则。

但是,我们通过ipvsadm定义的规则最终还要依靠ipvs才能生效,我们可以这样理解,ipvs才是核心,但是作为管理员,我们需要通过ipvsadm才能定义规则,ipvs会根据我们定义的规则进行工作,ipvsadm工作用户空间,ipvs工作于内核空间,ipvsadm与ipvs的关系,就好比iptables与netfilter的关系。

综上所述,LVS由两部分组成,ipvs与ipvsadm

ipvsadm:管理工具,管理员通过ipvsadm定义或管理集群规则。

ipvs:LVS核心实现,根据定义好的集群规则进行工作。

其实,ipvs是netfilter结合在一起的使用的,2.4.X版本以后的内核中,ipvs作为netfilter的模块存在。

还记得iptables中的5条链吗?如果你忘了,请回顾本博客的iptables系列文章,而ipvs其实就是附属在INPUT链上进行工作的,示意图如下

初识LVS和LVS_NAT-LMLPHP

当客户端访问服务时,会访问VIP+端口,所以,客户端的请求报文会发往调度器,请求报文会先经过PREROUTING链,然后进行路由判断,由于此刻报文的目标IP为VIP,而VIP对于调度器来说,就是本身的IP,所以报文会经过INPUT链,此刻,如果IPVS发现报文访问的VIP+端口与我们定义的LVS集群规则相符,ipvs则会根据定义好的规则与算法,将报文直接发往POSTROUTING链,然后报文则会发出,最后到达后端的RealServer中。

好了,LVS-NAT模型以及ipvs工作的大致原理我们已经了解完了。只要动手定义好对应的规则,即可配置出一个LVS集群,但是,我们还没有介绍过怎样使用ipvsadm,那么现在,我们就来聊聊,怎样使用ipvsadm命令定义规则。

如果你很熟悉iptables命令,那么了解ipvsadm命令就会非常轻松,因为他们有异曲同工之妙。

05-26 08:25