WAL(Write Ahead Log)预写日志,是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。

在计算机科学中,「预写式日志」(Write-ahead logging,缩写 WAL)是关系数据库系统中用于提供原子性和持久性(ACID 属性中的两个)的一系列技术。在使用 WAL 的系统中,所有的修改在提交之前都要先写入 log 文件中。

数据库的最大性能挑战就是磁盘的读写,其实所有方案最终总结出来就三种:「随机读写改顺序读写」「缓冲单条读写改批量读写」「单线程读写改并发读写」。WAL 其实也是这两种思路的一种实现,一方面 WAL 中记录事务的更新内容,通过 WAL 将随机的脏页写入变成顺序的日志刷盘,另一方面,WAL 通过 buffer 的方式改单条磁盘刷入为缓冲批量刷盘,再者从 WAL 数据到最终数据的同步过程中可以采用并发同步的方式。

checkpoint:使用 WAL 的数据库系统不会再每新增一条 WAL 日志就将其刷入数据库文件中,一般积累一定的量然后批量写入,通常使用「页」为单位,这是磁盘的写入单位。 同步 WAL 文件和数据库文件的行为被称为 checkpoint(检查点),一般在 WAL 文件积累到一定页数修改的时候;当然,有些系统也可以手动执行 checkpoint。执行 checkpoint 之后,WAL 文件可以被清空,这样可以保证 WAL 文件不会因为太大而性能下降。

具体实现

常见的数据库一般都会用到 WAL 机制,只是不同的系统说法和实现可能有所差异。mysql、sqlite、postgresql、etcd、hbase、zookeeper、elasticsearch 等等都有自己的实现。

mysql

mysql 的 WAL,大家可能都比较熟悉。mysql 通过 redo、undo 日志实现 WAL。redo log 称为重做日志,每当有操作时,在数据变更之前将操作写入 redo log,这样当发生掉电之类的情况时系统可以在重启后继续操作。undo log 称为撤销日志,当一些变更执行到一半无法完成时,可以根据撤销日志恢复到变更之间的状态。mysql 中用 redo log 来在系统 Crash 重启之类的情况时修复数据(事务的持久性),而 undo log 来保证事务的原子性。

zookeeper

和大多数分布式系统一样,ZooKeeper 也有 WAL(Write-Ahead-Log),对于每一个更新操作,ZooKeeper 都会先写 WAL, 然后再对内存中的数据做更新,然后向 Client 通知更新结果。另外,ZooKeeper 还会定期将内存中的目录树进行 Snapshot,落地到磁盘上。这么做的主要目的,一当然是数据的持久化,二是加快重启之后的恢复速度,如果全部通过 Replay WAL 的形式恢复的话,会比较慢。

elasticsearch

如果没有用 fsync 把数据从文件系统缓存刷(flush)到硬盘,elasticsearch 不能保证数据在断电甚至是程序正常退出之后依然存在。为了保证可靠性,需要确保数据变化被持久化到磁盘。

在动态更新索引时,elasticsearch 说一次完整的提交会将段刷到磁盘,并写入一个包含所有段列表的提交点。Elasticsearch 在启动或重新打开一个索引的过程中使用这个提交点来判断哪些段隶属于当前分片。

即使通过每秒刷新(refresh)实现了近实时搜索,elasticsearch 仍然需要经常进行完整提交来确保能从失败中恢复。但在两次提交之间发生变化的文档怎么办?

Elasticsearch 增加了一个 translog ,或者叫事务日志,在每一次对 Elasticsearch 进行操作时均进行了日志记录。

etcd

用过 etcd 的同学可能会发现,etcd 的数据目录下有两个子目录walsnap。它们的作用就是实现 WAL 机制用的。

wal: 存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在 etcd 中,所有数据的修改在提交前,都要先写入到 WAL 中。

snap: 存放快照数据,etcd 防止 WAL 文件过多而设置的快照,存储 etcd 数据状态。

WAL 机制使得 etcd 具备了以下两个功能:

  • 故障快速恢复: 当你的数据遭到破坏时,就可以通过执行所有 WAL 中记录的修改操作,快速从最原始的数据恢复到数据损坏前的状态。
  • 数据回滚(undo)/重做(redo):因为所有的修改操作都被记录在 WAL 中,需要回滚或重做,只需要方向或正向执行日志中的操作即可

hbase

hbase 实现 WAL 的方法将 HLog,hbase 的 RegionServer 会将数据保存在内存中(MemStore),直到满足一定条件,将其 flush 到磁盘上。这样可以避免创建很多小文件。内存存储是不稳定的,HBase 也是使用 WAL 来解决这个问题:每次更新操作都会写日志,并且写日志和更新操作在一个事务中。

mysql(关系数据库):
写入请求的过程:
     1、数据先写入wal,数据同时写入cache(内存表);
     2、定时把wal数据刷盘
     3、定时把cache(内存表)的数据刷盘(磁盘表)

InfluxDB(时序数据库):

