老版本:Zookeeper 中存储的是 -root- 表的位置信息,-root- 表存储的 meta 表的位置信息(防止 meta 表举行切分)
Client 先访问 Zookeeper,获取 hbase:meta 表位于哪个 Region Server
访问对应的 Region Server,获取 hbase:meta 表数据,根据写哀求的 namespace:table/rowkey 信息查询出目标数据位于哪个 Region Server 中的哪个 Region 中,并将该 table 的 region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次快速访问
与目标表所在的 Region Server 举行通讯
将写哀求命令顺序写入(追加)到内存的 WAL,此时 wal 没有同步到 HDFS
将数据写入对应的 MemStore,数据会在 MemStore 举行排序
同步 wal 到 HDFS,若失败则回滚清空 MemStore 写入的数据
向客户端发送 ack,此时的写哀求已经完成
等达到 MemStore 的刷写时机后,将数据刷写到 HFile
三、MemStore Flush
MemStore Flush:刷写,将 Region 中存储在内存中的数据刷写到 HDFS 的磁盘中
Client 先访问 Zookeeper,获取 hbase:meta 表位于哪个 Region Server
访问对应的 Region Server,获取 hbase:meta 表,根据读哀求的 namespace:table/rowkey 信息查询出目标数据位于哪个 Region Server 中的哪个 Region 中,并将该 table 的 region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问
Major Compaction 会删除必要保留的版本数之外的所有过期版本和 delete 类型的数据
七、Region Split
默认情况下,每个 Table 起初只有一个 Region,随着数据的不停写入增长,Region 会触发自动举行拆分。刚拆分时,两个子 Region 都位于当前的 Region Server,但处于负载均衡的考虑,HMaster 有可能会将某个 Region 转移给其他的 Region Server
Region Split 触发时机:
0.94 版本之前:当 1 个 region 中的某个 Store 下所有 StoreFile 的总大小超过 hbase.hregion.max.filesize(默认 10G),该 Region 就会举行拆分
0.94 版本之后:当 1 个 region 中的某个 Store 下所有 StoreFile 的总大小超过 min(R^2 × hbase.hregion.memstore.flush.size, hbase.hregion.max.filesize), 该 Region 就会举行拆分,其中 R 为当前 Region Server 中属于该 Table 的 region 个数