下文给大家带来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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。