《HBase权威指南》读书笔记 第八章:架构,存储

存储

HBase架构图如下:

《HBase权威指南》读书笔记 第八章:架构,存储

从图中可以看到HBase主要处理两种文件,WAL和实际的数据文件。这两种文件最终都存在HDFS中。

首次请求所需的步骤如下:

  1. 从zk中取得hbase:meta表所在的节点,路径为/hbase/meta-region-server
  2. hbase:meta表中读取元数据,根据元数据推测出数据所在的节点。
  3. 连接实际的数据节点取得数据。

其中步骤2的元数据会在客户端进行缓存,下次不用查meta表。下面介绍meta表的结构。

meta表中的key格式为[table],[region start key],[region id]。笔者从实际运行的HBase实例中取了meta表中的一行数据,其key为test,,1496321078922.cd9c09dcebc92b7f3c3d26008bee32a3.,从这个key中可以知道tabletestregion start key是空白,region id1496321078922.cd9c09dcebc92b7f3c3d26008bee32a3.

meta表中的value格式有三个列:

  • info:regioninfo:存放序列化的HRegionInfo对象。笔者实际拿到一条数据内容为:timestamp=1498052321524, value={ENCODED => cd9c09dcebc92b7f3c3d26008bee32a3, NAME => 'test,,1496321078922.cd9c09dcebc92b7f3c3d26008bee32a3.', STARTKEY => '', ENDKEY => ''}从中可以看到STARTKEYENDKEY分别表示行键开始和结束的时间。
  • info:server:存放服务器地址和端口信息。笔者实际拿到一条数据内容为:timestamp=1498052321524, value=cpc1:34979。从中可以得出服务器主机名为cpc1,端口是34979。
  • info:serverstartcode:region所在的节点启动时间,笔者拿到一条实际数据内容为:timestamp=1498052321524, value=1498052313334

写数据流程如下:

  • HRegionServer收到来自客户端的Put请求
  • HRegionServer决定是否需要将数据写到HLog预写日志里面。预写日志使用了标准的Hadoop Sequence File,其中储存了若干HLogKey实例。每个HLogKey中包含了***和实际数据。用于故障恢复。
  • HRegionServer将请求转交给HRegion,数据放到MemStore中。如果检查到MemStore数据满了,就触发一次刷写。刷写由另外一个线程负责,刷写的结果是将MemStore中的内容放到新的HFile中。并保存最后写入的***。***用于故障恢复,可以给系统判断从哪开始恢复。

另外关闭节点之前时也会触发刷写,刷写的范围是目前体积超过配置hbase.hregion.preclose.flush.size的所有MemStore。这样设计是为了提升可用性,因为预刷写时,服务仍然可用。预刷写之后再阻塞所有请求,再进行一次刷写,最后关闭region。

现在介绍文件储存结构。默认配置下,HBase将文件储存在HDFS中的/hbase目录中,可以通过配置修改储存目录。我们将/hbase称之为HBase的根目录,这个文件夹里主要有如下文件:

  • .logs目录:用于存放WAL日志。每个HRegionServer都有一个对应的子目录。目录名字是实例编号,格式为<host>,<port>,<timestamp>。新版本中已经改名为WALs
  • .logs/<HRegionServer实例编号>目录:给单个节点存放HLog文件。因为日志滚动,可能会有多个HLog
  • .oldlogs目录:日志文件用于意外停机恢复使用的,当WAL中的数据已经全部持久化到硬盘之后,日志文件不再有用。从而移动到.oldlogs文件夹中。最新版本中此名字已经改成oldWALs。这里的文件默认10分钟后删除。可以通过配置hbase.master.cleaner.interval调整。
  • hbase.id:集群的唯一ID
  • hbase.version:集群的版本
  • <表名>/.tableinfo:存放序列化后的HTableDescriptor对象
  • <表名>/<region名MD5>/.regioninfo:储存序列化后的HRegionInfo对象
  • <表名>/<region名MD5>/.tmp:储存临时文件
  • <表名>/<region名MD5>/recovered.edits:WAL拆分成功得到的文件放在这个目录
  • <表名>/<region名MD5>/recovered.edits/.temp:WAL拆分过程中产生的临时文件放在这个目录