类似于MySQL的binary log,WAL存储了对数据的所有更改,这使得服务器崩溃的时候,可以有效地回放日志,是数据得以恢复到崩溃以前。这也就意味着如果将记录写入到WAL失败时,整个操作也可以认为是失败的。

WAL就像日志中心一样,它被同一个region server中的所有region共享。

当客户端启动一个操作来修改数据,该操作便会被封装成一个KeyValue对象实例中,并通过RPC调用发送出去。这些调用成批的发送给含有匹配region的HRegionServer。一旦KeyValue到达,它们会被发送到管理相应行的HRegion对象实例。数据便被写入到WAL,然后放入到实际拥有记录的存储文件的MemStore中。

最后当memstore达到一定的大小或者经历一个特定时间之后,数据就会异步地连续写入到文件系统中。在写入的过程中,数据以一种不稳定的状态存放在内容中,即使在服务器完全崩溃的情况下,WAL也能够保证数据不丢失,因为实际的日志存储在HDFS上。其他服务器可以打开日志然后回放这些修改。

涉及到的类

HLog类

实现了WAL的类叫做HLog。当HRegion被实例化时,HLog实例会被当作一个参数传入到HRegion的构造器中,当一个region接收到一个更新操作时,它可以直接将数据保存到一个共享的WAL实例中去。

HLog的另一个特性是追踪修改,这个特性可以通过使用序列号来实现。

HLogKey类

WAL当前使用的是Hadoop的SequenceFile,这种文件格式按照键/值集合的方式存储记录

对WAL来说,Value仅仅是客户端发送的修改请求,Key则是HLogKey实例。由于KeyValue仅仅代表行健、列族、列限定词、时间戳、类型以及值,所以要有一个地方来存储KeyValue的归属,即region和表名,这个信息存储在HLogKey中。

WALEdit类

客户端发送的每一个修改都会被封装到一个WALEdit类。它通过日志级别来管理原子性。

LogSyncer类

表的描述符允许用户设置延迟日志刷写(deffered log flush)的标志,默认是false,意味着每一次编辑都被发送到服务器时,它都会调用写日志的sync()方法。这个调用强迫写入日志的更新都会被文件系统确认,所以用户获得了持久化的保证。

管道写入

目前sync()的实现是管道写,意味着当修改被写入时,它会被发送到第一个DataNode进行存储。一旦成功,第一个DataNode就会把修改发送到另一个Data Node来进行相同的工作。只有3个DataNode都已经确认了写操作,客户端才被会允许继续进行。

多路写

写入操作被同时发送到3台主机,当所有主机都确认了写操作之后,客户端才可以继续。

LogRoller类

日志的写入是有大小限制的。LogRoller类会作为一个后台线程运行,并且在特定的时间间隔内滚动日志。

回放

master和region服务器需要配合起来精确地处理日志文件,特别是需要从服务器失效中恢复的时候,WAL用来保持数据更新的安全,而回放则是一个使用系统恢复到一致性状态的更加复杂的过程。

单日志

考虑到同时写入太多文件,且需要保留滚动的日志会影响系统的扩展性,因此所有的数据更新都会被写入到region服务器中的一个基于HLog的日志文件中。

日志拆分

有两种日志文件需要被回放的情况:集群启动时或服务失败时。当master启动的时候(包括备用的master接管系统的时候),它会检查文件系统中HBase根目录的.log文件夹下是不是有日志文件,以及这些文件又没有分配的region服务器。

日志的名字不仅包含服务器的名字,还包含服务器的启动码(start code)。这个数字会在每次region服务器重启的时候重置。master可以通过这个数字来检查日志是否被遗弃了。

在日志中的数据改动被回放之前,日志需要单独放在每个region对应的单独的日志文件中。
读取混在一起的日志,并且所有的条目都按照它所归属的region来分组。这些分组的修改记录被存放在一个紧挨着目标region的文件中以供接下来的数据恢复过程使用。这个过程叫做日志拆分。

日志拆分版本已经经过多次变更,见HBase Log Splitting。

.corrupt文件夹包括所有不能解析的日志文件。这种情况可以通过hbase.hlog.split.skip.errors属性来改变。默认情况下设置为true,表示所有不可以从文件中读出来的数据更改都会使整个日志文件被移动到.corrupt文件夹中。

注意日志拆分和region拆分的区别。

数据恢复

当集群启动,或region从一个region server移动到另一个region server中时,region都会被打开,且此时region会首先检查recovered.edits目录是否存在,如果该目录存在,它就会打开该目录的文件,并开始读取文件所包含的数据更改记录。又由于文件是按照序列ID的文件名排序的,region便可以按照序列ID的数据来恢复数据。

一旦recovered.edits目录中的文件都被处理完,且其中的数据更改也都被写入到硬盘后,该目录便会被删除。当出现文件不可读的情况时,hbase.skip.errors属性决定了接下来系统的行为。

