負載均衡小結

最近被負載均衡這個問題搞得很難受,我遇到的是最簡單的均衡問題,并不是服務器集群,多core等高級負載均衡的問題。

我們的問題簡單描述就是:通過網(wǎng)卡接收數(shù)據(jù)包,然后把數(shù)據(jù)包放入N個隊列。要求:1.每個隊列里數(shù)據(jù)包的數(shù)量差不多相等。2.同一會話的包放入同一個隊列。

下面對考慮過的一些算法作一個總結。

一.輪回調(diào)度 顧名思義就是把數(shù)據(jù)包一個一個地放入N個隊列中。第1個包放入0號隊列,第2個包放入1號隊列,放完N個隊列,再從0號隊列開始放。

二.取余 解出數(shù)據(jù)包的sip和dip.隊列索引index=(sip+dip)%N.很明了,沒什么要說的。

三.異或取余 解聘數(shù)據(jù)包的sip和dip.隊列索引index=((sip+dip)^sip^dip)%N.據(jù)說分散程度會比方法二要好。但找不到數(shù)學依據(jù)。

四.依照RSS. RSS是一種網(wǎng)卡多隊列技術,要完整介紹它,需要寫一篇論文。這里用到的是symmetric rss即對稱RSS。網(wǎng)卡內(nèi)部大致是這樣做的:利用數(shù)據(jù)包的二元/四元/五元組和一個40字節(jié)的固定值,通過一種hash算法,算出一個hash值。然后取這個hash值的低7位,這個低7位與隊列索引號形成一張RETA表,通過這張表,只要知道hash值的低7位就能知道數(shù)據(jù)包要放入哪個隊列。至于為什么是低7位呢?我猜測這是一個適中的值,如果取8位或9位,表的數(shù)據(jù)量就會比較大,查詢相對耗時,如果取少了,隨機程度就得不到保證。根據(jù)上面的知識,就可以得出隊列索引 index=hash_value%N.這里對N取余相對于維護了一張

(0,1,2....N-1,0,1,2...N-1,0,1,2....N-1)的表。如果要修改表的排列,可自己新建一張自定義的表.

五.仿一致性hash 至于為什么有一個“仿”字,那是因為我們這里的應用場景與其真正的定義不一樣,只是運用其思想。一致性hash沒有圖我是表達不清楚了,可自行百度。反正對于我這里的場景,相當于自定義了一張第四步中的RETA表,定義格式如下

default_tbl[128]=

{0,0,0,...

1,1,1,...

2,2,2,...

...,...

N-1,N-1,N-1...}

與第四步的表相比,只不過是形式不同。

所以這種方法的做法就是通過sip和dip求出hash值,通過hash值的低7位,找到表中對應的隊列序號,把數(shù)據(jù)包放入該隊列。

對于以上幾種算法,第一種雖然說最均勻,但不行,因為確保不了同一會話的數(shù)據(jù)包在同一隊列。

第三種的散列度比第二種要好。

第四種和第五種基本差不多,就是RETA表中的對應關系不一樣,如果是確定的流量,通過修改那張表,一定能做到負載均衡的。就算是未知的流量,也能做到大致均勻,但要是同一會話的量太大了,愛因斯坦也沒辦法,現(xiàn)在遇到的就是這種情況,好煩。

晚安。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 30,235評論 8 265
  • 序 當你我隔著無盡的歷史相遇,什么言辭都顯得蒼白無力。 “你將必死?!?“沒有人可以不死。我終將死去?!?“你會愛...
    檸檬蜂蜜要加冰閱讀 406評論 0 2
  • 說一件大家伙兒都有的蠢事吧,肯定不止我一人發(fā)生同樣的情況。 小時候因為工作需要或者其他原因,爸爸會買手機,而且,全...
    a戶閱讀 330評論 0 0
  • 本來計劃好 將你安放于家山 綠水草草流過 算得上一種溫暖教義 舍棄生銹的牛軛 結束一次耕種 是誰把禾苗曬死了 于唇...
    海子三月歸閱讀 444評論 11 29

友情鏈接更多精彩內(nèi)容