Hbase的写逻辑
1. Hbase写流程
Hbase的数据写入流程可以分为三步:
第一步: 获取RegionServer
Client 获取数据写入的 Region 所在的 RegionServer
第二步:请求写Hlog
Hlog 存储在 HDFS,当 RegionServer 出现异常,需要使用 Hlog 来恢复数据。
第三步:请求写MemStore
请求写 MemStore,只有当写 Hlog 和写 MemStore 都成功了才算请求写入完成。MemStore 后续会逐渐刷到 HDFS 中。
2. MemStore刷盘
为了提高 Hbase 的写入性能,当写请求写入 MemStore 后,不会立即刷盘。而是会等到一定的时候进行刷盘的操作。具体是哪些场景会触发刷盘的操作呢?总结成如下的几个场景:
- 全局内存控制
这个全局的参数是控制内存整体的使用情况,当所有 memstore 占整个 heap 的最大比例的时候,会触发刷盘的操作。
这个参数是hbase.regionserver.global.memstore.upperLimit,默认为整个 heap 内存的 40%。
但这并不意味着全局内存触发的刷盘操作会将所有的 MemStore 都进行刷盘,而是通过另外一个参数 hbase.regionserver.global.memstore.lowerLimit 来控制,默认是整个heap 内存的 35%。
当 flush 到所有 memstore 占整个 heap 内存的比率为 35%的时候,就停止刷盘。这么做主要是为了减少刷盘对业务带来的影响,实现平滑系统负载的目的。
- 全局内存控制
- MemStore 达到上限
当 MemStore 的大小达到 hbase.hregion.memstore.flush.size 大小的时候会触发刷盘,默认 128M 大小
- MemStore 达到上限
- RegionServer 的Hlog 数量达到上限
前面说到 Hlog 为了保证 Hbase 数据的一致性,那么如果 Hlog 太多的话,会导致故障恢复的时间太长,因此 Hbase 会对 Hlog 的最大个数做限制。当达到 Hlog 的最大个数的时候,会强制刷盘。这个参数是 hase.regionserver.max.logs,默认是 32 个。
- RegionServer 的Hlog 数量达到上限
- 手工触发
可以通过 hbase shell 或者 java api 手工触发 flush 的操作。
- 手工触发
- 关闭RegionServer 触发
在正常关闭 RegionServer 会触发刷盘的操作,全部数据刷盘后就不需要再使用 Hlog 恢复数据。
- 关闭RegionServer 触发
- Region 使用HLOG 恢复完数据后触发
当 RegionServer 出现故障的时候,其上面的 Region 会迁移到其他正常的RegionServer 上,在恢复完 Region 的数据后,会触发刷盘,当刷盘完成后才会提供给业务访问。
- Region 使用HLOG 恢复完数据后触发