LVS之DR模式

LVS指的是Linux virtual server,用于负载均衡。基本所有的模式都有Director(DR)用于接收请求,然后Real server(RS)用于处理并回应用户的请求。Direct route方式下,RS的回包可以直接发往客户端而不必由DR转发,所以整体的性能得到了提高,在这里大致的记录下一个包从Client端发出后,经由各个流程后数据包各部分的改变情况。

假定以下环境信息:

  • Client IP:192.168.1.254/24 MAC:mc(简略了)
  • DR IP:192.168.1.2/24 MAC:md
  • RS IP:192.168.1.3/24 MAC:mr

已经做了以下的配置:

  • DR绑定了vip
  • RS lo绑定了vip,并且启用arp抑制

为了简化,IP地址前面的192.168.1均去除。除了这些,我们还需要一个vip(192.168.1.1)用于接受用户的请求。另外,一个数据包在这里经过简化,格式如下:

src ip | dest ip | src mac | dest mac

也就是假如忽略vip,client发往rs的请求包,格式如下:

254 | 3 | mc | mr

下面记录下各流程下数据包的改变。

  1. 请求由client端发往vip,所以初始的数据包信息应当如下:

     254 | 1 | mc | md
    

首先我们这里的场景是同一个网段内的记录。当client发出请求后,由于处于同一子网,所以向整个子网广播arp来查询vip对应的mac地址。在整个集群中,只有DR才会回应该arp请求,RS已经抑制了该arp请求,故该请求会发往DR。

  1. DR收到该请求后,依据负载均衡算法,选取RS,然后修改数据包的dest mac,数据包将如下:

     254 | 1 | mc | mr
    

因为DR模式必须RS和DR处于同一个网段,这样交换机才能根据mac地址把数据包发往RS。

  1. RS收到了数据包后,进入操作系统协议栈内进行拆包。首先mac地址正确,交往上层网络层。网络层会验证ip是否属于自己的机器,在配置中,我们把vip配置到了lo中,所以该数据包不会被丢弃,继续交由业务层处理。处理完后,数据包会直接发往客户端,这时候的socket 4元组为:

     1 | 254 | mr | mc
    

根据这个4元组信息,该数据包可以被发往client上,即使处于不同的网段,通过gateway也可以转发到目的机器上。可以看出,RS根本就不知道前面是否有DR,完全对上层透明。

由此可以看出,DR模式基本上是对于mac的修改,ip及以上的协议不会进行改动。实际上为了HA,往往会在LVS上层再加上keepalived来做高可用。

共 0 条回复
暂时没有人回复哦,赶紧抢沙发
发表新回复

作者

sryan
today is a good day