第一卷 關於雙連接的負載均衡
包級別的 TCP/UDP 負載均衡和NAT(Network Address Translate)不能並存。
這是什麼意思呢?簡單來說,如果你有動態IP的連接,一個使用私有IP地址的局域網,通過NAT(Network Address Translate)上網, 現在覺得速度不夠,想再加一條使到某一Internet主機的速度加倍(現在中國大陸的典型情況),對不起,你就死了這條心吧,這是不可能的。
這裏所說的連接包括 Ethernet,PPPoE,PPPoA,PPP,以及SLIP等等。並且,這是TCP/UDP 協議的內在機製造成的,和軟/硬件無關。任何架構在 TCP/UDP 之上的應用,不論硬件還是軟件,皆不能繞過此限製。
注意,如果你的局域網使用公用IP(public IP)而不需要NAT,則不在此列。
如果你想知道原因或者質疑我的結論:),請繼續往下讀。
本文假設
①、你已經閱讀過 Linux Advanced Routing & Traffic Control HOWTO,特別是 4.2 小節的 Routing for multiple uplinks/providers,4.2.1小節Split access 和4.2.2小章 Load balancing。此文(以下按慣例簡稱lartc)非常清楚的說明了連接級別的TCP/UDP 負載均衡。
上麵這幅示意圖即摘自 lartc,官方站點是 http://lartc.org/。為行文方便,列在這裏並做輕微改動,特此說明。
②、為便於理解,以下以常見的Linux 下 ADSL PPPoE 撥號上網為例,但如前所述,討論適用於其它各種情況。用數對(IP address, port)來表示一個連結的端點。假定
Host IP Port
-------------------------------------
local host 1 192.168.0.15000
Linux routeif1 100.0.0.16000
Linux routeif2 150.0.0.17000
remote host1 200.0.0.180
-------------------------------------
那麼連接級別和包級別的負載均衡究竟有何不同?
1、連結級別的負載均衡
Linux 2.4內核支持連結級別的負載均衡。為理解這個問題,這裏首先簡述 Linux 的靜態路由機製。當一部 Linux 主機收到一個需要轉發的IP包時,它首先檢查Cache中是否有相關的路由信息:如果有的話,會直接使用;否則再查找路由表。Cache中一段時間不使用的路由信息會被丟棄。如果設置了 MultiPath 路由,則選擇哪一個路由是隨機的,但隨後的IP包都會走這條路由,直到Cache中的路由信息被丟棄。
比如,當LAN上的主機 local host 1 向 remote host 1 發起一次連結的時候,Linux router 在Cache中找不到有關remote host 1 的路由信息,因此轉去查找路由表,當它發現有一個 MultiPath 路由的時候,會隨機選擇一個路由,比方說 if1,並把此路由加入Cache;下一個從 local hsot 1到 remote host 1 的 IP 包到達時,Linux router 直接在Cache 中找到路由信息然後直接轉發,也就是說,所有目的地為 remote host 1 的 IP 包都會經由 if1 轉發直到 Cache 中相關路由信息失效並被丟棄為止而不會經過if2,即使if2完全空閑也是如此。
因此,和 remote host 1 之間的通信並不會從附加的第二條連接中獲益。其實際效果就是你用 Realplay 看網絡電影時效果沒有改善,當然心理作用除外:)