一個巧妙的負載均衡算法-翹動你的大腦


  有一個願分享的領導還是很棒的。

  現在的負載均衡技術,可以說是滿大街都是,但是我們基本都停留在了使用的階段上,並沒有真正深入去了解其核心。如果真的出現了問題,可能就很難知道是什么原因導致了,只能去google,百度了。 因此,了解一些核心的東西,還是不錯的。

  負載均衡大概流程就是,隨時收集各服務器信息或者各服務器主動上報信息,由配置主心進行保存,計算出權重,然后根據相應算法進行服務機器選擇。(當然了,這不是本文的重點,我也說得不一定對)

  我要展示的是,一個根據權重進行機器選擇的一個巧妙算法,如下:

int chooseOneRoute ( LB_SvrInfo * & pSvr )
{
    double dblTotalWeight = 0.0;
    int i = 0;
    time_t curTime = time(NULL);
    //權重的計算方法是Late方法
    if ( curTime - calWeightTime >= CAL_WEIGHT_TIME_INTERVAL )
    {
        calculateWeight();
    }
    //先把各服務器權重加起來
    for ( i = 0; i < MAX_SERVER_NUM; i++ )
    {
        if ( !oServerInfo[i].isOkForRoute() ) continue;
        dblTotalWeight += oServerInfo[i].getWeight();
    }
    dblTotalWeight *= rand() / ( RAND_MAX + 1.0 );
    //做減法
    for ( i = 0; i < MAX_SERVER_NUM; i++ )
    {
        if ( !oServerInfo[i].isOkForRoute() ) continue;
        dblTotalWeight -= oServerInfo[i].getWeight();
    //找到對應服務器
        if ( dblTotalWeight < 0 ) break;
    }
    pSvr = &( oServerInfo[i] );
    return 0;
}
  分步解釋就是:
    1. 先計算得到各機器的權重值,保存起來;
    2. 按順序將各機器權重相加,相加之后就相當於各機器在總權重上占了各相應的一段比例;
    3. 取隨機數,得到一個0~1的隨機值,並乘以總權重,作為選中機器的標志;
    4. 再按順序減去各機器的權重,當減到選擇機器的權重范圍時,就得到了機器號,從而選定該機器。
  算法示意圖如下:

  

  服務器權重越高,在線段上占的長度越長,被隨機數選中的概率也越大。

  剛開始的時候,我以為是哪個數學家搞出來的公式得到的呢,結果原理卻出奇的簡單,所以好的東西不一定是復雜的,或者說看起來牛逼的東西,不一定就很復雜,但是肯定是大多數人意想不到的。

    漲姿勢了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM