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节点马上开始恢复日志