HbaseWAL
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上。其他服务器可以打开日志文件然后回放这些修改,恢复操作并不在这些崩溃的物理服务器上进行。
HbaseWAL的更多相关文章
- hbase master一直报启动不起来问题(region空洞和region卡在spilt)
数据不重要或者一直卡着的情况下,可以切换hdfs用户到hbase的wal目录下对spilting的数据进行重命名.具体步骤如下 1.关闭hbase集群 2.切换hdfs用户 3.到hbasewal目录 ...
随机推荐
- bash对一个目录中文件名的遍历
for var in * 对当前目录中文件名的遍历 for var in /xx/xx/* 对绝对路径目录的遍历 ${var##*/} 变量扩展取文件名的基名 $var =~ ^[0-9] ...
- vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
前言: 此事例是在vue组件中,使用canvas实现倒计时动画的效果.其实,实现效果的逻辑跟vue没有关系,只要读懂canvas如何实现效果的这部分逻辑就可以了 canvas动画的原理:利用定时器,给 ...
- LinuxMint 19/Ubuntu 19.10重置开始菜单以及任务栏
====================== 问题:任务栏以及开始菜单弄不见了 解决方法: 快捷键打开终端,输入重置命令: dconf reset -f /
- 第九篇 -- cpu的学习
CPU的核数关系: 总核数 = 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 Linux中查看CPU数: # 查看物理CPU个数 ...
- java构造器级简单内存分析
java构造器的使用(基础篇) 构造方法也叫构造器,是创建对象时执行的特殊方法,一般用于初始化新对象的属性. 基本定义语法: 访问控制符 构造方法名([参数列表]){ 方法体 } 注:"访问 ...
- ClickHouse入门笔记
ClickHouse笔记 目录 ClickHouse笔记 第 1 章 ClickHouse 入门 列式储存的好处: 第 2 章 ClickHouse 的安装 第 3 章 数据类型 整型 浮点型 布尔型 ...
- SimpleDateFormat类的线程安全问题和解决方案
摘要:我们就一起看下在高并发下SimpleDateFormat类为何会出现安全问题,以及如何解决SimpleDateFormat类的安全问题. 本文分享自华为云社区<SimpleDateForm ...
- 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了
今天收到运营同学的一个 SQL,有点复杂,尤其是这个 SQL explain 都很长时间执行不出来,于是我们后台团队帮忙解决这个 SQL 问题,却正好发现了一个隐藏很深的线上问题. select a. ...
- 手动实现instanceof函数
instanceof 功能 a instanceof b 官方解释为检查构造函数b的prototype 有没有出现在a的原型链上.比如: function A() { } function B() { ...
- JVM 常用监控工具
概述 给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段. 这里说的数据包括但不限于异常堆栈.虚拟机运行日志.垃圾收集器日志.线程快照(threaddump/ja ...