region move&region spilt&region merge

region move

在生产上 某个rs节点有很多大的regions, 且读写请求比较繁忙,那么其他rs节点很空闲,导致请求不均匀。手动move region到负载低的rs节点上,让集群的资源充分利用。

move是region迁移,是一个轻量级的操作!因为hbase的数据是在hdfs上,不需要独立管理数据,因此region在迁移过程 ,不需要实际迁移数据,只是把读写的服务迁移。

move 'e17b39ca80fec455b6a3d4d605059a3f', 'ruozedata001,60020,1590821031895'

region从源的rs下线为unassign,region到目标的rs上线为assign

region spilt

https://blog.cloudera.com/apache-hbase-region-splitting-and-merging/

CDH:

hbase.regionserver.region.split.policy: ConstantSizeRegionSplitPolicy

待切分的region的所属表在当前的rs节点上的region个数有关系。如果region个数=1,切分的阈值是flush size * 2,否则max region file size。这种切分策略对于大集群的大表 、小表会比IncreasingToUpperBoundRegionSplitPolicy更加的友好,小表不会再产生大量的小的region,而是适当的。

region in transition: rit

  1. rs更改zk节点的/rit的region的状态为splitting
  2. master通过watch去ls /hbase/region-in-transition检测到region的状态改变,并修改内存
    中的region的状态,这时候master界面rit模块可以看到region执行split信息。
  3. 在父级的目录创建子级目录.split
  4. 关闭父级region,触发flush操作,将写入的region的数据全部持久化到磁盘。在这期间客户端请求会抛异常: NotServingRegionException
  5. 在split文件夹下新建2个子文件夹,A B
    在文件夹里生成 reference文件,分别指向父region的中对应的文件。
    /a/.split/A/reference_files
    /a/.split/B/reference_files
  6. 父region分裂2个子的region,将A B拷贝到hbase根目录形成两个新的region
    /A/reference_files
    /B/reference_files
  7. hbase meta下线a region的信息,不再提供服务。不会立即删除a region信息,而是标注split offline 和记录2个子region。
  8. 开启A B region,通知meta修改状态
  9. A B region,正式对外提供服务

总结:

  • region生成2个子region,关闭父region

  • 下线父region,上线子region

region merge

某个region在长时间不会被写入 ,而且region的数据有可能ttl过期删除。这种场景下region的存在是没有任何意义的。

一旦空闲的region有很多,就会导致集群的运维成本上升,master将相邻的region 合并,减少空闲的region个数。

Examples:
hbase> merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME'
hbase> merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME', true

# 第二个region 合并到第一个region
merge_region 'f354e509e1a0fd7ce8df6d6e1e73eec9','b54c42d144ce163b546a916da1e34bc1'
  1. 客户端发送merge请求给master
  2. master将待合并的所有region都move到同一个rs节点上
  3. master发送请求合并 给rs
  4. rs接收到请求,就启动本地事务执行merge操作
  5. merge将合并的region下线,再合并
  6. 将两个region的信息从meta删除,将新的region信息 写到meta表
  7. 上线新的region
Author: Tunan
Link: http://yerias.github.io/2020/08/10/hbase/6/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.