Show Table of Contents
3.2.1. 直接路由與
3.2.2. 直接路由與
3.2.3. 直接路由與
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 請求,請進行以下步驟:
- 在每台真實伺服器上,為每個虛擬 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 節點。 - 在每台真實伺服器完成這項工作後,在每台真實伺服器上執行以下指令,以儲存 ARP 表的條目:
service arptables_jf savechkconfig --level 2345 arptables_jf onchkconfig指令會讓系統在開機時重新載入 arptables 的配置 — 在網路啟動之前。 - 使用
ip addr建立 IP 別名,在所有真實伺服器上配置虛擬 IP 位址。例如:#
ip addr add 192.168.76.24 dev eth0 - 配置 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 法,請執行以下步驟:
- 在每一台真實伺服器上,對要提供服務對象的 VIP、連接埠、以及通訊協定(TCP 或 UDP)組合上執行指令:
iptables -t nat -A PREROUTING -p <tcp|udp> -d <vip> --dport <port> -j REDIRECT這指令會讓真實伺服器處理流向 VIP 與連接埠的封包。 - 在每台真實伺服器上儲存配置:
#
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

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.