《HBase权威指南》读书笔记 第八章:架构,存储
存储
HBase架构图如下:
从图中可以看到HBase主要处理两种文件,WAL和实际的数据文件。这两种文件最终都存在HDFS中。
首次请求所需的步骤如下:
- 从zk中取得
hbase:meta
表所在的节点,路径为/hbase/meta-region-server
。 - 从
hbase:meta
表中读取元数据,根据元数据推测出数据所在的节点。 - 连接实际的数据节点取得数据。
其中步骤2的元数据会在客户端进行缓存,下次不用查meta表。下面介绍meta表的结构。
meta表中的key格式为[table],[region start key],[region id]
。笔者从实际运行的HBase实例中取了meta表中的一行数据,其key为test,,1496321078922.cd9c09dcebc92b7f3c3d26008bee32a3.
,从这个key中可以知道table
是test
,region start key
是空白,region id
是1496321078922.cd9c09dcebc92b7f3c3d26008bee32a3.
。
meta表中的value格式有三个列:
-
info:regioninfo
:存放序列化的HRegionInfo
对象。笔者实际拿到一条数据内容为:timestamp=1498052321524, value={ENCODED => cd9c09dcebc92b7f3c3d26008bee32a3, NAME => 'test,,1496321078922.cd9c09dcebc92b7f3c3d26008bee32a3.', STARTKEY => '', ENDKEY => ''}
从中可以看到STARTKEY
和ENDKEY
分别表示行键开始和结束的时间。 -
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拆分过程中产生的临时文件放在这个目录