HBase 0.96版本之前读写流程、root和meta表

HBase 在0.96版本之后舍弃了 Root 表

1. HBase读写流程

在这里插入图片描述

上图是 Region Server 数据存储关系图。上文提到,HBase 使用 MemStore 和 StoreFile 存储对表的更新。数据在更新时首先写入 HLog 和 MemStore。MemStore 中的数据是排序的,当 MemStore 累计到一定阈值时,就会创建一个新的 MemStore,并且将老的 MemStore 添加到 Flush 队列,由单独的线程 Flush 到磁盘上,成为一个 StoreFile。与此同时,系统会在 Zookeeper 中记录一个 CheckPoint,表示这个时刻之前的数据变更已经持久化了。当系统出现意外时,可能导致 MemStore 中的数据丢失,此时使用 HLog 来恢复 CheckPoint 之后的数据。

StoreFile 是只读的,一旦创建后就不可以再修改。因此 Hbase 的更新其实是不断追加的操作。当一个 Store 中的 StoreFile 达到一定阈值后,就会进行一次合并操作,将对同一个key的修改合并到一起,形成一个大的 StoreFile。当 StoreFile 的大小达到一定阈值后,又会对 StoreFile 进行切分操作,等分为两个 StoreFile。

1.1 写操作流程

(1) Client 先访问 Zookeeper,查找-ROOT-表,获取.META.表位于哪个 RegionServer。
(2) 访问对应的 RegionServer 获取.META.表,根据读请求的 namespace:table/rowkey,在.META.表中查询出目标数据位于哪个 RegionServer 中的哪个 Region 中。并将该 table 的 Region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
(3) Client 与目标 RegionServer 进行通讯;先将数据顺序写入(追加)到 WAL,再写入到 Region 的 MemStore,数据会在 MemStore 进行排序。
(4) 当 MemStore 达到预设阈值,MemStore 中的数据被 Flush成一个 StoreFile。
(5) 随着 StoreFile 文件的不断增多,当其数量增长到一定阈值后,触发 Compact 合并操作,将多个 StoreFile 合并成一个StoreFile,同时进行版本合并和数据删除。
(6) StoreFile 通过不断的 Compact 合并操作,逐步形成越来越大的 StoreFile。
(7) 单个 StoreFile 大小超过一定阈值后,触发 Split 操作,把当前 Region Split 成2个新的 Region。父 Region 会下线,新Split 出的2个子 Region 会被 HMaster 分配到相应的 RegionServer 上,使得原先1个 Region 的压力得以分流到2个Region 上。

可以看出 HBase 只有增添数据,所有的更新和删除操作都是在后续的 Compact 历程中举行的,使得用户的写操作只要进入内存就可以立刻返回,实现了 HBase I/O 的高性能。

1.2 读操作流程

(1) Client 访问 Zookeeper,查找-ROOT-表,获取.META.表信息。
(2) 从.META.表查找,获取存放目标数据的 Region 信息,从而找到对应的 RegionServer。
(3) 通过 RegionServer 获取需要查找的数据。
(4) RegionServer 的内存分为 MemStore 和 BlockCache 两部分,MemStore 主要用于写数据,BlockCache 主要用于读数据。读请求先到 MemStore 中查数据,查不到就到 BlockCache 中查,再查不到就会到 StoreFile 上读,并把读的结果放入 BlockCache。

寻址过程:client–>Zookeeper–>-ROOT-表–>META表–>RegionServer–>Region–>client

2.ROOT表和META表

2.1 -ROOT-表结构

HBase 的用-ROOT-表来记录.META.的 Region 信息,就和.META.记录用户表的 Region 信息一模一样。-ROOT-只会有一个 Region。
这么一来 Client 端就需要先去访问-ROOT-表。所以需要知道管理-ROOT-表的 RegionServer 的地址。这个地址被存在 ZooKeeper 中。默认的路径是:
/hbase/root-region-server

在这里插入图片描述

2.2 .META.表结构

在这里插入图片描述

2.3 两个表的关系

HBase 的所有 Region 元数据被存储在.META.表中2.1,随着 Region 的增多,.META.表中的数据也会增大,并分裂成多个新的 Region 。为了定位.META.表中各个 Region 的位置,把.META.表中所有 Region 的元数据保存在-ROOT-表中,最后由 Zookeeper 记录-ROOT-表的位置信息。所有客户端访问用户数据前,需要首先访问 Zookeeper 获得-ROOT-的位置,然后访问-ROOT-表获得.META.表的位置,最后根据.META.表中的信息确定用户数据存放的位置,如下图所示。

在这里插入图片描述

-ROOT-表永远不会被分割,它只有一个 Region,这样可以保证最多只需要三次跳转就可以定位任意一个 Region。为了加快访问速度,.META.表的所有Region全部保存在内存中。客户端会将查询过的位置信息缓存起来,且缓存不会主动失效。如果客户端根据缓存信息还访问不到数据,则询问相关.META.表的 Region 服务器,试图获取数据的位置,如果还是失败,则询问-ROOT-表相关的.META.表在哪里。最后,如果前面的信息全部失效,则通过 ZooKeeper 重新定位 Region 的信息。所以如果客户端上的缓存全部是失效,则需要进行6次网络来回,才能定位到正确的 Region。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值