乐趣区

关于后端:MySQL双写缓冲区Doublewrite-Buffer

本文已收录至 Github,举荐浏览 👉 Java 随想录
微信公众号:Java 随想录

摘要

InnoDB 是 MySQL 中一种罕用的事务性存储引擎,它具备很多优良的个性。其中,Doublewrite Buffer 是 InnoDB 的一个重要个性之一,本文将介绍 Doublewrite Buffer 的原理和利用。

为什么须要 Doublewrite Buffer

咱们常见的服务器个别都是 Linux 操作系统,Linux 文件系统页(OS Page)的大小默认是 4KB。而 MySQL 的页(Page)大小默认是 16KB。

能够应用如下命令查看 MySQL 的 Page 大小:

SHOW VARIABLES LIKE 'innodb_page_size';

个别状况下,其余程序因为须要跟操作系统交互,它们的页(Page)都会大于等于操作系统的页大小,为整数倍。比方,Oracle 的 Page 大小为 8KB。

MySQL 程序是跑在 Linux 操作系统上的,须要跟操作系统交互,所以 MySQL 中一页数据刷到磁盘,要写 4 个文件系统里的页。

须要留神的是,这个操作并非原子操作,比方我操作系统写到第二个页的时候,Linux 机器断电了,这时候就会呈现问题了。造成”页数据损坏“。并且这种”页数据损坏“靠 redo 日志是无奈修复的

重做日志中记录的是对页的物理操作,而不是页面的全量记录,而如果产生 partial page write(局部页写入)问题时,呈现问题的是未修改过的数据,此时重做日志 (Redo Log) 无能为力。写 doublewrite buffer 胜利了,这个问题就不必放心了

Doublewrite Buffer 的呈现就是为了解决下面的这种状况,尽管名字带了 Buffer,但实际上 Doublewrite Buffer 是 内存 + 磁盘 的构造。

Doublewrite Buffer 是一种非凡文件 flush 技术,带给 InnoDB 存储引擎的是数据页的可靠性。它的作用是,在把页写到数据文件之前,InnoDB 先把它们写到一个叫 doublewrite buffer(双写缓冲区)的共享表空间内,在写 doublewrite buffer 实现后,InnoDB 才会把页写到数据文件的适当的地位。如果在写页的过程中发生意外解体,InnoDB 在稍后的复原过程中在 doublewrite buffer 中找到完整的 page 正本用于复原。

Doublewrite Buffer 原理

如上图所示,当有页数据要刷盘时:

  1. 页数据先通过 memcpy 函数拷贝至内存中的 Doublewrite Buffer 中;
  2. Doublewrite Buffer 的内存里的数据页,会 fsync 刷到 Doublewrite Buffer 的磁盘上,分两次写入磁盘共享表空间中(间断存储,程序写,性能很高),每次写 1MB;
  3. Doublewrite Buffer 的内存里的数据页,再刷到数据磁盘存储.ibd 文件上(离散写);

Doublewrite Buffer 内存构造由 128 个页(Page)形成,大小是 2MB。

Doublewrite Buffer 磁盘构造在零碎表空间上是 128 个页(2 个区,extend1 和 extend2),大小是 2MB。

如果操作系统在将页写入磁盘的过程中产生了解体,在复原过程中,InnoDB 存储引擎能够从共享表空间中的 Double write 中找到该页的一个正本,将其复制到表空间文件,再利用重做日志

MySQL 会查看 double writer 的数据的完整性,如果不残缺间接抛弃 double write buffer 内容,从新执行那条 redo log,如果 double write buffer 的数据是残缺的,用 double writer buffer 的数据更新该数据页,跳过该 redo log。

所以在失常的状况下,MySQL 写数据页时,会写两遍到磁盘上,第一遍是写到 doublewrite buffer,第二遍是写到真正的数据文件中,这就是“Doublewrite”的由来。

在数据库异样敞开的状况下启动时,都会做数据库复原(redo)操作,复原的过程中,数据库都会查看页面是不是非法(校验等等),如果发现一个页面校验后果不统一,则此时会用到双写这个性能。

咱们能够通过如下命令来监控 Doublewrite Buffer 工作负载:

mysql> show global status like '%dblwr%';

Doublewrite Buffer 相干参数

  • innodb_doublewrite:Doublewrite Buffer 是否启用开关,默认是开启状态,InnoDB 将所有数据存储两次,首先到双写缓冲区,而后到理论数据文件。
  • Innodb_dblwr_pages_written:记录写入到 DWB 中的页数量。
  • Innodb_dblwr_writes:记录 DWB 写操作的次数。

总结

InnoDB Doublewrite Buffer 是 InnoDB 的一个重要个性,用于保障 MySQL 数据的可靠性和一致性。它的实现原理是通过将要写入磁盘的数据先写入到 Doublewrite Buffer 中的内存缓存区域,而后再写入到磁盘的两个不同地位,来防止因为磁盘损坏等因素导致数据失落或不统一的问题。Doublewrite Buffer 对于保障 MySQL 数据的安全性和一致性具备重要意义。


本篇文章就到这里,感激浏览,如果本篇博客有任何谬误和倡议,欢送给我留言斧正。文章继续更新,能够关注公众号第一工夫浏览。

退出移动版