架构基础 - WAL在各种数据系统的应用
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 的数据目录下有两个子目录wal
和snap
。它们的作用就是实现 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在各种数据系统的应用相关推荐
- spark on yarn 完全分布式_Spark编程笔记(1)-架构基础与运行原理
引言 根据IBM前首席执行官郭士纳的观点,IT领域每隔十五年就会迎来一 次重大变革 .当前我们正处于第三次信息浪潮(2010年前后),物联网.云计算和大数据技术突飞猛进. 信息爆炸是我们当前所需要解决 ...
- 微服务架构基础之Service Mesh
ServiceMesh(服务网格) 概念在社区里头非常火,有人提出 2018 年是 ServiceMesh 年,还有人提出 ServiceMesh 是下一代的微服务架构基础. 那么到底什么是 Serv ...
- 下一代微服务架构基础:ServiceMesh?
最近,ServiceMesh(服务网格) 概念在社区里头非常火,有人提出 2018 年是 ServiceMesh 年,还有人提出 ServiceMesh 是下一代的微服务架构基础.作为架构师,如果你现 ...
- SQL Server内存架构基础
SQL Server内存架构基础 翻译自: https://mssqlwiki.com/sqlwiki/sql-performance/basics-of-sql-server-memory-arch ...
- IT:后端进阶技术路线图(初级→中级→高级)、后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介、技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略
IT:后端进阶技术路线图(初级→中级→高级).后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介.技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略 目录 后端 ...
- 图形学进阶——移动端TB(D)R架构基础
移动端TB(D)R架构基础 百人计划学习链接:[技术美术百人计划]图形 3.7 移动端TB(D)R架构基础 一.当前移动端的设备概况 1. 移动端CPU占比 2. 移动端GPU占比 3. 各类电子设备 ...
- Classic AutoSAR架构基础入门(CP)
文章目录 1.AutoSAR标准规范 1.AutoSAR标准规范 AUTOSAR主要分为三大层级:应用层(对应ASW).RTE和基础软件BSW. 主要模块如下图所示: 从下至上 Micorocontr ...
- 微服务架构 基础(三)
微服务架构 基础(三) 持续更新- 继续前面的基础二工程进行扩展 服务降级.服务熔断和服务限流 基本概念理解 服务雪崩 多个服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又 ...
- 六种常见系统架构 —— 基础篇
六种常见系统架构 -- 基础篇 常见的几种系统架构设计,本文先讲前三个: 1. 单库单应用架构:最简单的,可能大家都见过 2. 内容分发架构:目前用的比较多 3. 读写分离架构:对于大并发的查询.业务 ...
最新文章
- DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描...
- Python面向对象程序设计之抽象工厂模式之二-一个更加pythonic的抽象工厂
- java 内置锁_深入理解java内置锁(synchronized)和显式锁(ReentrantLock)
- 帮助新手理解equals和hashCode
- yii2 html编辑器,浅析Yii2集成富文本编辑器redactor实例教程
- Trie树的C++实现
- leetcode 1037. 有效的回旋镖(Valid Boomerang)
- 如何使用数据库保存文件
- Android开发屏幕适配
- SAN和NAS、ISCSI存储有什么区别,SAN和NAS设备哪个更好?
- 物联网是什么,华为云学院带你走进物联网的前世今生
- mysql-python:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h' 非权威指南
- C#之浅析面向对象编程思想(二)
- error: Microsoft Visual C++ 9.0 is required (Unabl
- Object Detection Made Simpler by Eliminating Heuristic NMS
- 索尼机型刷机不用愁 带你玩转一键解锁
- 老男孩Python全栈9期视频完整版
- C语言 单引号 双引号问题
- 2021年低压电工考试报名及低压电工试题及解析
- 《先进PID控制 MATLAB仿真 第2版 刘金琨等编》【shallow】