Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

3.2. 透過直接路由進行負載平衡

直接路由(direct routing)能讓真實伺服器處理封包並將封包直接路由轉送至請求的使用者,而非透過 LVS 路由器傳送向外的封包。若要進行直接路由,真實伺服器需要透過 LVS 路由器實體連接至一個網路區段,並且也要能處理和轉送向外的封包。
網路佈局
在直接路由的 Load Balancer 設定中,LVS 路由器需要接收連入的請求,並將這些請求路由到適當的真實伺服器上以供處理。接下來真實伺服器就需要「直接」將回應路由至用戶端。因此,舉例來說,如果用戶端位於網際網路上,並透過 LVS 路由器發送封包到真實伺服器,那麼真實伺服器就必須透過網際網路直接連上用戶端。這可以透過為真實伺服器配置閘道器,將封包轉送到網際網路上來達成。集區中的每台真實伺服器都可以擁有自己的閘道器(並各自連上網際網路),提供最大的吞吐量與擴充性。然而,對於典型的 Load Balancer 來說,真實伺服器僅能透過單一的閘道器(也就是單一網路連線)來通訊。
硬體
使用直接路由的 Load Balancer 系統之硬體需求跟其它用於 Load Balancer 的拓樸類似。LVS 路由器需要執行 Red Hat Enterprise Linux 來處理連入的請求、並為真實伺服器進行負載平衡,而真實伺服器就不一定要是 Linux 機器才能正常運作。LVS 路由器需要 1 或 2 張網路卡(端視有沒有備用路由器而定)。您可以在每個配置中使用兩張網路卡,明確地分開網路流量 — 連入的請求由一張網路卡處理,路由封包則交給另一張網路卡處理。
因為真實伺服器會繞過 LVS 路由器,並直接發送向外的封包給用戶端,因此需要連往網際網路的閘道器。欲求最大效能與可用性,每台真實伺服器可以連上自己的獨立閘道器,透過專屬的連線連上用戶端所屬的網路(例如網際網路或企業內部網路)。
軟體
keepalived 以外還有一些配置工作要做,尤其是透過直接路由使用 Load Balancer 時,遇到 ARP 問題的使用者。詳情請參閱〈節 3.2.1, “直接路由與 arptables_jf〉或〈節 3.2.2, “直接路由與 iptables〉。

3.2.1. 直接路由與 arptables_jf

為了要使用 arptables_jf 配置直接路由,每台真實伺服器都必須配有虛擬 IP 位址,藉以直接路由封包。真實伺服器會忽視 VIP 的 ARP 請求,同時任何可能含有 VIP 的 ARP 封包都會被修改,以包含真實伺服器的 IP 位址,而非 VIP。
應用程式使用 arptables_jf 這方法就可以綁定到真實伺服器所服務的每個獨立 VIP 或連接埠。舉例來說,arptables_jf 方法能讓 Apache HTTP Server 的多個 instance 直接綁定在系統上的多個 VIP 上執行。使用 arptables_jf 而不是 iptables 指令,還有效能上的顯著好處。
然而,使用 arptables_jf 法,VIP 就不能透過標準的 Red Hat Enterprise Linux 系統配置工具,好在系統開機時啟動。
要配置每台真實伺服器忽略每個虛擬 IP 位址的 ARP 請求,請進行以下步驟:
  1. 在每台真實伺服器上,為每個虛擬 IP 位址建立 ARP 表的條目(real_ip 是導向程式用來與真實伺服器溝通的 IP 位址;通常這是 eth0 的 IP 位址):
    arptables -A IN -d <virtual_ip> -j DROP
    arptables -A OUT -s <virtual_ip> -j mangle --mangle-ip-s <real_ip>
    這會導致真實伺服器忽略虛擬 IP 位址的所有 ARP 請求,並改變任何向外、可能包含虛擬 IP 位址(而非伺服器的真實 IP 位址)的 ARP 回應。唯一應該回應任何 VIP 的 ARP 請求之節點,是目前的 active LVS 節點。
  2. 在每台真實伺服器完成這項工作後,在每台真實伺服器上執行以下指令,以儲存 ARP 表的條目:
    service arptables_jf save
    chkconfig --level 2345 arptables_jf on
    chkconfig 指令會讓系統在開機時重新載入 arptables 的配置 — 在網路啟動之前。
  3. 使用 ip addr 建立 IP 別名,在所有真實伺服器上配置虛擬 IP 位址。例如:
    # ip addr add 192.168.76.24 dev eth0
  4. 配置 Keepalived 以進行直接路由。這能透過將 lb_kind DR 附加至 keepalived.conf 檔案。詳情請參閱〈章 4, 搭配 Keepalived 進行 Load Balancer 的初始配置〉。

3.2.2. 直接路由與 iptables

另一個解決 ARP 問題的方法,是建立 iptables 防火牆規則。要使用 iptables 配置直接路由,您必須新增規則,這規則會建立通透的代理,讓真實伺服器能為發送到這 VIP 位址的封包提供服務,即使這 VIP 位址不存在於系統上也無妨。
配置 iptables 比配置 arptables_jf 更容易。這方法也能完全避免 LVS ARP 問題,因為虛擬 IP 位址只存在於 active LVS 轉發者上。
然而,跟使用 arptables_jf 比起來,使用 iptables 會有效能上的問題,因為每個封包在轉送 / 偽冒時,都會產生負荷。
您也無法使用 iptables 來重新使用連接埠。舉例來說,要執行兩個獨立、使用 80 連接埠的 Apache HTTP Server 服務就是不可能的事情,因為兩者都必須與 INADDR_ANY 綁定,而非虛擬的 IP 位址。
要配置直接路由使用 iptables 法,請執行以下步驟:
  1. 在每一台真實伺服器上,對要提供服務對象的 VIP、連接埠、以及通訊協定(TCP 或 UDP)組合上執行指令:
    iptables -t nat -A PREROUTING -p <tcp|udp> -d <vip> --dport <port> -j REDIRECT
    這指令會讓真實伺服器處理流向 VIP 與連接埠的封包。
  2. 在每台真實伺服器上儲存配置:
    # service iptables save
    # chkconfig --level 2345 iptables on
    上述指令會讓系統在開機時重新載入 iptables 配置 — 在網路啟動之前。

3.2.3. 直接路由與 sysctl

當利用直接路由時,另一項可用來解決 ARP 限制上的方法就是透過 sysctl 介面。管理員可配置兩項 systcl 設定,以讓真實伺服器不會在 ARP 請求中宣布 VIP,並且不會回應 VIP 位址的 ARP 請求。若要啟用這項功能,請執行以下指令:

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
此外,您可新增下列幾行資訊至 /etc/sysctl.d/arp.conf 中:
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2