HBase 可以根据集群负载以region为单位进行rebalance。在HMaster中,后台会起一个线程定期检查是否需要进行rebalance,线 程叫做BalancerChore。线程每隔 hbase.balancer.period会定期执行 master.balance()函数,配置项默认300000毫秒,5分钟。
hbase.balancer.max.balancing如果没有配置,则使用 hbase.balancer.period配置项的值。
hbase几个关键名词解释:
名称 | 解释 |
Master | 负责RegionServer的负载均衡 |
负责RegionServer的故障转移 | |
负责维护Table和Region的元信息,不存储表数据 | |
RegionServer | 负责管理Region,实际存储数据的地方 |
负责接收客户端对Region(数据)的读写请求 | |
负责Region拆分及Region合并 | |
Zookeeper | 保证集群有且仅有一个Master |
监控RegsionServer的状态并实时通知Master | |
存储Regsion的寻址入口 | |
存储.META.表的位置、状态信息 | |
Table | 类似于关系型数据库中的表,用于存储一系列逻辑相关的数据。 |
Region | 将Table基于RowKey区间进行水平拆分,每部分即为一个Region,类似于关系型数据库中的分表。Region是表可用性及分布性的基本单位。 |
如果发生以下情况则不会触发负载均衡操作:
- 负载均衡自动操作 balance_switch关闭,即:balance_switch false;
- HBase Master节点正在初始化操作;
- HBase集群中正在执行RIT,即Region正在迁移中;
- HBase集群正在处理离线的RegionServer。
如果在某些特定环境下你不想让region数量均衡,但又需要RegionServer运行着,那么这个笨办法也是可以试一下的。
关闭一个节点服务。
$ ./hbase shell
hbase(main):002:0> balance_switch true
hbase(main):003:0> balancer
等分配结束,balance_switch false
启动一个节点,就成这样了。
不知道这个适用于那个场景,但是挺好玩~