交換機鏈路聚合負載均衡算法原理

初衷:

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

交換機收到一個報文,到達聚合口的時候,是怎麼選擇成員口出去的呢?負載均衡

是隨機選的嗎?仍是按成員編號從小到大或從大到小輪循?若是選擇源IP算法,是怎麼實現不一樣源IP就走不一樣的端口的呢?那時網上也找不到介紹,這個疑問,直到2011年末作測試工程師時,才獲得研發兄弟的回答,一直記在內心,總想找個時間發佈到網上,讓更多人知道,原來負載均衡算法實際上是這麼的簡單!ide

鏈路聚合的主要做用是增長帶寬,增長可靠性,防止二層環路。在這兒,我不討論這技術爲什麼而來與做何而用了,只說說報文到達聚合口時,是怎麼選擇出端口的。學習


感嘆:

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

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


HASH表介紹:

在交換機內部,每建立一個聚合組時,底層同時建立對應該聚合組的一個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表項。

順便談談刷新HASH表這個技術。

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

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


交換機負載均衡轉發原理:

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

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

2)交換機根據成員生成HASH表,根據算法提取報文中相應內容。

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

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

5)把報文從這個出端口轉發出去。



HASH值的計算方法:

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

1SIP(源IP

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

 2)而後做高16bits和低16bitsxor.

 3)再用16bits15-12bits11-8bitsxor,將獲得的4bits替換到11-8bits,獲得12bits右移2位獲得10bitshash

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


2DIP(目的IP

SIP


3SIP+DIP(源IP+目的IP

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

2)而後做高16bits和低16bitsxor

3)再用16bits15-12bits11-8bitsxor,將獲得的4bits替換到11-8bits,獲得12bits右移2位獲得10bitshash值。



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

1SIP xor DIP獲得32bit的值value1

2hashtemp1的低16bits xor SP 獲得32bithashtemp2

3hashtemp2 的低 16bit xor DP 獲得 32bit hashtemp3

4)而後做高16bits和低16bitsxor

5)再用16bits1512bits118bits xor,將獲得的4bits替換到118bits,獲得12bits右移2位獲得10bitshash


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


不少看起來高端的技術,不是作不到,而是想不到。

相關文章
相關標籤/搜索