在2011年初我學習交換機鏈路聚合技術的時候,心中一直有一個疑問:算法
交換機收到一個報文,到達聚合口的時候,是怎麼選擇成員口出去的呢?負載均衡
是隨機選的嗎?仍是按成員編號從小到大或從大到小輪循?若是選擇源IP算法,是怎麼實現不一樣源IP就走不一樣的端口的呢?那時網上也找不到介紹,這個疑問,直到2011年末作測試工程師時,才獲得研發兄弟的回答,一直記在內心,總想找個時間發佈到網上,讓更多人知道,原來負載均衡算法實際上是這麼的簡單!ide
鏈路聚合的主要做用是增長帶寬,增長可靠性,防止二層環路。在這兒,我不討論這技術爲什麼而來與做何而用了,只說說報文到達聚合口時,是怎麼選擇出端口的。學習
2012年末測試一個交換機項目時,和另外一家公司(是大企業)是競爭關係,我負責測試本公司交換機(中小企業),名稱就都不說了。測試
在進行入網測試時,工信部測試人員引入真實流量,分光成兩份,分別進入兩家廠商的交換機,交換機上配置一樣的負載分擔算法(如:都是SIP hash),一樣的聚合組成員數(如:32個)。測試結果是:真實流10G兩分鐘,兩家廠商各成員接口輸出報文如出一轍(判斷出兩家廠商負載均衡算法如出一轍)。由此我才深深感嘆,原來牛逼的廠商用的算法也不過如此而已(之前一直以爲大企業確定很牛逼,事實最後的測試結果報告還不如咱們)。優化
在交換機內部,每建立一個聚合組時,底層同時建立對應該聚合組的一個hash表,該表存在於交換芯片上,hash表內容以下(簡化):spa
左列index爲芯片的硬性支持,如今通常是256,512,1024,更高的未見過。index數量越高,負載分擔越均衡。命令行
這兒以3個成員爲例:線程
index設計 |
interface |
0 |
eth0_0 |
1 |
eth0_1 |
2 |
eth0_2 |
3 |
eth0_0 |
4 |
eth0_1 |
5 |
eth0_2 |
. |
. |
. |
. |
. |
. |
1022 |
eth0_0 |
1023 |
eth0_1 |
交換機裏有專門的線程,實時檢測聚合組有效成員,一旦成員狀態發生變化,當即刷新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值
看完以後,是否發現,原來負載均衡算法是如此的容易!
不少看起來高端的技術,不是作不到,而是想不到。