天天看點

交換機鍊路聚合負載均衡算法原理 推薦

在2011年初我學習交換機鍊路聚合技術的時候,心中一直有一個疑問:

交換機收到一個封包,到達聚合口的時候,是怎麼選擇成員口出去的呢?

是随機選的嗎?還是按成員編号從小到大或從大到小輪循?如果選擇源IP算法,是怎麼實作不同源IP就走不同的端口的呢?那時網上也找不到介紹,這個疑問,直到2011年底做測試工程師時,才得到研發兄弟的回答,一直記在心裡,總想找個時間釋出到網上,讓更多人知道,原來負載均衡算法其實是這麼的簡單!

鍊路聚合的主要作用是增加帶寬,增加可靠性,防止二層環路。在這兒,我不讨論這技術為何而來與作何而用了,隻說說封包到達聚合口時,是怎麼選擇出端口的。

2012年底測試一個交換機項目時,和另一家公司(是大企業)是競争關系,我負責測試本公司交換機(中小企業),名稱就都不說了。

在進行入網測試時,工信部測試人員引入真實流量,分光成兩份,分别進入兩家廠商的交換機,交換機上配置同樣的負載分擔算法(如:都是SIP hash),同樣的聚合組成員數(如:32個)。測試結果是:真實流10G兩分鐘,兩家廠商各成員接口輸出封包一模一樣(判斷出兩家廠商負載均衡算法一模一樣)。由此我才深深感歎,原來牛逼的廠商用的算法也不過如此而已(以前一直覺得大企業肯定很牛逼,事實最後的測試結果報告還不如我們)。

在交換機内部,每建立一個聚合組時,底層同時建立對應該聚合組的一個hash表,該表存在于交換晶片上,hash表内容如下(簡化):

左列index為晶片的硬性支援,現在一般是256,512,1024,更高的未見過。index數量越高,負載分擔越均衡。

這兒以3個成員為例:

index

interface

eth0_0

1

eth0_1

2

eth0_2

3

4

 eth0_1

5

.

1022

1023

交換機裡有專門的線程,實時檢測聚合組有效成員,一旦成員狀态發生變化,立即重新整理hash表項。

順便談談重新整理HASH表這個技術。

工程師up/down成員口,底層就必須實時的重新整理成員(這兒比較考驗廠商技術),重新整理速度越慢,成員狀态變動時丢包越多。技術最強的如cisco,可以做到up/down成員口時,不丢包。而我公司最初會丢一秒鐘的包(研發設計思路問題)。後來優化後才達到up/down成員端口,有0.0幾秒的丢包,無法做到不丢包。

up/down分析:當工程師在指令行up/down聚合組成員時,底層表項會有那麼一丁點兒的響應時間重新整理表項,這丁點兒時間,已經down掉的接口還存在hash表裡,而封包是一直都有的,正好被hash到這個無效的出端口的封包都會被丢棄!)

雖然底層有了一張HASH表,那麼到底是怎麼利用這張表的呢?

1)工程師設定端口成員與HASH算法,如SIP、DIP、SIP+DIP、SIP+DIP+SP+DP等。

2)交換機根據成員生成HASH表,根據算法提取封包中相應内容。

3)使用特定HASH值的計算方法,把提取的内容計算出一個10bits的值。

4)找到底層HASH表項中該值對應的出端口。

5)把封包從這個出端口轉發出去。

 xor是異或運算,即兩個值不相同,則異或結果為真;反之,為假。不同為1,相同為0。

1、SIP(源IP)

 1)SIP xor 0 得到一個32bit的值.

 2)然後作高16bits和低16bits的xor.

 3)再用16bits的15-12bits與11-8bitsxor,将得到的4bits替換到11-8bits,得到12bits右移2位得到10bits的hash值

注:10bits的值必然是0-1023裡的一個數,該index對應的interface是多少,就從該接口轉發出去。(相同的IP必然是相同的hash值)

2、DIP(目的IP)

同SIP

3、SIP+DIP(源IP+目的IP)

1)DIP xor SIP得到一個32bits的值。

2)然後作高16bits和低16bits的xor。

3)再用16bits的15-12bits與11-8bitsxor,将得到的4bits替換到11-8bits,得到12bits右移2位得到10bits的hash值。

4、SIP+DIP+SP+DP(源位址 + 目的位址 + 源端口 + 目的端口)

1)SIP xor DIP得到32bit的值value1

2)hashtemp1的低16bits xor SP 得到32bit的hashtemp2

3)hashtemp2 的低 16bit xor DP 得到 32bit 的hashtemp3

4)然後作高16bits和低16bits的xor

5)再用16bits的15~12bits和11~8bits xor,将得到的4bits替換到11~8bits,得到12bits右移2位得到10bits的hash值

看完之後,是否發現,原來負載均衡算法是如此的容易!

很多看起來高端的技術,不是做不到,而是想不到。

繼續閱讀