码哥跳动
《Redis 高手心法》作者,后端架构师,精通Java与Go,宗旨是拥抱技术和对象,面向人民币编程。
239篇原创内容
公众号
大家好,我是《Redis 高手心法》作者码哥,菜刀砍电线,一路火花带闪电的靓仔。
InnoDB 是 MySQL 中一种常用的事务性存储引擎,它具有很多优秀的特性。其中,Doublewrite Buffer 是 InnoDB 的一个重要特性之一。
本文将介绍Doublewrite Buffer的原理和应用。
InnoDB 页大小为 16KB,而操作系统(如 Linux)页大小为 4KB,单次写入需拆分 4 个 OS 页。
可以使用如下命令查看 MySQL 的 Page 大小:
SHOW VARIABLES LIKE 'innodb_page_size';
MySQL 程序是跑在 Linux 操作系统上的,需要跟操作系统交互,所以 MySQL 中一页数据刷到磁盘,要写 4 个文件系统里的页。
需要注意的是,这个操作并非原子操作,比如我操作系统写到第二个页的时候,Linux 机器断电了,这时候就会出现问题了。
造成”页数据损坏“。并且这种”页数据损坏“靠 redo 日志是无法修复的。
Redo log 中记录的是对页的物理操作,而不是页面的全量记录,而如果发生 partial page write(部分页写入)问题时,出现问题的是未修改过的数据,此时重做日志(Redo Log)无能为力。
Doublewrite Buffer 的出现就是为了解决上面的这种情况,虽然名字带了 Buffer,但实际上 Doublewrite Buffer 是内存+磁盘的结构。
Doublewrite Buffer 是一种特殊文件 flush 技术,带给 InnoDB 存储引擎的是数据页的可靠性。
它的作用是,在把页写到数据文件之前,InnoDB 先把它们写到一个叫 doublewrite buffer(双写缓冲区)的共享表空间内,在写 doublewrite buffer 完成后,InnoDB 才会把页写到数据文件的适当的位置。
如果在写页的过程中发生意外崩溃,InnoDB 在稍后的恢复过程中在 doublewrite buffer 中找到完好的 page 副本用于恢复。
在这里先介绍下我的《Java 面试高手心法 58 讲》专栏,持续更新中......内容涵盖 Java 基础、Java 高级进阶、Redis、MySQL、消息中间件、微服务架构设计等面试必考点、面试高频点。
原价 128,现在早鸟优惠 19 元,每满 100 人涨价一次,抓住机会冲吧!
剧情正片继续......
Doublewrite Buffer 采用 内存+磁盘双层结构,关键组件如下:
内存结构
memcpy
拷贝至内存 Doublewrite Buffer。磁盘结构
ibdata
),分为 2 个区(extent1/extent2),共 2MB。工作流程如下图所示:
如上图所示,当有数据修改且页数据要刷盘时:
时序图如下:
崩溃恢复
如果第三步前,发生了崩溃,可以通过第一步记录的 Redo log 来恢复。
如果第三步完成后发生了崩溃, InnoDB 存储引擎可以从共享表空间中的 Double write 中找到该页的一个副本,将其复制到独立表空间文件,再应用 Redo log 恢复。
在正常的情况下,MySQL 写数据页时,会写两遍到磁盘上,第一遍是写到 doublewrite buffer,第二遍是写到真正的数据文件中,这就是“Doublewrite”的由来。
Doublewrite Buffer 通过 两次写 机制,在内存和磁盘间构建冗余副本,成为 InnoDB 保障数据完整性的基石。
其架构设计平衡了性能与可靠性,尤其在高并发或异常宕机场景下表现突出。
介绍下自己,我是《Redis 高手心法》、公众号「码哥跳动」、InfoQ 签约作者;曾在平安银行担任过架构师,目前在一家做国际旅游的港企 klook 担任技术专家。
介绍下我的新书,点击查看详细介绍 ->《Redis 高手心法》!
本书基于 Redis 7.0 版本,将复杂的概念与实际案例相结合,以简洁、诙谐、幽默的方式揭示了Redis的精髓。
本书完美契合你对一个具体技术学习的期望: Redis 核心原理、关键细节、应用场景以及如何取舍......
从 Redis 的第一人称视角出发,拟人故事化方式和诙谐幽默的言语与各路“神仙”对话,配合 158 张图,由浅入深循序渐进的讲解 Redis 的数据结构实现原理、开发技巧、运维技术和高阶使用,让人轻松愉快地学习。
如下图所示,上市后得到了许多读者的较好口碑评价,而且上过京东榜单!其中还有一些业界大佬、公司 CTO 的推荐。
点击下方卡片即可购买