(點選上方公眾號,可快速關註)
來源:等你歸去來 ,
www.cnblogs.com/yougewe/p/8036273.html
現在的負載均衡技術,可以說是滿大街都是,但是我們基本都停留在了使用的階段上,並沒有真正深入去瞭解其核心。如果真的出現了問題,可能就很難知道是什麼原因導致了,只能去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;
}
分步解釋就是:
-
先計算得到各機器的權重值,儲存起來;
-
按順序將各機器權重相加,相加之後就相當於各機器在總權重上佔了各相應的一段比例;
-
取隨機數,得到一個0~1的隨機值,並乘以總權重,作為選中機器的標誌;
-
再按順序減去各機器的權重,當減到選擇機器的權重範圍時,就得到了機器號,從而選定該機器。
演演算法示意圖如下:
伺服器權重越高,線上段上佔的長度越長,被隨機數選中的機率也越大。
剛開始的時候,我以為是哪個數學家搞出來的公式得到的呢,結果原理卻出奇的簡單,所以好的東西不一定是複雜的,或者說看起來牛逼的東西,不一定就很複雜,但是肯定是大多數人意想不到的。
看完本文有收穫?請轉發分享給更多人
關註「ImportNew」,看技術乾貨