(精华)Mysql之双写DoubleWrite__流程图_架构图_系统图_数据库
2024-11-03 14:19:16 23 举报
Mysql之双写DoubleWrite
作者其他创作
大纲/内容
双写缓存区Doublewrite buffer
文件3.ibd(4K)
文件2.ibd(4K)
16K
doublewrite(1M)
磁盘
Redo Log
顺序写
文件4.ibd(4K)
Log Buffer
第三步,随机写
为什么要引入DoubleWrite?在脏页数据刷盘时,由于缓存池里面的数据页是16K,而磁盘上面的数据页是4K,意味着要写到4页中去,而这个操作并不是原子的,会存在写入部分页后,系统宕机,数据丢失的情况,即Partial Page Write(部分页写入)。为什么Redo Log无法解决这个问题?redo日志记录的内容包括 存储表空间ID、页号、偏移量和需要更新的值,类似账本,如果部分页数据已经写入了,再使用redo来恢复,可能会出现已经写入的部分页再次被修改的情况。注:redo适合脏页数据还未刷入磁盘时就丢失的情况DoubleWrite为了解决部分页写入的问题,innodb引入了DoubleWrite,包括两个部分。- 内存结构:Doublewrite Buffer内存结构由128个页(Page)构成,大小是2MB。- 磁盘结构:Doublewrite Buffer磁盘结构在系统表空间上是128个页(2个区,extend1和extend2),大小是2MB。DoubleWrite写入过程?当脏页数据需要刷盘时(到这一步时,前面已经写入了redo log了),1、数据页先通过memcpy函数拷贝至内存中的Doublewrite Buffer中。2、Doublewrite Buffer的内存里的数据页,会fsync刷到Doublewrite Buffer的磁盘上,分两次写入磁盘共享表空间中(连续存储,顺序写,性能很高),每次写1MB。3、Doublewrite Buffer的内存里的数据页,再刷到数据磁盘存储.ibd文件上(随机写)注意:1、如第二步前出现问题,可以直接通过redo来恢复,因为数据只在内存中2、如第二步后出现问题,可先从双写缓冲文件中拷贝数据到.idb,然后通过redo来恢复
数据页
ib_logfile0
ib_logfile1
缓冲池 innodb buffer pool
2M
第一步内存拷贝
文件1.ibd(4K)
第二步,顺序写
崩溃恢复第一步
内存拷贝
崩溃恢复第二步
内存
双写缓冲文件
Innodb DoubleWrite 双写
数据页(脏页)
0 条评论
下一页