Write-Ahead Log(WAL)的工作原理
前言
在存储系统的运行过程中,每时每刻都发生着数据的更新,背后意味着诸如创建,删除,修改文件等数据的操作。抛开物理文件数据的改变,对于中心控制节点而言,这些都会涉及到元数据的更新操作。而为了保持系统元数据和物理数据间的状态一致性,系统所有的数据操作对应的元数据变更都需要持久化到元数据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)的工作原理相关推荐
- mysql数据写入磁盘的原理_WAL(Write Ahead Log)机制解析
WAL即 Write Ahead Log,WAL的主要意思是说在将元数据的变更操作写入磁盘之前,先预先写入到一个log文件中.为什么要先写日志文件呢,我们一步一步的来探索. 基础数据了解 首先,我们需 ...
- 预写式日志 - postgresql之WAL(Write Ahead Log)
oracle中存在重做日志文件(redo log),其作用是保证数据的一致性和事务的完整性,防止在系统崩溃时最近的事务无法恢复.在postgresql中引入了WAL(write ahead log), ...
- oracle查找/启动/关闭 archive log以及工作原理
oracle如何查看archive log开启还是关闭 SQL> archive log list Database log mode Archive Mode Automatic archiv ...
- hbase shell查询表中某字段不为空的数据量_HBase工作原理
HBASE原理 一.原理 1.物理存储 1.hregion hbase表中的数据按照行键的字典顺序排序,hbase表中的数据按照行的的方向切分为多个region. 最开始只有一个region随着数据量 ...
- 浅谈 git 底层工作原理
浅谈 git 底层工作原理 系统复习到这里也快差不多了,大概就剩下两三个 sections,这里学习一下 git 的 hashing 和对象. 当然,跳过问题也不大. config 文件 这里还是会用 ...
- java的工作原理你知道吗_每天用Mybatis,但是Mybatis的工作原理你真的知道吗?
近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件:SqlSession Executor Stat ...
- MyBatis 的工作原理,你了解过吗?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:cnblogs.com/scuury/p/10371 ...
- 面试官:你分析过mybatis工作原理吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样 ...
- Mybatis的工作原理,你了解过吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:cnblogs.com/scuury/p/10371246. ...
最新文章
- 【cocos2d-x】Lua中的table函数库
- RxJava中常见的几种Subject
- 浅谈 Kubernetes Scheduling-Framework 插件的实现
- 实现线段切割法_切割晶圆及玻璃产品的现代技术与设备
- mac环境下配置gradle\maven
- 【Linux】Linux 生成证书 keytool 命令找不到
- 使用dataadapter和dataset更新数据库
- 拓端tecdat|Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load(file, DLLpath = DLLpath,
- 吴裕雄--天生自然C语言开发:作用域规则
- oracle in table类型,Oracle Built-in Data Types(Oracle内置数据类型)
- 拉普拉斯方程的解matlab,急求用matlab编写解拉普拉斯方程的程序
- linux opendir路径_Linux C - opendir 和 readdir 和 closedir - 目录文件打开
- hs8346v5联通 说明书_中兴Memo V5S说明书
- Maven的安装和环境变量配置
- 【Ubuntu 20.04 LTS】设置笔记本合并盖子不休眠
- 企业如何搭建并运营好积分商城?
- Promise晋级—完全吃透
- java生成二维码,全过程,不要积分
- 心理测量学信度计算机试题,心理测量学 第三章 信度.doc
- 用CBF做DOA原理与MATLAB实例
热门文章
- Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering论文解读( and code)
- Weakly-Supervised Physically Unconstrained Gaze Estimation论文翻译
- 传说之下打开debug模式超超超超超超超超详细方法
- 木子-前端-谷歌页面等调试时总是报No Found 404 错误(编码格式不识别问题导致的)
- 28 关于 Finalizer
- 计算机位的英语,计算机中位的英文名字为()
- 讲讲如何将图片格式转化成base64格式的
- python简单代码画皮卡丘-利用Python绘制萌萌哒的皮卡丘
- win10的C盘满了清理方法
- 小米air2se耳机只有一边有声音怎么办_小米耳机只有一边有声音,这问题怎么解决...