LVS有多种模式(或者称为模型),在不同的模型下,LVS实现负载均衡的方式也不同,也就是说,我们可以通过不同的"姿势"来配置LVS,但是为了尽量降低我们认识LVS的门槛,我们可以先从较为简单的、容易理解的模式开始。
我们先来了解一下LVS的NAT模型(此模型较为容易理解),LVS-NAT模型的结构示意图如下
从上图可以看出,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配置如下图所示
在整个过程中,报文的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,于是响应报文被发往客户端,客户端则会收到响应报文,其实上述整个过程是一个DNAT的过程,所以,此种LVS模型被称之为LVS-NAT模型。
VS服务器主要负责调度,所以,我们也称上图中的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,ipvs是LVS的核心实现,但是我们不能直接操作ipvs,我们需要借助管理工具ipvsadm定义LVS集群规则,ipvs再根据我们定义好的规则进行工作。
ipvsadm:LVS管理工具,管理员通过ipvsadm定义或管理集群规则。
ipvs:LVS核心实现,根据定义好的集群规则进行工作。
好了,LVS-NAT模型以及ipvs工作的大致原理我们已经了解完了,只要动手定义好对应的规则,即可配置出一个LVS集群,但是,我们还没有介绍过怎样使用ipvsadm,那么现在,我们就来聊聊,怎样使用ipvsadm命令定义规则。
http://www.zsythink.net/archives/2185
Keepalived is a routing software written in C. The main goal of this project is to provide simple and robust facilities for loadbalancing and high-availability to Linux system and Linux based infrastructures. Loadbalancing framework relies on well-known and widely used Linux Virtual Server (IPVS) kernel module providing Layer4 loadbalancing. Keepalived implements a set of checkers to dynamically and adaptively maintain and manage loadbalanced server pool according their health. On the other hand high-availability is achieved by VRRP protocol. VRRP is a fundamental brick for router failover. In addition, Keepalived implements a set of hooks to the VRRP finite state machine providing low-level and high-speed protocol interactions. In order to offer fastest network failure detection, Keepalived implements BFD protocol. VRRP state transition can take into account BFD hint to drive fast state transition. Keepalived frameworks can be used independently or all together to provide resilient infrastructures.