(精华)Mysql之双写DoubleWrite
2024-01-11 14:05:39 20 举报
登录查看完整内容
Mysql的双写(Double Write)是一种数据持久化的机制,主要用于解决主从复制中的一致性问题。当主数据库写入数据时,会同时写入到主库和从库,保证了数据的一致性。双写机制通过在内存中维护一份数据副本,当主库写入数据时,先将数据写入到内存副本,然后再将数据写入到主库和从库。这种方式既保证了数据的实时性,又避免了由于网络延迟等原因导致的从库数据落后的问题。但是,双写机制也会增加系统的复杂性和资源消耗,因此在实际应用中需要根据具体情况进行权衡。
作者其他创作
大纲/内容
双写缓存区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 条评论
回复 删除
下一页