您好,登錄后才能下訂單哦!
下文給大家帶來HBase負載均衡算法概述及詳解,希望能夠給大家在實際運用中帶來一定的幫助,負載均衡涉及的東西比較多,理論也不多,網上有很多書籍,今天我們就用億速云在行業內累計的經驗來做一個解答。
1.概要
0.92版本后HBase的均衡算法可以通過實現了LoadBalancer接口的hbase.master.loadbalancer.class來自定義。
2.負載均衡實行條件。
負載均衡以特定時間間隔(hbase.balancer.period 默認是5分鐘)執行。
當遇到如下場景時候不進行負載均衡:
1.均衡負載開關balanceSwitch關閉。
2.HMase為完成初始化。
3.RIT中有未處理完的regions。
4.有正在處理的DeadRegionserver.
3.默認負載均衡的具體算法
3.1 將所有RegionServer以負載進行排序,如果負載相同則按照serverName進行排序。
例子:
RS1 11 | RS6 2 | |
RS2 10 | RS5 5 | |
RS3 9 | 排序為: | RS3 9 |
RS4 10 | RS2 10 | |
RS5 5 | RS4 10 | |
RS6 2 | RS1 11 |
3.2 通過如下算法計算當前是否需要進行均衡:
// Check if we even need to do any load balancing float average = (float)numRegions / numServers; // for logging // HBASE-3681 check sloppiness first int floor = (int) Math.floor(average * (1 - slop)); int ceiling = (int) Math.ceil(average * (1 + slop)); if (serversByLoad.lastKey().getLoad() <= ceiling && serversByLoad.firstKey().getLoad() >= floor) { // Skipped because no server outside (min,max) range LOG.info("Skipping load balancing because balanced cluster; " + "servers=" + numServers + " " + "regions=" + numRegions + " average=" + average + " " + "mostloaded=" + serversByLoad.lastKey().getLoad() + " leastloaded=" + serversByLoad.firstKey().getLoad()); return null; }
根據如上算法在本例中:
float average = 47/ 6 = 7.8;
int
floor = (
int
) Math.floor(average * (
1
- slop)) = 6
int
ceiling = (
int
) Math.ceil(average * (
1
+ slop)) = 9
其中
為hbase.regions.slop 默認為0.2slop
可以看出RS6 上只有2個region <
所以本例需要進行負載均衡。floor
3.3 計算 min 和 max 得到最小負載和最大負載
int min = numRegions / numServers; int max = numRegions % numServers == 0 ? min : min + 1;
本例中:
min = 7
max = 8
3.4 將大于max負載的RS降低到max負載,移除的Region放入regionsToMove隊列待分配。
RS6 2 | RS6 2 | |
RS5 5 | RS5 5 | |
RS3 9 | max:8 | RS3 8 |
RS2 10 | RS2 8 | |
RS4 10 | RS4 8 | |
RS1 11 | RS1 8 | |
regionsToMove | ||
RS3 1 | ||
RS2 2 | ||
RS4 2 | ||
RS1 3 |
3.5 將小于min負載的RS從regionsToMove隊列中取出全部
加到min負載
RS6 2 | RS6 7 | |
RS5 5 | RS5 7 | |
RS3 8 | min:7 | RS3 8 |
RS2 8 | RS2 8 | |
RS4 8 | RS4 8 | |
RS1 8 | RS1 8 | |
regionsToMove | ||
RS1 1 |
3.6 這里分為兩種情況:
a.當
還有剩余region的時候則將遍歷min負載的RS起始達到max。所有< min負載RS都升到min負載時regionsToMove隊列
b.當
,在進行region分配,使得<min的RS達到min負載。還有RS負載 < min的時候從max負載RS中取得需要的region數(這些region正好能夠使未min的RS負載到min)放入regionsToMove隊列
本例中符合a這種場景,所以直接將剩下的1個region分配到min負載熱RS上:
RS6 7 | RS6 8 | |
RS5 7 | RS5 7 | |
RS3 8 | 分配 | RS3 8 |
RS2 8 | RS2 8 | |
RS4 8 | RS4 8 | |
RS1 8 | RS1 8 | |
regionsToMove | ||
3.7 由此負載均衡算法結束,他將產生一個region分配列表交由AssignmentManager類去進行region的
unasign和asign操作。
需要注意的時候在進行負載均衡操作不會對元數據表的region進行移動。
看了以上關于HBase負載均衡算法概述及詳解,如果大家還有什么地方需要了解的可以在億速云行業資訊里查找自己感興趣的或者找我們的專業技術工程師解答的,億速云技術工程師在行業內擁有十幾年的經驗了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。