1.8.3.2. 直接路由
和 NAT 相比,直接路由可以提供增强的性能。直接路由允许真实服务器处理和直接发送数据包给请求用户而不是通过 LVS 路由器传送转出数据包。让 LVS 路由器只处理转入的数据包,直接路由降低了网络性能出现问题的可能性。
图 1.23. LVS Implemented with Direct Routing
在典型的直接路由 LVS 配置里,LVS 路由器通过虚拟 IP(VIP)接收转入的服务器请求并使用一个调度算法来将请求发送到真实服务器上。每个真实服务器都处理请求,并将响应直接发送给客户而不通过 LVS 路由器。直接路由提供了可伸缩性,因为可以添加真实服务器而不增加 LVS 路由器将转出数据包从真实服务器发送给客户的负担,而这在网络负载很重时可能是瓶颈。
虽然在 LVS 里使用直接路由有很多优点,但它也有缺陷。直接路由最常见的问题是和 地址解析协议(Address Resolution Protocol)(ARP)相关的。
In typical situations, a client on the Internet sends a request to an IP address. Network routers typically send requests to their destination by relating IP addresses to a machine's MAC address with ARP. ARP requests are broadcast to all connected machines on a network, and the machine with the correct IP/MAC address combination receives the packet. The IP/MAC associations are stored in an ARP cache, which is cleared periodically (usually every 15 minutes) and refilled with IP/MAC associations.
使用直接路由的 LVS 配置里和 ARP 请求相关的问题是:因为到一个 IP 地址的客户请求必须和一个 MAC 地址相关联才能被处理,LVS 路由器的虚拟 IP 地址也必须关联到一个 MAC。然而,因为 LVS 路由器和真实服务器具有相同的 VIP,ARP 请求被广播至和这个 VIP 相关联的所有节点。这会导致几个问题,如直接和某个真实服务器相关联或直接处理请求的 VIP,将完全绕过 LVS 路由器并使 LVS 配置不起作用。即使是带有强大的 CPU、可以快速响应客户请求的 LVS 路由器也未必能解决这个问题。如果 LVS 路由器负载很重,它对 ARP 的响应可能会比较空闲的真实服务器更慢,后者分配了请求客户的 ARP 缓存里的 VIP 且响应更快。
要解决这个问题,转入的请求应该只和 LVS 路由器的 VIP 相关联,这样就会正确地处理请求并将它们发送到真实服务器池。这可以用
arptables
数据包过滤工具来实现。