Loading... 在了解LVS之前,最好已经熟练的掌握了iptables的相关概念与操作,否则在了解LVS时有可能会遇到障碍,如果你想要了解iptables的相关知识,可以参考iptables相关系列文章,直达链接如下: <span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/archives/tag/iptables/" target="_blank"><i data-feather="external-link"></i>https://www.zsythink.net/archives/tag/iptables/</a></span> 如果一台服务器承受过多的压力,那么服务可能会崩溃,所以,我们应该让一台服务器承受的压力在合理范围内,但是如果服务端必须要承受较大的压力,那么一台服务器可能无法满足我们的要求,所以我们可以使用多台服务器分摊这些压力,当一定数量的服务器作为一个整体对外提供服务,并且分摊压力时,那么我们可以称这些服务器为”负载均衡集群”。 使用 LVS 即可实现”负载均衡集群”。 LVS是Linux Virtual Server的缩写,从字面意思上翻译,LVS应该译为”Linux虚拟服务器”,但是这样的翻译对于初学者来说可能不容易理解,我们暂且不用纠结,等了解完了相关概念,我们自然会明白它的含义。 通过LVS实现负载均衡集群的方案属于”软件方案”,当然,既然有”软件方案”,那么肯定有对应的”硬件方案”,但是,硬件方案所需的成本比较高,我们需要购买特定的负载均衡硬件设备,以达到负载均衡的目的,比较知名的负载均衡硬件设备厂商有F5、Citrix等,但是硬件方案并不是此处讨论的重点,我们了解即可。而能够实现负载均衡之目的软件也不只有LVS一种,我们也可以通过nginx、haproxy等软件实现负载均衡的目的。当然,这篇文章就是介绍LVS的,所以其他方法我们不用理会,先来看看LVS是怎样实现负载均衡的。 LVS有多种模式(或者称为模型),在不同的模型下,LVS实现负载均衡的方式也不同,也就是说,我们可以通过不同的”姿势”来配置LVS,但是为了尽量降低我们认识LVS的门槛,我们可以先从较为简单的、容易理解的模式开始。 我们先来了解一下LVS的NAT模型(此模型较为容易理解),LVS-NAT模型的结构示意图如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/070617_0124_1.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/070617_0124_1.png" style=""> 上图所示意的场景中,有三种角色。 角色一:客户端 角色二: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),因为真正干活的(处理请求的)服务器是后端的RealServer,LVS服务器只负责调度。 从上图可以看出,LVS服务器是直接面向客户端的,所以,LVS服务器必须有一个公网IP,才能服务在互联网上,我们称配置在LVS服务器上的公网IP为VIP,即Virtual IP,在LVS-NAT模型中,负载均衡集群内部的主机都是通过内网IP通讯的,也就是说,LVS-NAT集群内部的主机需要在相同网段的内网中,而集群中的每个主机均配置有一个内网IP,LVS服务器当然也属于负载均衡集群内部的主机,所以它也需要配置一个内网IP,我们称配置在LVS服务器上的内网IP为DIP,可以理解为Director IP,也就是负责调度的导演IP,而每个RealServe上都有一个与DIP在同一网段的内网IP,我们称配置在RealServer上的内网IP为RIP,我们将客户端的IP简称为Client IP ,即CIP,所有机器的IP配置如下图所示 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/070617_0124_2.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/070617_0124_2.png" style=""> 其实,从名字上也能看出,LVS-NAT模型是利用了NAT的特性,NAT为”Network Address Translation”的缩写,译为”网络地址转换”,什么是”网络地址转换”,在哪些场景中需要用到”网络地址转换”,我们已经在iptables的相关文章中介绍过了,此处就不再赘述了,如果你对相关概念还不是特别了解,可以参考如下文章中的概念部分。 <span class="external-link"><a class="no-external-link" href="https://www.zsythink.net/archives/1764" target="_blank"><i data-feather="external-link"></i>https://www.zsythink.net/archives/1764</a></span> 既然LVS-NAT模型是利用了”网络地址转换”的特性,那么,在整个过程中,报文的IP到底发生了怎样的转换呢?通过如下示意图,即可明白报文IP的 转换过程,为了使示意图更加简洁明了,图中只画出了一个RealServer,同时,我们可以配合图下方的描述,来理解报文中IP被转换的整个过程。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/070617_0124_3.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/070617_0124_3.png" style=""> 正如上图所示,客户端的请求会发往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,于是响应报文被发往客户端,客户端则会收到响应报文,其实上述整个过程是一个DNAT的过程,所以,此种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:LVS管理工具,管理员通过ipvsadm定义或管理集群规则。 ipvs:LVS核心实现,根据定义好的集群规则进行工作。 其实,ipvs是与netfilter结合在一起使用的,2.4.X版本以后的内核中,ipvs作为netfilter的模块存在。 还记得iptables中的5条链吗?如果你忘了,请回顾本博客中的iptables系列文章,而ipvs其实就是附属在INPUT链上进行工作的,示意图如下 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/07/070617_0124_4.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/07/070617_0124_4.png" style=""> 当客户端访问服务时,会访问VIP+端口,所以,客户端的请求报文会发往调度器,请求报文会先经过PREROUTING链,然后进行路由判断,由于此刻报文的目标IP为VIP,而VIP对于调度器来说,就是本身的IP,所以报文会经过INPUT链,此刻,如果IPVS发现报文访问的VIP+端口与我们定义的LVS集群规则相符,ipvs则会根据定义好的规则与算法,将报文直接发往POSTROUTING链,然后报文则会发出,最后到达后端的RealServer中。 好了,LVS-NAT模型以及ipvs工作的大致原理我们已经了解完了,只要动手定义好对应的规则,即可配置出一个LVS集群,但是,我们还没有介绍过怎样使用ipvsadm,那么现在,我们就来聊聊,怎样使用ipvsadm命令定义规则。 如果你很熟悉iptables命令,那么了解ipvsadm命令时就会非常轻松,因为他们之间有异曲同工之妙。 但是由于篇幅的原因,今天暂时就写到这里吧,我们会在下一篇文章中描述怎样使用ipvsadm命令,可以点击如下连接直接访问之后的文章。 <a href="https://www.zsythink.net/archives/2185" target="_blank" rel="noopener">LVS入门系列(2):LVS-NAT</a> 希望这篇文章能够对你有所帮助,你的评论、收藏、或点赞是我前进的动力,常来捧场呦~~ 转载自朱双印日志https://www.zsythink.net/archives/2134 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