LVS指的是Linux virtual server,用于负载均衡。基本所有的模式都有Director(DR)用于接收请求,然后Real server(RS)用于处理并回应用户的请求。Direct route方式下,RS的回包可以直接发往客户端而不必由DR转发,所以整体的性能得到了提高,在这里大致的记录下一个包从Client端发出后,经由各个流程后数据包各部分的改变情况。
假定以下环境信息:
已经做了以下的配置:
为了简化,IP地址前面的192.168.1均去除。除了这些,我们还需要一个vip(192.168.1.1)用于接受用户的请求。另外,一个数据包在这里经过简化,格式如下:
src ip | dest ip | src mac | dest mac
也就是假如忽略vip,client发往rs的请求包,格式如下:
254 | 3 | mc | mr
下面记录下各流程下数据包的改变。
请求由client端发往vip,所以初始的数据包信息应当如下:
254 | 1 | mc | md
首先我们这里的场景是同一个网段内的记录。当client发出请求后,由于处于同一子网,所以向整个子网广播arp来查询vip对应的mac地址。在整个集群中,只有DR才会回应该arp请求,RS已经抑制了该arp请求,故该请求会发往DR。
DR收到该请求后,依据负载均衡算法,选取RS,然后修改数据包的dest mac,数据包将如下:
254 | 1 | mc | mr
因为DR模式必须RS和DR处于同一个网段,这样交换机才能根据mac地址把数据包发往RS。
RS收到了数据包后,进入操作系统协议栈内进行拆包。首先mac地址正确,交往上层网络层。网络层会验证ip是否属于自己的机器,在配置中,我们把vip配置到了lo中,所以该数据包不会被丢弃,继续交由业务层处理。处理完后,数据包会直接发往客户端,这时候的socket 4元组为:
1 | 254 | mr | mc
根据这个4元组信息,该数据包可以被发往client上,即使处于不同的网段,通过gateway也可以转发到目的机器上。可以看出,RS根本就不知道前面是否有DR,完全对上层透明。
由此可以看出,DR模式基本上是对于mac的修改,ip及以上的协议不会进行改动。实际上为了HA,往往会在LVS上层再加上keepalived来做高可用。