5.2 Region再细分
Hbase的核心模块是RegionServer,RegionServer又由HLog和Region构成,Region存储着一系列连续的数据集。Region对应着和多个的Store,每个Store对应着表中的一个列族的存储,Store又是由一个MemStore和零到多个的StoreFile组成,StoreFile的底层是用HFile实现,也可以说StoreFile就是HFile。
5.2.1 Hbase写数据
(获取元数据)客户端访问Zookeeper,从Meta表中得到数据写入的Region和RegionServer的相关信息
(两次写信息)客户端按照Zookeeper返回的相关信息,直接访问RegionServer把数据分别写入HLog和MemStore。
(持久化数据)当MemStore的存储量达到一定阈值(默认64M)时,会把数据写入磁盘文件StoreFile中,并在HLog中写入一个标记表示MemStore中的缓存数据写入到StoreFile中。如果MemStore中的数据丢失,则可以在HLog中恢复。
(StoreFile合并分裂)StoreFile文件的数量达到一定的数量时,会触发合并成一个大的StoreFile,当StoreFile的文件大小超过一定的阈值时,大StoreFile会分裂成两个StoreFile。同时,当前父Region会分裂成两个子Region,父Region下线,两个子Region被Master分配到相应的RegionServer(父Region拆分的原因参考 5.4Region拆分)。
5.2.2 Hbase读数据
(获取元数据)客户端访问Zookeeper,从Meta表中得到读取数据的Region和RegionServer的相关信息
(发送请求)客户端向对应的RegionServer发送读取数据请求
(查找数据)RegionServer在就收到请求消息之后,现在MemStore中查找数据,如果没有就到StoreFile中读取,最后将数据返回给客户端。
5.2.3 HFile的合并(Minor|Major)
Minor合并(满足条件的小HFile进行合并)
执行合并时,Hbase将多个小HFile的内容读出并写入到一个新的文件中,然后激活新文件,旧文件标记为删除,被标记后的旧文件只有在下一次Major合并时才会被删除,在此之前仍会出现在HFile中。HFile的Minor合并是触发式的,触发条件很多,比如在将MemStore中的数据刷新到HFile中时会申请对符合条件的HFile进行合并,定期合并等。除此之外,对选择进行合并的HFile文件也是有条件的,条件如下:
也就是说,一次Minor合并的HFile文件的个数在3~10个之间。
Major合并(无差别合并)
Major合并会对Store中的所有HFile文件进行无差别的合并,甚至有时会将整个表中同一列族的HFile进行合并,这是一个耗时且耗费资源的操作,很影响集群的性能。故一般情况下都只做Minor合并,不做甚至有些集群干脆就禁止Major合并,只有在集群负载较小时才进行手动的Major合并,或者配置Major的合并中期,默认为7天。
5.3 WAL机制
WAL就是(Write Ahead Log),字面翻译就是预写日志文件机制。如下图所示,每个RegionServer中的所有Region共用一个HLog文件,HLog就是上面说到的预写日志文件,也就是说,每当客户端更写数据必须先写入到HLog文件后才能被写入到MemStore中。
故障转移:Zookeeper会实时监控每个Regionserver的状态,当某个RegionServer故障时,RegionServer在Zookeeper上的临时节点就会过期,Zookeeper会首先通知Master,Master会第一时间处理该RegionServer上的HLog文件,对其按照Region进行拆分并放到相应Region的目录下,等到Region被重新分配到可用的RegionServer上时,按照Region目录下的HLog进行数据恢复。
5.4 Region拆分
一旦Region的负载过大或者超过阈值时(Region中最大的Store的大小大于设置的阈值时就会触发Region拆分),它就会被拆分成两个新的Region,这个过程是由RegionServer来完成的,具体流程如下:
(下线并阻止请求)下线需要拆分的Region,阻止所有对该Region的客户端请求,Master检测到Region的状态为SPLITING。
(建立引用文件并指向)在父Region的下面建立两个引用文件,分别指向父Region的首行与末行,此时并不会开始复制数据。
(建立目录并复制)在HDFS上建立两个子Region的目录,分别复制上一步建立的引用文件,每个子Region分别占用父Region的一半数据,复制完成后删除两个引用文件。
(更新Meta表元数据)完成子Region的创建后,向Meta表发送新产生的两个Region的元数据信息,删除父Region的元数据信息。
(更新状态)将Region的拆分信息更新到HMaster中,并且每个Region进入可用状态。
5.5 Region合并
(发送请求)客户端发送Region合并请求给Master。
(聚堆并发送请求)Master在RegionServer上将Region移到一起,并发起一个Region合并操作的请求。
(下线并合并)RegionServer将准备合并的Region下线,然后进行合并。
(更新元数据)从Meta表上删除被合并的Region的元数据,并写入新的Region的元数据。
(更新状态及信息)新的Region设置上线,同时更新Region信息到Master。
Region合并的必要性:Region过多会导致Meta表过大,Zookeeper管理不过来,从而影响客户端的请求响应。