HBase原理-RegionServer宕机数据恢复

持久性

HBase会检测当前的Hadoop库是否支持syncFS()或hflush()。如果写入日志的时候触发sync(),则HBase会在内部调用以上两种方法之一。

WAL (Write-Ahead Logging )相关推荐

  1. 什么是 WAL?Write-ahead logging

    什么是 WAL WAL(Write Ahead Log)预写日志,是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性. 在计算机科学中,「预写式日志」(Write-ahead loggin ...

  2. 预写式日志 - postgresql之WAL(Write Ahead Log)

    oracle中存在重做日志文件(redo log),其作用是保证数据的一致性和事务的完整性,防止在系统崩溃时最近的事务无法恢复.在postgresql中引入了WAL(write ahead log), ...

  3. PostgreSQL的WAL基本原理

    背景: 1:任何数据库都不允许数据丢失. 2:事务日志:记录数据库所有变更与行为的历史记录. 3:数据库通过事务日志回放来保证数据库故障恢复后数据不丢失. 概念: WAL(Wrioter Ahead ...

  4. Sqlite学习笔记(四)SQLite-WAL原理(转)

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  5. acid php5,ACID原则

    [原子性] 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节.事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样. [ ...

  6. Dws同步mysql数据_数据库技术丨GaussDB(DWS)数据同步状态查看方法

    摘要:针对数据同步状态查看方法,GaussDB(DWS)提供了丰富的系统函数.视图.工具等可以直观地对同步进度进行跟踪,尤其是为方便定位人员使用,gs_ctl工具已集合了大部分相关系统函数的调用,可做 ...

  7. 怎么提高自己的系统架构水平

    简介: 系统设计与架构理论这个问题,回答起来非常宽泛,基本所有的技术理论都可以涵盖.作为一个撸代码快 10 年的后端技术人员,简单发表一下我的看法. 原创 勇剑 淘系技术  7月15日 系统设计与架构 ...

  8. pitr 原理_PostgeSQL 数据库备份与恢复实验 (PITR)

    一.概述 此文档描述了Postgresql数据库备份方案, 当数据库发生崩溃时,如何利用备份恢复到崩溃前,保证数据库最少数据量丢失甚至不丢失: 二.备份恢复原理 运用在线备份以及即时恢复(PITR)原 ...

  9. 【面试题001】最强java八股文

    一.基础篇 网络基础 TCP三次握手 1.OSI与TCP/IP 模型 2.常见网络服务分层 3.TCP与UDP区别及场景 4.TCP滑动窗口,拥塞控制 5.TCP粘包原因和解决方法 6.TCP.UDP ...

  10. SQLITE3插入、查询效率的优化方法

    插入篇: 1.sqlite3_exec() 通常,我们使用sqlite3_exec()函数来处理数据的插入操作,该函数直接调用sql语句对数据进行插入,所以使用起来很方便,插入100w条数据 for( ...

最新文章

  1. leetcode 206 Reverse Linked List
  2. 前端 验证码隐藏怎么实现_完成图形验证码
  3. python代码壁纸-70行python代码实现壁纸批量下载
  4. 微信 小程序组件 分享按钮
  5. H3C 5510 交换机DHCP设置
  6. linux 磁盘分配 简书,linux 磁盘分区
  7. Dynamics 365执行操作报SQL Server已超时,更改这个超时设置的方法
  8. php phar,PHP中phar(PHP Archive)包的创建并使用
  9. 总结UIViewController的view在有navBar和tabBar影响下布局区域的问题
  10. 查看每个用户linux内存,编写shell脚本查看linux当前各用户的cpu和memory消耗比例
  11. 冲刺七天----03
  12. CPLEX案例教程推荐
  13. 一元线性回归:Excel、SPSS、Matlab三种方法实现
  14. 收文和发文管理流程分析
  15. EyouCms1.0前台GetShell漏洞复现
  16. 锚具ovm是什么意思_OVM锚具资料
  17. 服务器假死 http 状态码,关于golang:Golang之HTTP服务『假死』问题排查
  18. 计算机任务管理器无法响应,Win7系统电脑在任务管理器中关闭进程时总是未响应的解决方法...
  19. 9个妙招教你玩转微信
  20. 知网文献免费下载方法

热门文章

  1. 2018年计算机等级考试江苏考点联系地点
  2. k8s集群部署xxl-job-admin
  3. JavaScript基础之三JavaScript变量和数据类型
  4. STM32 —— RT-Thread Nano 移植
  5. WPF DataGrid设置滚动条宽度
  6. Nginx正向代理配置详解
  7. 二极管选型的多个关键要素
  8. FastAPI 自动文档Swagger UI 打不开。显示空白
  9. php $delaytime /= $delaytime,定时器之延时触发鼠标悬浮事件
  10. java 对象数组定义_Java对象数组定义与用法详解