MySQL  - 讨论区

标题:InnoDB Double Write 技术浅析

2013年12月18日 星期三 23:00

InnoDB存储引擎有一种技术叫做doublewrite,顾名思义,就是对某些数据进行双重写操作的意思,还有一个可调参数是 innodb_doublewrite,可以打开或者关闭这个特性。
那么doublewrite到底是为了解决什么问题呢?又是如何解决的呢?

InnoDB的Page Size一般是16KB,其数据校验也是针对这16KB来计算的,将数据写入到磁盘是以Page为单位进行操作的。而计算机硬件和操作系统,在极端情况下(比如断电)往往并不能保证这一操作的原子性,于是就产生了所谓的 partial page write 问题,也就是写操作只有一部分完成了。

然后InnoDB在校验数据时会发现这个Page的数据已经损坏了,需要进行恢复。一般来说,我们会想到REDO LOG,这个日志不正是用于恢复数据的么?非常遗憾,此时REDO LOG很有可能排不上用场。

REDO LOG的记录有两种类型,一种叫做physical redo log,它记录更新后的整个Page的数据,另外一种叫做logical redo log,它仅记录在原始数据的基础上如何完成更新操作。当REDO LOG是logical redo log时,如果原始数据已经被破坏(发生了partial page write ),那么就无法恢复数据了。

doublewrite技术的目标就是为了解决极端情况出现partial page write的问题。
doublewrite技术的基本操作是:当InnoDB需要向磁盘刷新数据时,先把数据写入到doublewrite buffer(一般位于main tablespace),然后再刷新到此page所在的位置。如果发生了极端情况(断电),InnoDB再次启动后,发现了一个Page数据已经损坏,那么此时就可以从doublewrite buffer中进行数据恢复了。

多了一次写操作,必然会带来一定的性能损失。由于写入doublewrite buffer的操作都是顺序写入,而数据库服务器的RAID卡一般都会启用Write Back技术,所以性能损失不会太大,一般会在10%以内。

性能表现和数据安全,如何权衡,可以根据具体业务的情况进行评估。

另外,把doublewrite buffer、binary log、redo log放在单独的机械磁盘(全部是顺序读写),而 tablespace 放在SSD设备上,也是很好的部署方案。

参考文档:

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号