來源:互聯網
上載者:User
關鍵字
Linux
負載均衡
流量控制
多網卡
高級路由
有多種手段實現這個功能。 最簡單、最直接的方法之一就是「TEQL」——真(或「普通的」)鏈路均衡。 就象用佇列實現的大多數事情一樣,HTTP://www.aliyun.com/zixun/aggregation/13996.html">負載均衡也需要雙向實現。 鏈路的兩端都要參與,才有完整的效果。
想像下列情況:
A和B是路由器,我們當然假定它們全是Linux機器。 如果從網路1發往網路2的流量需要A路由器同時使用兩條鏈路發給B路由器。 B路由器需要進行配置以便適應這種情況。 反向傳輸時也一樣,當資料包從網路2發往網路1時,B路由器同時使用eth1和eth2。
分配的功能是用「TEQL」設備實現的,象這樣(沒有比這更簡單的了):
# tc qdisc add dev eth1 root teql0
# tc qdisc add dev eth2 root teql0
# ip link set dev teql0 up
別忘了「ip link set up」命令!
這在兩台機器上都要做。 teql0設備基本上是在eth1和eth2之間進行輪轉發幀。 用源也不會有資料從teql設備上進來,只是出現在原來的eth1和eth2上。
我們現在有了網路設備,還需要有合適的路由。 方法之一就是給兩個鏈路分配一個/31的網路,teql0也一樣:
在A路由器上:
# ip addr add dev eth1 10.0.0.0/31
# ip addr add dev eth2 10.0.0.2/31
# ip addr add dev teql0 10.0.0.4/31
在B路由器上:
# ip addr add dev eth1 10.0.0.1/31
# ip addr add dev eth2 10.0.0.3/31
# ip addr add dev teql0 10.0.0.5/31
A路由器現在應該能夠通過2個真實鏈路和一個均衡網卡ping通10.0.0.1、10.0.0.3和10.0.0.5。 B路由器應該能夠ping通10.0.0.0、10.0.0.2和10.0.0.4。
如果成功的話,A路由器應該把10.0.0.5作為到達網路2的路由,B路由器應該把10.0.0.4作為去往網路1的路由。 在網路1是你家裡的網路,而網路2是Internet這種特定場合下,A路由器的缺省閘道應該設為10.0.0.5。
告誡
事情永遠不會是表面看上去那樣簡單。 A路由器和B路由器上的eth1和eth2需要關閉「返回路徑過濾」,否則它們會丟棄那些返回位址不同于其源位址的資料包:
# echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
# echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
包的亂序也是一個大問題。 比如,有6個數據包需要從A發到B,eth1可能分到第1、3、5個包,而eth2分到第2、4、6個。 在理想情況下,B路由器會按順序收到第1、2、3、4、5、6號包。 但實際上B路由器的內核很可能按照類似2、1、4、3、6、5這樣的隨機順序收到包。 這個問題會把TCP/IP搞糊塗。 雖然在鏈路上承載不同的TCP/IP會話並沒有問題,但你無法通過捆綁多個鏈路來增加一個ftp檔的下載速度,除非兩端的作業系統都是Linux,因為Linux的TCP/IP協定棧不那麼容易被這種簡單的亂序問題所蒙蔽。
當然,對於大多數應用系統來說,鏈路的負載均衡是一個好主意。
其它可能性
William Stearns已經利用高級隧道來達到捆綁多重Internet連接的效果。 可以在他的隧道網頁找到。