背景

hbase作为一个可扩展的分布式kv存储数据库,可以根据数量量进行水平自动扩展是它具备的一个重要的功能,具体就是hbase支持Region的分裂,比如当Region下的HFile文件太大是,分解成两个子Region,每个子Region持有部分父Region的数据.

技术细节

父Region分解成两个子Region有哪些值得注意的细节呢?

对于hbase客户端

首先对于客户端来说,当客户端的请求落到父Region上时,如果此时父Region的分解操作正在进行中,那么此时hbase会报错:NoServeringRegionException,此时客户端除了重试,没有其他的方法,个人觉得这一点对于OLTP的应用几乎是不能接受的,虽然Region的分裂操作持续时间很短(关于这一点我们后面会解释),但是依赖于客户端重试来达到目的的做法很难让人接受,按理来说,Hbase应该要能支持这种Region分解中间状态下的数据获取操作

对于hbase服务器

对于hbase进行Region分解来说,主要是要做以下几件事情: 1.创建子Region,并把子Region放到某台RegionServer服务器上 2.修改父Region在hbase:meta元数据表中的状态,也就是改成下线状态,而子Region在hase:meta元数据表中的状态设置成上线状态 3.在设置父Region和子Region的上下线状态的过程中需要Master和RegionServer的互相协作,而Zookeeper在其中就起到一个通信中介的作用.

这个父Region分解的过程持续时间很短,一般在秒级内就可以完成,我们一定很奇怪,为什么Region分解看起来像是一个重量级的操作,为什么需要的时间这么短? 答案是: 父Region分解的过程中不涉及数据的移动,也就是不需要把父Region对应的HDFS上的Hfile文件中数据迁移到子Region的HDFS上的对应目录下,你一定疑惑,不迁移数据这还算是完整的Region分解吗?其实Region分解完成后,子Region目录中存放的是一些元数据信息,这些元数据信息的作用就是怎么映射到父Region的Hfile文件的对应位置上,比如Key1对应到子Region中,此时通过子Region目录中的元数据信息,可以找到父Region目录下的HFile文件去读取数据。

那什么时候子Region目录中才有真正的HFIile文件? 答案是等到compact合并的时候,此时就会真正的把数据进行合并等操作 另外一个问题是父Region目录中的Hfile文件什么时候删除? 答案就是当子Region目录中有真正的HFile文件时,父Region目录中的HFile就可以删除了

总结

hbase的Region分解的过程中不涉及数据记录的大规模迁移,所以耗时很短,那你有没有过疑问:既然数据还在旧的HFile文件上,那么Region分解的意义何在? 由于分解成多个子Region后,这几个子Region可以分布在不同的RegionServer服务器上,此时对于直接文件查找操作是没有收益的,主要的收益在于每个子Region可以有不同的缓存,相比于单台的RegionServer服务器,多个RegionServer提供缓存容量更大,而且可以处理更多的请求了

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: