LVS工作原理
本文主要讲述一下LVS转发数据的原理。
1. NAT模式
1.1 NAT模式工作原理
1) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING
链。此时报文的源IP为CIP
,目标IP为VIP
;
2) PREROUTING
检查发现数据包的目标IP是本机,将数据包发送至INPUT
链;
3) IPVS
比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发送至POSTROUTING
链。此时报文的源IP为CIP
,目标IP为RIP
;
4) POSTROUTING
链通过选路,将数据包发送给Real Server;
5) Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server,此时报文的源IP为RIP
,目标IP为CIP
;
6) Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应客户端。此时报文的源IP为VIP
,目标IP为CIP
。
1.2 NAT特性
-
RIP 最好是内网IP
-
RS的网关必须指向DIP
-
DIP和RIP必须在同一个网段内
-
请求和回应的报文必须经过Director,因此Director容易成为瓶颈
-
NAT支持端口转发
2. DR模式
2.1 DR模式工作原理
1) 首先用户用CIP
请求VIP
2) 根据上图可以看到,不管是Director Server还是Real Server上都需要配置相同的VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求的数据包源地址为CIP
目标地址为VIP
,此时路由器会发广播问谁是VIP
,因为我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发送给谁,这样一来我们的集群系统是不是没意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Server。
3) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING
链。此时报文的源IP为CIP
,目标IP为VIP
4) PREROUTING
检查发现数据包的目标IP是本机,将数据包发送至INPUT
链
5) IPVS
比对数据包请求的服务是否为集群服务,若是,则将请求报文中的源MAC
地址修改为DIP的MAC
地址,将目标MAC地址修改为RIP的MAC
地址,然后将数据包发至POSTROUTING
链。此时的源IP
和目标IP
均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
6) 由于DS和RS在同一网络中,所以是通过二层来传输。POSTROUTING
链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server
7) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成后,将响应报文通过lo
接口传送给eth0
网卡然后向外发出。此时的源IP地址为VIP
,目标IP为CIP
8) 响应报文最终送达至客户端
2.2 配置DR的三种方式
1) 方式1
在路由器上显式说明VIP对应的地址一定是Director
上的MAC,只要绑定,以后再跟VIP通信也不用再请求了,这个绑定是静态的,所以它也不会失效,也不会再次发起请求,但是有个前提,我们的路由器设备必须有操作权限能够绑定MAC
地址,万一这个路由器是运营商操作的,我们没法操作怎么办? 第一种方式固然很简便,但未必可行。
2) 方式2
在有些主机(例如: RedHat)上,它们引进了一种程序arptables
,它有点类似于iptables
,它肯定是基于arp或者MAC
做访问控制的,很显然我们只需要在每一个real server上定义arptables
规则,如果用户arp广播请求的目标地址是本机的vip则不予响应,或者响应的报文不让出去,很显然网关(gateway)是接收不到的,也就只有director的响应报文才能到达gateway。
3) 方式3
在相对较新的版本中新增了两个内核参数,第一个是arp_ignore
定义接收到ARP请求时的相应级别; 第二个是arp_announce
定义自己的地址向外通告时的通告级别。
arp_ignore: 定义接收到ARP请求时的相应级别 0 -- 只要本地配置有相应地址,就给予响应 1 -- 仅回应目标IP地址为接收网卡本地地址的ARP请求 2 -- 只响应目标IP地址为接收网卡本地地址的ARP请求,并且arp请求的源IP必须和接收网卡同网段 4~7 -- 保留未使用 8 -- 不回应所有ARP请求 arp_announce: 定义将自己的地址向外通告时的通告级别 0 -- 将本地任何接口上的任何地址向外通告 1 -- 试图仅向目标网络通告与其网络匹配的地址 2 -- 仅向与本地接口上地址匹配的网络进行通告
2.3 DR模式特性
-
保证前端路由将目标地址为VIP的报文统统发给Director Server,而不是RS
-
Director和RS的VIP为同一个VIP
-
RS可以使用私有地址,也可以是公网地址。如果使用公网地址,此时可以通过互联网对RIP进行直接访问
-
RS跟Director Server必须在同一个物理网络中
-
所有的请求报文经过Director Server,但响应报文必须不能经过Director Server
-
不支持地址转换,也不支持端口映射
-
RS可以是大多数常见的操作系统
-
RS的网关决不允许指向DIP(因为我们不允许响应经过Director)
-
RS上的lo接口绑定VIP地址
-
DR模式是市面上用的最广的
3. TUN模式
3.1 TUN模式工作原理
1) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING
链。此时报文的源IP为CIP,目标IP为VIP。
2) PREROUTING
检查发现数据包的目标IP是本机,将数据包发送至INPUT
链
3) IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文。封装的源IP为DIP,目标IP为RIP。然后发送至POSTROUTING
链。此时源IP为DIP,目标IP为RIP。
4) POSTROUTING
链根据最新封装的IP报文,将数据包发至RS(因为在外层多封装了一层IP首部,所以可以理解为此时通过隧道传输)。此时源IP为DIP,目标IP为RIP。
5) RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo
接口VIP,那么此时RS开始处理此请求,处理完成后,通过lo
接口发送给eth0
接口,然后向外传递。此时的源IP地址为VIP,目标IP地址为CIP
6) 响应报文最终送达至客户端
3.2 Tunnel模式特性
-
RIP、VIP、DIP全是公网地址
-
RS的网关不会也不可能指向DIP
-
所有的请求报文经过Director Server,但响应报文必须不能经过Director Server
-
不支持端口映射
-
RS的系统必须支持IP隧道
[参看]