《HBase权威指南》读书笔记 第八章:架构,WAL预写日志

WAL预写日志

WAL的目的是为了容灾。一个Region Server会将本节点上所有的region的修改记录都记到同一个HLog文件中。当一次操作成功记录到WAL中时才会返回成功。这种机制保证了断电不会丢失数据。

当region打开时,HBase会读取每个HFile中的序列号。根据最大的序列号判断应该从HLog的哪个位置开始恢复数据。

HLogKey中包含了KeyValue以及region、表名、序列号、集群ID。

WALEdit中包含多个数据操作,将这些操作看成原子性事务。

LogSyncer负责异步刷写日志。默认配置下日志的实时刷写,任何操作都进行sync确保数据落盘。可以修改配置实现延迟刷写,可以提高性能,但可能停电时丢失数据。

HDFS的sync操作有两种模式,管道写和多路写。管道写要求所有的副本都写入成功才算sync完成,多路写sync则只要求主文件写入成功。第一种方式可靠性高,但延迟大。第二种方式速度快但可靠性不如前者。

LogRoller负责切分日志,避免单个日志文件过大。有两种方式触发切分日志,第一种是时间,默认1小时做切分,第二种是大小,默认达到32MB*95%做切分。任何一种方式达到阈值就会触发切分日志。

WAL回放

一个region server节点只有一个日志文件,这样做是为了性能,因为单个日志文件顺序写对于机械硬盘来说性能最好。

日志拆分。当master启动时,或者从备用master接管集群时,这个master节点就会检查.logs文件夹中的日志文件。由于文件名中包含服务器名称、启动码,所以可以判断当前日志文件是否正在使用。master节点还需要监听zk,如果发现服务节点挂了,那么master节点马上开始恢复日志,然后重新分配region到别的节点。日志拆分通常由region server完成,它的主要工作是将日志按照region进行分类,以便后面回放。拆分任务的分发工作通过zk选举完成。

日志恢复。当region被打开时,首先检查recovered.edits文件夹中的日志文件,如果没有文件就直接跳过日志恢复过程。如果有文件那么就需要开始恢复。由于文件名中包含序列号,从序列号最小的文件开始恢复。如果序列号小于储存文件中的序列号,直接跳过,因为这部分数据已经刷写过了。

当日志恢复完成后,进行一次强制刷写,然后删除recovered.edits文件。这样日志回放过程就完成了。

如果日志恢复过程发生异常,根据配置有两种策略:

  • 停止region的启动
  • 忽略错误,然后在日志文件末尾加上时间戳

日志文件的写入需要依赖HDFS中的追加操作和flush操作。

你可能感兴趣的:(读书笔记)