zoukankan      html  css  js  c++  java
  • 初识LVS和LVS_NAT

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

     

    使用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是实现负载均衡的软件方案,所以,上图中的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-NAT模型是利用了NAT的特性,NAT为“Network Address Ttanslation”的缩写,译为“网络地址转换”,什么是“网络地址转换”,在哪场景中需要用到“网络地址转换”,

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

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

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

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

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

  • 相关阅读:
    C#listbox使用方法
    poj 3894 System Engineer (二分图最大匹配--匈牙利算法)
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 黑白无常
  • 原文地址:https://www.cnblogs.com/momenglin/p/8510887.html
Copyright © 2011-2022 走看看