作者介绍:飞你莫属
原文链接:openGauss内存引擎WAL实现
1. 简介
WAL(Write Ahead Logging)是业界通用的保证数据durability的方法,它的基本思想是:数据更新(表数据或者索引数据等的更新)只能在这些更新被写入日志文件并且flush之后才能完成。openGauss内存引擎MOT(Memory Optimized Table)也不例外。本文将从以下几个方面分析MOT WAL的实现:
- WAL整体架构
- 事务操作记录
- RedoLogBuffer
- RedoLogHandler
- XLog
2. 整体架构
MOT WAL的整体架构如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6RMH8l6x-1611141466966)(0.png)]](https://i-blog.csdnimg.cn/blog_migrate/7bfbb9c33ea5a17dbf198370b2fe9a63.png)
事务记录WAL日志的过程如下:
- 组装生成事务相关的操作记录
- 将事务相关的操作记录写入基于内存的RedoLogBuffer
- 当RedoLogBuffer写满或者事务没有更多的日志记录要写入RedoLogBuffer的时候,就会将该RedoLogBuffer提交给RedoLogHandler
- RedoLogHandler将日志记录提交给XLog
- 在XLog中先写WAL Log Buffer
- 在合适时机,将WAL Log Buffer中的数据写入WAL segment文件
3. 事务操作记录
MOT写入WAL的是redo log,其格式如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NPu6tt5O-1611141466969)(1.png)]](https://i-blog.csdnimg.cn/blog_migrate/a9e6ea4cff17dc555f4eb153c2d40ce6.png)
redo log主要由3部分组成:
- DDL操作日志区:当前事务中所有DDL相关的操作(如CreateTable,DropTable,CreateIndex,DropIndex)的日志记录保存在这里
- DML操作日志区:当前事务中所有DDL相关的操作(如Insert,update,delete)的日志记录保存在这里
- EndBlock:标记当前事务日志记录部分结束或者全部结束
对于不同的DDL操作(如CreateTable,DropTable,CreateIndex,DropIndex)或者DML操作(如Insert,update,delete)的操作记录,其格式不尽相同,下面会逐一讲述。
EndBlock包括2种,分别是用于标记当前事务日志记录部分结束的PartialRedoTx记录和用于标记当前事务日志记录全部结束的CommitTx记录。
3.1 DDL操作日志记录
CreateTable日志记录

DropTable日志记录

CreateIndex日志记录

本文深入探讨了openGauss内存引擎MOT的WAL(Write-Ahead Logging)实现,包括WAL的整体架构、事务操作记录、RedoLogBuffer、RedoLogHandler和XLog的详细流程。WAL确保数据持久性,事务日志通过RedoLogBuffer先写入内存,然后由RedoLogHandler提交给XLog,最终写入WALsegment文件。文章还介绍了不同类型的DDL和DML操作日志记录格式,以及不同模式的RedoLogHandler的工作原理。
最低0.47元/天 解锁文章
654

被折叠的 条评论
为什么被折叠?



