1. Hbase写流程

Hbase的数据写入流程可以分为三步:

  • 第一步: 获取RegionServer

    Client 获取数据写入的 Region 所在的 RegionServer

  • 第二步:请求写Hlog

    Hlog 存储在 HDFS,当 RegionServer 出现异常,需要使用 Hlog 来恢复数据。

  • 第三步:请求写MemStore

    请求写 MemStore,只有当写 Hlog 和写 MemStore 都成功了才算请求写入完成。MemStore 后续会逐渐刷到 HDFS 中。

2. MemStore刷盘

为了提高 Hbase 的写入性能,当写请求写入 MemStore 后,不会立即刷盘。而是会等到一定的时候进行刷盘的操作。具体是哪些场景会触发刷盘的操作呢?总结成如下的几个场景:

    1. 全局内存控制

      这个全局的参数是控制内存整体的使用情况,当所有 memstore 占整个 heap 的最大比例的时候,会触发刷盘的操作。
      这个参数是hbase.regionserver.global.memstore.upperLimit,默认为整个 heap 内存的 40%。
      但这并不意味着全局内存触发的刷盘操作会将所有的 MemStore 都进行刷盘,而是通过另外一个参数 hbase.regionserver.global.memstore.lowerLimit 来控制,默认是整个heap 内存的 35%。
      当 flush 到所有 memstore 占整个 heap 内存的比率为 35%的时候,就停止刷盘。这么做主要是为了减少刷盘对业务带来的影响,实现平滑系统负载的目的。

    1. MemStore 达到上限

      当 MemStore 的大小达到 hbase.hregion.memstore.flush.size 大小的时候会触发刷盘,默认 128M 大小

    1. RegionServer 的Hlog 数量达到上限

      前面说到 Hlog 为了保证 Hbase 数据的一致性,那么如果 Hlog 太多的话,会导致故障恢复的时间太长,因此 Hbase 会对 Hlog 的最大个数做限制。当达到 Hlog 的最大个数的时候,会强制刷盘。这个参数是 hase.regionserver.max.logs,默认是 32 个。

    1. 手工触发

      可以通过 hbase shell 或者 java api 手工触发 flush 的操作。

    1. 关闭RegionServer 触发

      在正常关闭 RegionServer 会触发刷盘的操作,全部数据刷盘后就不需要再使用 Hlog 恢复数据。

    1. Region 使用HLOG 恢复完数据后触发

      当 RegionServer 出现故障的时候,其上面的 Region 会迁移到其他正常的RegionServer 上,在恢复完 Region 的数据后,会触发刷盘,当刷盘完成后才会提供给业务访问。