背景
HBase得Region在大小达到一定条件后分裂,一个分区变为两个分区; 分区时机: 在compact结束时,依据RegionSplitPolicy决定是否分区 因为 在将父分区数据划分至两个子分区期间,分区数据不可读;直到两个子分区被启用
架构
- ZK目录/hbase/region-in-transition/parent_region_name创建子节点,状态SPLITTING
- Master一直监听/hbase/region-in-transition目录,感知到父分区状态变化
- RegionServer在HDFS中父分区目录(parent_region_name)下创建.splits子目录
- 关闭父分区,强制刷新MemStore中数据到磁盘;从这个阶段开始,所有发往此分区的请求不可读
- 在HDFS的.splits目录创建子分区daughterA,daughterB;创建部分所需数据结构;接下来将父分区的HFiles拆分,因为HBase中数据不可变,在子分区目录下为每个HFile分别创建了两个ReferenceFile, 该文件中只存key,指向父分区中HFile
- RegionServerA往元数据表(.META.存放某RegionServer B)写入:
- 父分区下线
- RegionServerA打开子分区,接收读写
- 将子分区数据写入元数据表, 此时客户端感知子分区,原父分区对应数据可以读写
- RegionServer更新/hbase/region-in-transition/parent_region_name状态为SPLIT; Master感知,Balancer可以将子分区迁往其他RegionServer
- 此时子分区仍有数据指向父分区,再子分区定期compact时会将引用的父分区数据写入子分区HFiles