HBase源码系列(七)WAL与日志恢复
来源:互联网 发布:太阳神三国杀源码教程 编辑:程序博客网 时间:2024/06/06 05:32
- WAL
- MultiWAL
- WAL Compression
- Disabling the WAL
- Put过程中记录WAL
- 日志恢复
WAL
Write Ahead Log (WAL)其实就是以前的HLog。在2.0之前,HBase中的WAL接口被命名为HLog。 在0.94中,HLog是WAL实施的名称。 您可能会在为这些旧版本定制的文档中找到对HLog的引用。
MultiWAL
MultiWAL允许RegionServer通过在底层HDFS实例中使用多个管道来并行写入多个WAL流,从而提高写入期间的总吞吐量。
使用原始WAL实现的RegionServers和使用MultiWAL实现的RegionServers可以分别处理任意一组WAL的恢复,因此通过滚动重启可以实现零停机配置更新。
为RegionServer配置MultiWAL,设置hbase.wal.provider 为 multiwal。
<property> <name>hbase.wal.provider</name> <value>multiwal</value></property>
修改后需要重启RegionServer才能生效。
关闭MultiWAL,就不要设置这个属性,然后重启RegionServer。
WAL Compression
WAL可以使用LRU Dictionary进行压缩,进而提升WAL复制到不同datanode节点的效率。通过设置 hbase.regionserver.wal.enablecompression
为 true,可以启用这个压缩机制(默认情况下,这个属性为false)。
Disabling the WAL
在特殊的情况下,为了提高性能,可能会关闭WAL。
HBase client 关闭WAL有下面的方式,但是在table上已经不提供关闭WAL的方式。
Mutation.writeToWAL(false)或者Mutation.setDurability(Durability.SKIP_WAL)
推荐在bulk load的时候,关闭WAL。其他情况下,都不建议关闭WAL,因为这会让你的数据处于危险之中。
Put过程中记录WAL
在服务端进行写入数据之前,会实例化WALEdit类,在日志中来记录需要写入的数据
// 4. Let the processor scan the rows, generate mutations and add waledits doProcessRowWithTimeout(processor, now, this, mutations, walEdit, timeout);
然后会将要写入的数据写入到memstore,后续会将memstore flush到HStore中做持久化。
写入memstore以后,追加日志到WAL
walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(), this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now, processor.getClusterIds(), nonceGroup, nonce);// 追加walEdit日志到wal,实际调用的是子类FSHLog的append()方法txid = this.wal .append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, getSequenceId(), true, memstoreCells);============================// 这里使用了Disruptor 并发框架FSWALEntry entry = null; long sequence = this.disruptor.getRingBuffer().next(); try { RingBufferTruck truck = this.disruptor.getRingBuffer().get(sequence); entry = new FSWALEntry(sequence, key, edits, sequenceId, inMemstore, htd, hri, memstoreCells); truck.loadPayload(entry, scope.detach()); } finally { this.disruptor.getRingBuffer().publish(sequence); }
日志追加到WAL后,又同步了事务txid。这里的代码有点看不懂了。
// 11. Sync edit logif (txid != 0) { syncOrDefer(txid, getEffectiveDurability(processor.useDurability()));}walSyncSuccessful = true;
对上面数据写入过程中记录WAL的操作做个总结:
1、首先实例化WALEdit,来记录需要写入的日志;
2、数据写入memstore后,使用Disruptor并发框架追加waledit日志到WAL,并记录事务txid;
3、同步事务txid。
日志恢复
- HBase源码系列(七)WAL与日志恢复
- HBase 预写日志 (WAL)
- HBase 预写日志 (WAL)
- HBase 预写日志 (WAL)
- HBase WAL预写日志
- HBase源码分析之WAL
- hbase 原代码分析 (11) WAL 写日志过程
- Hbase WAL线程模型源码分析
- Hbase WAL线程模型源码分析
- [翻译]HBase 架构101 –预写日志系统 (WAL)
- HBase 架构101 –预写日志系统 (WAL)
- hbase 删除部门wal日志后自我修复
- HBase WAL(Write-Ahead-Log)学习
- 预写式日志(Write-Ahead Logging (WAL))
- RMAN备份与恢复系列之redo日志文件恢复
- HBase源码系列(六)HBase存储结构与StoreFile存储格式
- HBase WAL原理学习
- HBase的WAL机制
- smarty模板引擎之变量的调用
- 计蒜课:整数转换成罗马数字
- MS SQL PHP Generator(PHP脚本自动生成软件) v17.10.1官方版下载
- IDEA搭建spark-scala的sbt编辑环境实现WorldCount练习
- java发展进程
- HBase源码系列(七)WAL与日志恢复
- 学习笔记—Optimization algorithms
- 文章标题
- java/11.11日/笔记
- Matlab中求序列的极值
- 十九大后首访收官 习近平担当“中国故事第一讲解人”
- Technical Support Site
- 堆排序
- spring 07 aop 上