写入请求的过程:
     1、数据先写入wal,数据同时写入cache(内存表);
     2、定时把wal数据刷盘
     3、定时把cache(内存表)的数据刷盘(磁盘表)

https://zhuanlan.zhihu.com/p/137512843

架构基础 - WAL在各种数据系统的应用相关推荐

  1. spark on yarn 完全分布式_Spark编程笔记(1)-架构基础与运行原理

    引言 根据IBM前首席执行官郭士纳的观点,IT领域每隔十五年就会迎来一 次重大变革 .当前我们正处于第三次信息浪潮(2010年前后),物联网.云计算和大数据技术突飞猛进. 信息爆炸是我们当前所需要解决 ...

  2. 微服务架构基础之Service Mesh

    ServiceMesh(服务网格) 概念在社区里头非常火,有人提出 2018 年是 ServiceMesh 年,还有人提出 ServiceMesh 是下一代的微服务架构基础. 那么到底什么是 Serv ...

  3. 下一代微服务架构基础:ServiceMesh?

    最近,ServiceMesh(服务网格) 概念在社区里头非常火,有人提出 2018 年是 ServiceMesh 年,还有人提出 ServiceMesh 是下一代的微服务架构基础.作为架构师,如果你现 ...

  4. SQL Server内存架构基础

    SQL Server内存架构基础 翻译自: https://mssqlwiki.com/sqlwiki/sql-performance/basics-of-sql-server-memory-arch ...

  5. IT:后端进阶技术路线图(初级→中级→高级)、后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介、技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略

    IT:后端进阶技术路线图(初级→中级→高级).后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介.技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略 目录 后端 ...

  6. 图形学进阶——移动端TB(D)R架构基础

    移动端TB(D)R架构基础 百人计划学习链接:[技术美术百人计划]图形 3.7 移动端TB(D)R架构基础 一.当前移动端的设备概况 1. 移动端CPU占比 2. 移动端GPU占比 3. 各类电子设备 ...

  7. Classic AutoSAR架构基础入门(CP)

    文章目录 1.AutoSAR标准规范 1.AutoSAR标准规范 AUTOSAR主要分为三大层级:应用层(对应ASW).RTE和基础软件BSW. 主要模块如下图所示: 从下至上 Micorocontr ...

  8. 微服务架构 基础(三)

    微服务架构 基础(三) 持续更新- 继续前面的基础二工程进行扩展 服务降级.服务熔断和服务限流 基本概念理解 服务雪崩 多个服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又 ...

  9. 六种常见系统架构 —— 基础篇

    六种常见系统架构 -- 基础篇 常见的几种系统架构设计,本文先讲前三个: 1. 单库单应用架构:最简单的,可能大家都见过 2. 内容分发架构:目前用的比较多 3. 读写分离架构:对于大并发的查询.业务 ...

最新文章

  1. javaScript小问题,托拽元素,获得当前鼠标的坐标
  2. 从本地的win传文件到本地的linux上,pscp.exe实现本地windows下的文件下载(传输)到linux上...
  3. 判断大小简单算法_优化 | 贪婪算法有多好?Submodularity告诉你
  4. OpenGL SSAO屏幕空间环境光遮蔽的实例
  5. 前端学习(588):console面板简介与交互式命令
  6. Windows下安装配置SubVersion的简明步骤
  7. caffe的运行create_data.sh前对VOC2007图片格式的更改
  8. ubuntu16.04安装cuda11.3、cudnn8.2.1、tensorrt8.0.3.4全过程
  9. R语言文本分析|利用jiebaR进行分词与词频统计
  10. 推荐一个开源好用的ER图、流程图作图软件-draw.io
  11. 【Tensorflow2.0】8、tensorflow2.0_hdf5_savedmodel_pb模型转换[2]
  12. 启动计算机键盘没反应,为什么键盘没反应了 键盘没反应原因分析及解决方法...
  13. 宏基微型计算机机箱怎么打开,机箱也智能 自己动手打造自动温控机箱
  14. php 心跳包检测,redis的对端心跳检测
  15. KindEditor编辑器上传图片超过限制
  16. unitTest单元测试
  17. HDFS高可用配置及其高可用集群搭建
  18. Motion-based Detection and Tracking in 3D LiDAR Scans
  19. java根据url下载文件出现301 Moved Permanently
  20. 使用bootdo框架添加登录验证码

热门文章

  1. 机器人的编程语言是什么语言
  2. 群晖NAS实现Video Station显示视频封面
  3. redhat linux之bash 编程
  4. zoj 3898 Stean 高等数学 数值积分
  5. android中的动画全解析
  6. 量子计算机如何预知未来,刘慈欣《镜子》中量子计算机成真?科学家计划用数学预测宇宙未来...
  7. Tailwind Border
  8. linux装入归档文件时,装入归档文件时发生了错误!!怎么解决?
  9. 神话造词——了解单词的起源及演变如何能帮我们更好地记单词
  10. 更改zabbix数据库mandatory