1、WAL意为 Write Ahead Log ,类似MySQL中的binlog,用来做灾难恢复之用,HLog记录数据的所有变更,一旦数据修改,就可以从Log中进行恢复。

Hbase采用类LSM的架构体系,数据写入并没有直接写入文件,而是会先写入缓存(Memstore),在满足一定条件下缓存缓存数据再会异步刷新到磁盘。为了防止数据写入缓存之后不会因为

RegionServer进程发生异常导致数据丢失,在写入缓存之前会首先将数据顺序写入HLog中。如果不幸一旦发生RegionServer宕机或者其他异常,这种设计可以从HLog中进行日志回放进行数据补救,保证数据不丢失。

HBase故障恢复的最大看点就在于如何通过HLog回放补救丢失的数据。

WAL(Write-Ahead Logging)是一种高效的日志算法,几乎是所有非内存数据库提升写性能的不二法门,基本原理是在数据写入之前首先顺序写入日志,然后再写入缓存,等到缓存写满之后统一落盘。

之所以能够提升写性能,是因为WAL将一次随机写转化为了一次顺序写加一次内存写。提升写性能的同时,WAL可以保证数据的可靠性,即在任何情况下数据不丢失。假如一次写入完成之后发生了宕机,即使所有缓存中的数据丢失,

也可以通过恢复日志还原出丢失的数据。

每个Region Server维护一个HLog,而不是每个Region一个。这样不同region(来自不同table)的日志会混在一起,这样做的目的是不断追加单个文件相对于同时写多个文件而言,可以减少磁盘寻址次数,因此可以提高对table的写性能。

带来的麻烦是,如果一台region server下线,为了恢复其上的Region,需要将RegionServer上的log进行拆分,然后分发到其他RegionServer上进行恢复。

HLog文件就是一个普通的Hadoop Sequence File:

1、HLog Sequence File 的key是HLogKey 对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number 和timestamp,timestamp是写入时间,sequence number的起始值为0,或者是最近一次存入文件系统中 sequence number。

2、HLog Sequence File 的Value是HBase 的keyvalue对象,即对应HFile中的keyValue。

WAL持久化等级

1、SKIP_WAL:只写缓存,不写HLog日志。这种方式因为只写内存,因此可以极大的提升写入性能,但是数据有丢失的风险。在实际应用过程中并不建议设置此等级,除非确认不要求数据的可靠性。

2、ASYNC_WL:异步将数据写入HLog日志中。

3、SYNC_WAL:同步将数据写入日志文件中,需要注意的是数据只是被写入文件系统中,并没有真正落盘。

4、FSYNC_WAL:同步将数据写入日志文件并强制落盘。最严格的日志写入等级,可以保证数据不会丢失,但是性能相对比较差。

5、USER_DEFAULT:默认如果用户没有指定持久化等级,Hbase使用SYNC_WAL等级持久化数据。

用户可以通过客户端设置WAL持久化等级,代码:

put.setDurability(Durability.SYNC_WAL);

2、MemStore和StoreFile

一个HRegion由多个Store组成,每个Store包含一个列族的所有数据

Store包括位于内存的一个MemStore和位于硬盘的多个StoreFile组成

写操作先写MemStore,当MemStore中的数据量达到某个阈值,HRegionServer启动启动flushcache进程写入Storefile,每次写入形成一个单独的一个HFile。

当总Storefile大小超过一定阈值后,会把当前的Region分割成两个,并由HMaster分配给相应的Region服务器,实现负载均衡。

客户端检索数据时,先在Memstore找,找不到再找Storefile。

3、当memstore达到一定的大小或是经历一个特定的时间之后,数据就会异步的连续写入到文件系统中。在写入的过程中,数据以一种不稳定的状态存放在内存中,即使在服务器完全崩溃的情况下,WAL也能保证数据不会丢失,因为

实际的日志存储在HDFS上。其他服务器可以打开日志文件然后回放这些修改,恢复操作并不在这些崩溃的物理服务器上进行。

最新文章

  1. CSS3写折纸
  2. 8.Fluent API in Code-First【Code-First系列】
  3. iOS: setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.
  4. mongoDb学习以及spring管理
  5. Dos del参数与作用(/f/s/q)
  6. Java中JTree的简单案例
  7. SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?(转)
  8. Project Euler 110:Diophantine reciprocals II 丢番图倒数II
  9. C#如何判断两个数组相等
  10. Python Socket,How to Create Socket Server? - 网络编程实例
  11. myeclipse8.5如何注册,转自他出
  12. Java 与C++的各种优势与弱点--学习更新中
  13. Description Resource Path Location Type Java compiler level does not match the version of(编译问题)
  14. PreparedStement 用户登录!
  15. dubbo @Activate 注解使用和实现解析
  16. (转)ConurrentHashMap和Hashtable的区别
  17. OpenCV——ORB特征检测与匹配
  18. js 开源k线图开发库
  19. Java方法的参数传递方式为: 值传递
  20. 解决HTML加载时,外部js文件引用较多,影响页面打开速度问题

热门文章

  1. 网络损伤仪WANsim的队列深度功能
  2. git教程和命令集合
  3. ODOO14 ---系统启动方式
  4. python读取数据写入excel的四种操作
  5. jquery 中 live() 对于js的需求版本导致不可用解决办法
  6. 填坑-关于IIC通讯
  7. 大数据学习(12)—— Hive Server2服务
  8. 测试开发【提测平台】分享3-正式开发产品需求&项目初始化
  9. SQL Server截取字符串(经纬度)
  10. 2020年度钻石C++C学习笔记(1)《博学谷》