全网最细致的 HBase 内核解析( 二 )


第一次读和写操作
有一个特殊的 HBase Catalog 表叫 Meta table(它其实是一张特殊的 HBase 表) , 包含了集群中所有 regions 的位置信息 。Zookeeper 保存了这个 Meta table 的位置 。
当 HBase 第一次读或者写操作到来时:

  • 客户端从 Zookeeper 那里获取是哪一台 Region Server 负责管理 Meta table 。
  • 客户端会查询那台管理 Meta table 的 Region Server , 进而获知是哪一台 Region Server 负责管理本次数据请求所需要的 rowkey 。客户端会缓存这个信息 , 以及 Meta table 的位置信息本身 。
  • 然后客户端回去访问那台 Region Server , 获取数据 。
对于以后的的读请求 , 客户端可以从缓存中直接获取 Meta table 的位置信息(在哪一台 Region Server 上) , 以及之前访问过的 rowkey 的位置信息(哪一台 Region Server 上) , 除非因为 Region 被迁移了导致缓存失效 。这时客户端会重复上面的步骤 , 重新获取相关位置信息并更新缓存 。
全网最细致的 HBase 内核解析

文章插图
点评:客户端读写数据 , 实际上分了两步:第一步是定位 , 从 Meta table 获取 rowkey 属于哪个 Region Server 管理;第二步再去相应的 Region Server 读写数据 。这里涉及到了两个 Region Server , 要理解它们各自的角色功能 。关于 Meta table 下面会详细介绍 。
HBase Meta Table
Meta table 是一个特殊的 HBase table , 它保存了系统中所有的 region 列表 。这张 table 类似一个 b-tree , 结构大致如下:
  • Key:table, region start key, region id
  • Value:region server

全网最细致的 HBase 内核解析

文章插图
Region Server 组成
Region Server 运行在 HDFS DataNode 上 , 由以下组件组成:
  • WAL:Write Ahead Log 是分布式文件系统上的一个文件 , 用于存储新的还未被持久化存储的数据 , 它被用来做故障恢复 。
  • BlockCache:这是读缓存 , 在内存中存储了最常访问的数据 , 是 LRU(Least Recently Used)缓存 。
  • MemStore:这是写缓存 , 在内存中存储了新的还未被持久化到硬盘的数据 。当被写入硬盘时 , 数据会首先被排序 。注意每个 Region 的每个 Column Family 都会有一个 MemStore 。
  • HFile 在硬盘上(HDFS)存储 HBase 数据 , 以有序 KeyValue 的形式 。

全网最细致的 HBase 内核解析

文章插图
点评:这一段是重中之重 , 理解 Region Server 的组成对理解 HBase 的架构至关重要 , 要充分认识 Region Server 的功能 , 以及每个组件的作用 , 这些组件的行为和功能在后续的段落中都会一一展开 。
HBase 写数据步骤
当客户端发起一个写数据请求(Put 操作) , 第一步首先是将数据写入到 WAL 中:
  • 新数据会被追加到 WAL 文件尾部 。
  • WAL 用来在故障恢复时恢复还未被持久化的数据 。

全网最细致的 HBase 内核解析

文章插图
数据被写入 WAL 后 , 会被加入到 MemStore 即写缓存 。然后服务端就可以向客户端返回 ack 表示写数据完成 。
点评:注意数据写入时 WAL 和 MemStore 更新的顺序 , 不能调换 , 必须先 WAL 再 MemStore 。如果反过来 , 先更新完 MemStore , 此时 Region Server 发生 crash , 内存中的更新就丢失了 , 而此时数据还未被持久化到 WAL , 就无法恢复了 。理论上 WAL 就是 MemStore 中数据的一个镜像 , 应该保持一致 , 除非发生系统 crash 。另外注意更新 WAL 是在文件尾部追加的方式 , 这种磁盘操作性能很高 , 不会太影响请求的整体响应时间 。

全网最细致的 HBase 内核解析

文章插图
HBase MemStore
MemStore 在内存中缓存 HBase 的数据更新 , 以有序 KeyValues 的形式 , 这和 HFile 中的存储形式一样 。每个 Column Family 都有一个 MemStore , 所有的更新都以 Column Family 为单位进行排序 。
全网最细致的 HBase 内核解析

文章插图
HBase Region Flush


推荐阅读