Web后端系统架构漫谈(4)——LVS的三种工作方式

LVS的全称是”Linux Virtual Server”,即Linux虚拟服务器,该项目项目于1998年由章文嵩博士创立。LVS实现了IP层的数据包转发和负载均衡,常被用来进行后端服务集群的虚拟化,对外提供一个统一的IP入口,使整个后端服务集群对外部用户完全透明,就好像是一个台服务器对外提供服务一样。另外使用LVS可以很方便地在后端服务器集群中增删服务节点来提供高可扩展性,LVS也提供健康检查来实现集群的高可用性。

虚拟服务器的工作示意图(图片来自http://www.linuxvirtualserver.org/):

LVS_1

LVS有三种工作方式:

  1. VS-NAT (网络地址转换)
  2. VS-DR (直接路由)
  3. VS-TUN (隧道)

1. VS-NAT

VS-NAT的工作示意图(图片来自http://www.linuxvirtualserver.org/):

LVS_2

由于全世界范围内IPv4的资源紧张,但是又有大量的主机需要连接到Internet,所以要想让所有想连接到Internet上的主机都有一个IPv4的公网地址不大现实。于是人们就想到了NAT这种方式。NAT全称是”Network Address Translation”,即网络地址转换。在NAT方式中,LVS的作用是负载均衡和双向请求转发。一个外部请求到达LVS后,LVS检查数据包的目的地址和端口号,如果能在LVS的路由表中找到匹配项,就使用调度算法选择其中一服务器,然后将数据包的目的地址和端口号改写成被选中的服务器的内网IP地址和端口号,接着将数据包转发到这台服务器上,与此同时LVS还会将这条已经建立的连接记录在内部一个哈希表中。之后如果传入的数据包属于这个连接时,LVS在哈希表中就可以直接找到这台服务器,并将数据包包改写后转发过去。当收到服务器应答数据包后,LVS会改写数据包的源地址和源端口号为LVS的外网IP地址和端口号,再将数据包发送给外部的请求方。之后会将这条连接的信息从内部哈希表中删除。

下面用图示的方式看一下NAT的工作方式,假设一个网络的内部结构如下(图片来自http://www.linuxvirtualserver.org/):

LVS_3

路由表如下:

Protocol Virtual IP Address Port Real IP Address Port Weight
TCP 202.103.106.5 80 172.16.0.2 80 1
TCP 202.103.106.5 80 172.16.0.3 8000 2
TCP 202.103.106.5 21 172.16.0.3 21 1

当一个外部请求到来时,它的目的IP地址是202.103.106.5,目的端口号为80,下面是该请求在这个网络中的处理步骤:

  1. 请求到达LVS,LVS检查路由表,发现满足端口号为80的服务器有两台,使用调度算法选择一台,假设这里选择权重较高的172.16.0.3,端口号为8000。
  2. 将数据包的目的地址和目的端口号分别改为172.16.0.3和8000,将该连接加入内部哈希表中,然后将请求包转发到172.16.0.3的8000端口。后续在该连接上如果还有数据包到来,直接从哈希表中取出连接,修改数据包并转发。
  3. 172.16.0.3收到数据包,处理后将应答数据包回发给LVS。
  4. LVS收到应答数据包,将数据包中的源地址和源端口号改写成LVS的外网IP地址和外网端口号,最后将数据包发送给外部的请求方。

2. VS-DR

DR是”Direct Routing”的意思,即直接路由。

在VS-DR模式中,LVS和真实服务器共享一个虚拟IP地址,即LVS的公网IP地址。当LVS收到一个请求时,会查询路由表找到一台真实服务器,将数据帧的MAC地址改为该真实服务器的MAC地址,然后将数据包转发到该真实服务器,并将这个连接加入内部一个哈希表中,之后这个连接的其他数据包也会被修改后转发到对应的真实服务器。真实服务器处理完后,直接将应答数据包通过Internet发送给外部请求方。

需要注意的是,VS-DR模式要求LVS和所有真实服务器必须处于一个相连接的物理网段中。这是因为DR模式下LVS只会修改数据帧的MAC地址为真实服务器的MAC地址,这个MAC地址这是通过ARP协议获得的,ARP协议通过IP地址获取MAC地址。

VS-DR的工作示意图(图片来自http://www.linuxvirtualserver.org/):

LVS_4

下面是LVS-DR模式下数据帧中MAC地址的修改过程(图片来自http://www.linuxvirtualserver.org/):

LVS_5

3. VS-TUN

VS-TUN模式使用了IP隧道技术。IP隧道技术能够将一个IP数据包包装在一个新的IP数据包中,然后转发到另一个IP地址。

在VS-TUN模式中,真实服务器都有它们自己的配置了虚拟IP地址并绑定了本地socket的non-arp网络设备,当请求被转发到真实服务器的虚拟IP地址上时,它们会在本地处理这个请求。

当LVS收到一个请求时,会查询路由表找到一台真实服务器,然后使用IP隧道技术将数据包发送给真实服务器,并将这个连接加入内部一个哈希表中,之后这个连接的其他数据包也会被通过IP隧道技术转发到对应的真实服务器,真实服务器收到数据包后需要解封数据包,处理后直接发送给外部请求方。

VS-TUN的工作示意图(图片来自http://www.linuxvirtualserver.org/):

LVS_6