演算法描述如下:
假設有n個服務單元,(服務單元的負載是1 ~ 100,100是滿負荷運轉)。他們的負載分別是l1 l2 l3 .... ln。
第i臺服務的選中的權值 ti = 100 - li;
那麼整個掉落區間就為 mn= t1 + t2 + t3 + ... + tn;
t0 = 0;
隨進產生乙個0 ~ mn之間的數v,如果 v < t0 + t1 +...ti 並且v > t0 + t1 + ... +t(i - 1),那麼就 選取第i臺服務作為處理新業務的服務單元。
**實現:
節點負載結構:
typedef struct nodeloadinfo
;}nodeloadinfo;
選取區間結構:
typedef struct noderange
;}noderange;
負載選取器的實現介面:
class cnodeloadmanager
;
在上面的介面當中,select_node是核心函式,一下是select_node的偽**實現:
uint32_t select_node()
} if(region_ > 0) //隨機概率選取
ret = locate_server(region_);
return ret;
}
在上面的**中,實現了區間的計算。
locate_server函式查詢對應的服務節點,偽**:
uint32_t locate_server(int32_t region)
if(pos < 0)
if(node_ranges_[pos].max_value >= seed && node_ranges_[pos].min_value <= seed)
else if(node_ranges_[pos].max_value < seed)
else if(node_ranges_[pos].min_value > seed)
} while (true);
return ret;
}
完全的**在revolver的base_nodes_load.hbase_nodes_load.cpp之中。
測試結果:
我們模擬了10個節點,隨機指定10 ~ 100的負載值,然後選取1000次業務處理的節點,結果如下圖:
從結果看來是比較均衡的選取,比較理想。
一種負載均衡的演算法
今天晚上搞 走讀,一夥人在一起就一段 糾結了半天 大概是下面這個樣子 for int i 0 i urls.size i 這樣的每個使用者有乙個userid,當使用者點播節目的時候,需要去鑑權伺服器進行鑑權,一台鑒權伺服器可能無法應付過多的使用者,這裡布置了多台伺服器,伺服器的位址存放在urls這個...
伺服器負載均衡演算法
3.1 伺服器負載均衡演算法 big ip是一台對流量和內容進行管理分配的裝置。它提供10種靈活的演算法將資料流有效地 到它所連線的伺服器群。而面對使用者,只是一台虛擬伺服器。使用者此時只須記住一台伺服器,即虛擬伺服器。但他們的資料流卻被big ip靈活地均衡到所有的伺服器。這10種演算法包括 輪詢...
負載均衡伺服器採用的八種排程演算法
針對各種性質的網路服務和實際伺服器配置,負載均衡伺服器負載排程器採用了如下八種負載排程演算法 輪叫 round robin 負載均衡伺服器通過 輪叫 排程演算法將外部請求按順序輪流分配到集群中的實際伺服器上,它均等地對待每一台伺服器,而不管伺服器上實際的連線數和系統負載。加權輪叫 weighted ...