前言


在存储系统的运行过程中,每时每刻都发生着数据的更新,背后意味着诸如创建,删除,修改文件等数据的操作。抛开物理文件数据的改变,对于中心控制节点而言,这些都会涉及到元数据的更新操作。而为了保持系统元数据和物理数据间的状态一致性,系统所有的数据操作对应的元数据变更都需要持久化到元数据db内,但其实这里有一个性能问题,我们的每次变更如果都要实时同步到外部db内,是否意味着高频的io操作?是否有延时写入的手段呢?本文将要阐述的预写式日志Write Ahead Log(WAL),正是对此的优化。

Write Ahead Log概述


Write Ahead Log简称WAL,在分布式存储系统中的元数据更新中应用得十分广泛。WAL的主要意思是说在将元数据的变更操作写入到持久稳定的db之前,先预先写入到一个log中,然后再由另外的操作将log apply到外部的持久db里去。这种模式会减少掉每次的db写入操作,尤其当系统要处理大量的transaction操作的时候,WAL的方式相比较于实时同步db的方式有着更高的效率。

WAL还有一点很重要的帮助是可以在disaster recovery过程中起到状态恢复的作用,系统在load完元数据db后,再把未来得及提交的WAL apply进来,就能恢复成和之前最终一致的状态。

WAL的执行机理


上面只介绍了WAL的概述内容,本小节我们来深入了解WAL的内部执行细节。

首先我们要搞清楚一点的是,WAL不记录元数据的本身,而是变更的record。那么何为”变更的record“?一个删除操作记录,一个添加记录,至于每个记录会包含有什么信息呢,大家可以参考audit log的内容属性。不过WAL的log格式和audit log还是有所区别的。

追本溯源,对于WAL来说,它是被谁写入的呢?答案是WAL buffer,当这个buffer满了的时候或者人工触发flush动作时,它就会将transaction数据写出到WAL的log内。当然,系统在每次完成一个操作时,同时会将改动应用到memory和WAL buffer内,然后自己再控制buffer flush出去的逻辑。

当老的WAL已经被apply进元数据db之后,我们会用更新commitId来表明当前最新的transaction,理论上来说低于这个commitId的WAL已经可以被清除purge出去了。这个过程我们可以理解为checkpoint过程,当前db+WAL变更=新的db。

上述WAL细节过程如下图:

HDFS的WAL原理应用


HDFS作为一个成熟的分布式系统,在其内部也有WAL模型的应用。这里的WAL则是Editlog,而对应的Stable DB则是Standby NN的fsimage。HDFS的Editlog用了双缓冲模式来加大transaction的throughput。整个过程的数据流操作是从Active NN到Editlog到Standby NN。当Standby NN准实时的读取完editlog的信息后,定期checkpoint出新的fsimage文件后,再sync到Active NN上。按照时间顺序和commit tx id,老的editlog会被purge掉。HDFS的WAL模型如下图所示(步骤如线条中数字显示):

WAL apply的控制


在系统做disaster recovery中,对于WAL的应用过程,有时可能会出现应用出差的情况,包括一些局部WAL记录格式写异常的情况。这个时候用户可以选择是否中断WAL的apply过程或者是忽略异常,来完成尽可能的数据状态恢复。这些都是WAL内部的细节控制。

以上就是本文主要阐述的关于WAL的内容了。

引用


[1].https://pgadminedb.readthedocs.io/en/latest/module_02/

Write-Ahead Log(WAL)的工作原理相关推荐

  1. mysql数据写入磁盘的原理_WAL(Write Ahead Log)机制解析

    WAL即 Write Ahead Log,WAL的主要意思是说在将元数据的变更操作写入磁盘之前,先预先写入到一个log文件中.为什么要先写日志文件呢,我们一步一步的来探索. 基础数据了解 首先,我们需 ...

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

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

  3. oracle查找/启动/关闭 archive log以及工作原理

    oracle如何查看archive log开启还是关闭 SQL> archive log list Database log mode Archive Mode Automatic archiv ...

  4. hbase shell查询表中某字段不为空的数据量_HBase工作原理

    HBASE原理 一.原理 1.物理存储 1.hregion hbase表中的数据按照行键的字典顺序排序,hbase表中的数据按照行的的方向切分为多个region. 最开始只有一个region随着数据量 ...

  5. 浅谈 git 底层工作原理

    浅谈 git 底层工作原理 系统复习到这里也快差不多了,大概就剩下两三个 sections,这里学习一下 git 的 hashing 和对象. 当然,跳过问题也不大. config 文件 这里还是会用 ...

  6. java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...

  7. MyBatis 的工作原理,你了解过吗?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:cnblogs.com/scuury/p/10371 ...

  8. 面试官:你分析过mybatis工作原理吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样 ...

  9. Mybatis的工作原理,你了解过吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:cnblogs.com/scuury/p/10371246. ...

最新文章

  1. 【cocos2d-x】Lua中的table函数库
  2. RxJava中常见的几种Subject
  3. 浅谈 Kubernetes Scheduling-Framework 插件的实现
  4. 实现线段切割法_切割晶圆及玻璃产品的现代技术与设备
  5. mac环境下配置gradle\maven
  6. 【Linux】Linux 生成证书 keytool 命令找不到
  7. 使用dataadapter和dataset更新数据库
  8. 拓端tecdat|Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load(file, DLLpath = DLLpath,
  9. 吴裕雄--天生自然C语言开发:作用域规则
  10. oracle in table类型,Oracle Built-in Data Types(Oracle内置数据类型)
  11. 拉普拉斯方程的解matlab,急求用matlab编写解拉普拉斯方程的程序
  12. linux opendir路径_Linux C - opendir 和 readdir 和 closedir - 目录文件打开
  13. hs8346v5联通 说明书_中兴Memo V5S说明书
  14. Maven的安装和环境变量配置
  15. 【Ubuntu 20.04 LTS】设置笔记本合并盖子不休眠
  16. 企业如何搭建并运营好积分商城?
  17. Promise晋级—完全吃透
  18. java生成二维码,全过程,不要积分
  19. 心理测量学信度计算机试题,心理测量学 第三章 信度.doc
  20. 用CBF做DOA原理与MATLAB实例

热门文章

  1. Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering论文解读( and code)
  2. Weakly-Supervised Physically Unconstrained Gaze Estimation论文翻译
  3. 传说之下打开debug模式超超超超超超超超详细方法
  4. 木子-前端-谷歌页面等调试时总是报No Found 404 错误(编码格式不识别问题导致的)
  5. 28 关于 Finalizer
  6. 计算机位的英语,计算机中位的英文名字为()
  7. 讲讲如何将图片格式转化成base64格式的
  8. python简单代码画皮卡丘-利用Python绘制萌萌哒的皮卡丘
  9. win10的C盘满了清理方法
  10. 小米air2se耳机只有一边有声音怎么办_小米耳机只有一边有声音,这问题怎么解决...