RegionServer 管理了很多 RegionRegion 又由多个 hStore 组成。hStoreMemStoreStorefile 两部分组成。大致的写数据关系流程如下:

  1. 首先用户写入的数据会先缓存到 MemStore (内存中),当 MemStore 满了之后被 FlushStorefile(在 HDFS 上存储,底层是 hFile)。
  2. Storefile 的文件数量增大到阈值,会触发 Compaction ,将多个 Storefile 合并成一个 Storefile (合并过程中会进行版本的合并和旧数据的删除)。
  3. Compaction 后, Storefile 文件大小会变大,当单个 Storefile 文件大小达到阈值后,会触发 Split,将当前的 Region 分成两个小的 Region
  4. 新生成的 Region 会被 Master 的分配到相应的 RegionServer

当然,在分布式环境中,如果一台 RegionServer 意外宕掉,那它的 MemStore 数据就丢失了,这里就需要引入 hLog

  1. 每一个 RegionServer 都有一个 hLog 的对象,当用户写入 MemStore 的时候,其实也是会写一份数据到 hLog 的。
  2. hLog 会随时更新滚动,删除已经写入到 Storefile 的数据。
  3. RegionServer 意外终止进程, hMaster 会通过 ZooKeeper 感知到, hMaster 会将 hLog 按照不同的 Region 拆分 hLog ,分配到相应的 Region 。
  4. 然后将失效的 Region 重新分配,领到这些 RegionRegionServer 在加载 Region 时,会处理 hLog ,然后重新将 hLog 的内容加载到新的 MemStore,然后 FlushStorefile ,完成数据恢复。