LVS入门系列(1):初识LVS与LVS-NAT

  • A+
所属分类:LVS  运维技术

在了解LVS之前,最好已经熟练的掌握了iptables的相关概念与操作,否则在了解LVS时有可能会遇到障碍,如果你想要了解iptables的相关知识,可以参考iptables相关系列文章,直达链接如下:

http://www.zsythink.net/archives/tag/iptables/

 

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

 

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

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

 

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

 

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

 

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

LVS入门系列(1):初识LVS与LVS-NAT

上图所示意的场景中,有三种角色。

角色一:客户端

角色二: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配置如下图所示

LVS入门系列(1):初识LVS与LVS-NAT

 

其实,从名字上也能看出,LVS-NAT模型是利用了NAT的特性,NAT为"Network Address Translation"的缩写,译为"网络地址转换",什么是"网络地址转换",在哪些场景中需要用到"网络地址转换",我们已经在iptables的相关文章中介绍过了,此处就不再赘述了,如果你对相关概念还不是特别了解,可以参考如下文章中的概念部分。

https://www.zsythink.net/archives/1764

 

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

LVS入门系列(1):初识LVS与LVS-NAT

 

正如上图所示,客户端的请求会发往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链上进行工作的,示意图如下

LVS入门系列(1):初识LVS与LVS-NAT

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

 

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

 

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

但是由于篇幅的原因,今天暂时就写到这里吧,我们会在下一篇文章中描述怎样使用ipvsadm命令,可以点击如下连接直接访问之后的文章。
LVS入门系列(2):LVS-NAT

希望这篇文章能够对你有所帮助,你的评论、收藏、或点赞是我前进的动力,常来捧场呦~~

  

weinxin
我的微信公众号
关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~
朱双印

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:10   其中:访客  5   博主  5

    • avatar hesheng 2

      一直有个疑问,这个LVS能承载多少链接的转发?虽然LVS不用处理请求,但转发请求,转发数据也需要占用资源,一个lvs后面最多能有多少个RealServer?

        • avatar 朱双印 Admin

          @hesheng NAT模型中调度器会成为RealServer数量增加的瓶颈,DR模型不会,因为DR模型中,响应报文不再经过调度器,而响应报文比较请求报文而言,还是较大的,所以根据应用场景的不同,具体情况也不同,LVS的各种模型工作在传输层或者网络层(也有人说链路层),所以不受套接字限制,也就是说不受端口数量限制(65535个端口),理论上来说LVS性能取决于你的硬件,同理,向后推算,LVS能转发多少,根据RealServer的处理能力,就应该准备多少RealServer

        • avatar echo 5

          博主又开始挖 “坑”了 哈哈

            • avatar 朱双印 Admin

              @echo 哈哈,这”坑”是谁挖谁填,我这也是鞭策自己了算是 :mrgreen: 一起加油~~

            • avatar yong 3

              博主文章来得真及时。最近,刚好想学习一下LVS的知识。期待您的好文哦 :wink:

                • avatar 朱双印 Admin

                  @yong 兄弟捧场啊~~不过兄弟这样说我感觉压力好大,我尽量不负所望,一起加油~~ :wink:

                • avatar 刘家宝 1

                  这个是新添加的哦,现在正在看着呢,刚才还没有呢。

                    • avatar 朱双印 Admin

                      @刘家宝 哈哈,能排到前几名,没毛病~~
                      顺便做下广告,扫描博客文章中的二维码,添加”实用运维笔记”微信公众号,当博客中有新文章时,会第一时间得知哦~~
                      常来捧场呦,亲~~

                        • avatar 刘家宝 1

                          @朱双印 这几天每天都在看,看了很多。都说ansible更常用啊,为啥写了puppet呢

                            • avatar 朱双印 Admin

                              @刘家宝 Ansible还没有开始写,最近想要多开几个坑,但是又怕填坑填不过来,所以准备慢慢来,等重写ansible笔记的时候,会在微信公众号中群发通知的,有空常来呦~