本文已收录至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原理
如上图所示,当有页数据要刷盘时:
- 页数据先通过memcpy函数拷贝至内存中的Doublewrite Buffer中;
- Doublewrite Buffer的内存里的数据页,会fsync刷到Doublewrite Buffer的磁盘上,分两次写入磁盘共享表空间中(间断存储,程序写,性能很高),每次写1MB;
- 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数据的安全性和一致性具备重要意义。
本篇文章就到这里,感激浏览,如果本篇博客有任何谬误和倡议,欢送给我留言斧正。文章继续更新,能够关注公众号第一工夫浏览。