MySQL中的double write(二)(r12笔记第17天)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:     MySQL里的double write是InnoDB的三大闪亮特性,另外两个是insert buffer 和自适应哈希,其实还有几个比如异步IO,Flush neighbour Page(刷新邻接页),这个和系统层面的关联性较高,所以三大亮点还是更有针对性的。

    MySQL里的double write是InnoDB的三大闪亮特性,另外两个是insert buffer 和自适应哈希,其实还有几个比如异步IO,Flush neighbour Page(刷新邻接页),这个和系统层面的关联性较高,所以三大亮点还是更有针对性的。

   当然一说到MySQL里的double write,其实主要是要应对一个很自然的问题,那就是partial write。

经典的partial write问题

   这个问题比较经典,很多数据库设计中都需要考虑到这样一个临界点的问题,MySQL中的页是16k,数据的校验是按照这个为单位进行的,而操作系统层面的数据单位肯定达不到16k,比如是4k,那么一旦发生断电的时候,只保留了部分写入,如果是Oracle DBA一般对此都会很淡定,说用redo来恢复嘛,但是可能我们被屏蔽了一些细节,MySQL在恢复的过程中一个基准是检查page的checksum,也就是page的最后事务号,发生这种partial page write 的问题时,因为page已经损坏,所以就无法定位到page中的事务号,所以这个时候redo就无法直接恢复。

   由此引申一点,partial write的问题在Oracle中肯定也会存在,但是只是Oracle替我们把这个过程平滑的做好了。其中有设计的差异,还有恢复技术的差别。但是无论如何这个问题都不会绕过去,还得解决。

   所以这一类问题,如果讨论起来,那可以讨论很长时间,可以把体系结构里的方方面面拿出来分析,做对比。

简单分析double write问题

   对此我画了一个相对简陋的图,也欢迎大家提出改进建议。

4f633b1e-7492-4f59-9334-563b942ada35.png

    总体来说,double write buffer就是一种缓冲缓存技术,主要的设计就是为了防止数据在断电,异常情况下丢失数据。里面有几个点需要注意的就是,数据在buffer pool中修改后成了脏页,这个过程会产生binglog记录和redo记录,当然数据写入数据文件是一个异步的工作,如果细看,在共享表空间(system tablespace)中会存在一个2M的空间,分为2个单元,一共128个页,其中120个用于批量刷脏数据,另外8个用于Single Page Flush。根据阿里同学的分析主要是做区分是因为批量刷脏是后台线程做的,这样不影响前台线程。而Single page flush是用户线程发起的,需要尽快的刷脏并替换出一个空闲页出来。所以不是一个严格的64+64的拆分。

       而数据刷新的过程,是先使用memcopy把脏数据复制到内存中的double write buffer,分两次写完,每次写1MB到共享表空间,然后就是调用fsync来同步到磁盘。这里有一点需要注意的是,这个刷新到共享表空间的过程,虽然是两次,但是是顺序写,所以开销不会很大,也就不会像大家想象的double write性能可能很差,根据Percona的测试,大概也就是5%左右的差别,数据重要还是性能更重要,这是一个基本的命题。当然后续会再写入对应的表空间文件中,这个过程就是随机写,性能开销就会大一些。所以在早些时候是用SSD的时候很多人也会带有如此的顾虑,顺序写还是随机写。

    当然double write这么设计就是全面为了作为恢复而用,要不这么大张旗鼓就不值得了。这个图来源于 http://blog.csdn.net/renfengjun/article/details/41541809

  我觉得已经说得很明白了,就直接引用过来了。ac351fc1-9f23-4f07-9a5e-227332cf0834.jpg

   可以看到里面的一个中心词就是checksum,如果出现了partil write的时候,比如断电,那么两次写的过程中,很可能page是不一致的,这样checksum校验就很可能出现问题,而出现问题的时候,因为有了前期写入共享表空间的页信息,所以就可以重构出页的信息重新写入。

double write的另外一个作用

    double write其实还有一个特点,就是将数据从double write buffer写到真正的segment中的时候, 系统会自动合并连接空间刷新的方式, 这样一来每次就可以刷新多个pages,提高效率。

比如下面的环境,我们可以根据show status的结果来得到一个基本的合并页的情况。

> show status like '%dbl%';  
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| Innodb_dblwr_pages_written | 23196544 |
| Innodb_dblwr_writes        | 4639373  |
+----------------------------+----------+通过InnoDB_dblwr_pages_written/InnoDB_dblwr_writes  就可以得到,通过指标也可基本看明白。
   

Percona中的double write改进

 

   当然对于double write,在Percona中也在持续改进,在Percona 5.7版本中做了一个改进,你可以看到一个新的参数,innodb_parallel_doublewrite_path

| innodb_parallel_doublewrite_path | xb_doublewrite |在系统层面,也会存在一个30的一个文件对应。

-rw-r----- 1 mysql mysql 31457280 Mar 28 17:54 xb_doublewrite也就是并行double write,关于这个特性的详细描述和测试,可以参考。https://www.percona.com/blog/2016/05/09/percona-server-5-7-parallel-doublewrite/?utm_source=tuicool&utm_medium=referral

里面提供了很多详细测试的对比和分析。当然MariaDB,Facebook,Aurora也有一些自己的实现方式和考虑,这个限于精力,还没有细细测试分析。感兴趣的同学可以看一看。


参考链接:

https://yq.aliyun.com/articles/50627

http://blog.itpub.net/22664653/viewspace-1140915/

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
关系型数据库 MySQL 数据库
MYSQL解压版安装笔记
MYSQL解压版安装笔记
80 0
|
2月前
|
SQL 关系型数据库 MySQL
(B站动力节点老杜MySQL教程)MySQL课堂笔记-day01.txt
(B站动力节点老杜MySQL教程)MySQL课堂笔记-day01.txt
|
8天前
|
存储 SQL 关系型数据库
【MySQL实战笔记】03.事务隔离:为什么你改了我还看不见?-02
【4月更文挑战第7天】数据库通过视图实现事务隔离,不同隔离级别如读未提交、读已提交、可重复读和串行化采用不同策略。以可重复读为例,MySQL使用多版本并发控制(MVCC),每个事务有其独立的视图。回滚日志在无更早视图时被删除。长事务可能导致大量存储占用,应避免。事务启动可显式用`begin`或设置`autocommit=0`,但后者可能意外开启长事务。建议使用`autocommit=1`并显式管理事务,若需减少交互,可使用`commit work and chain`。
28 5
|
10天前
|
SQL 存储 关系型数据库
【MySQL实战笔记】02.一条SQL更新语句是如何执行的-2
【4月更文挑战第5天】两阶段提交是为确保`redo log`和`binlog`逻辑一致,避免数据不一致。若先写`redo log`, crash后数据可能丢失,导致恢复后状态错误;若先写`binlog`,crash则可能导致重复事务,影响数据库一致性。一天一备相较于一周一备,能缩短“最长恢复时间”,但需权衡额外的存储成本。
15 1
|
3月前
|
关系型数据库 MySQL 数据库
MySQL命令笔记+Python案例
MySQL命令笔记+Python案例
47 0
|
3月前
|
SQL 关系型数据库 MySQL
【2.5w字吐血总结 | 新手必看】全网最详细MySQL笔记
【2.5w字吐血总结 | 新手必看】全网最详细MySQL笔记
38 0
|
3月前
|
存储 关系型数据库 MySQL
最全的MySQL总结,助你向阿里“开炮”(面试题+笔记+思维图)
作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上,MySQL并不难,今天这份最全的MySQL总结,助你向阿里“开炮”,拿下offer没啥问题。
|
3月前
|
SQL 存储 关系型数据库
华为大佬的“百万级”MySQL笔记,基础+优化+架构一键搞定
MySQL不用多说,大家都知道它是目前最为活跃热门的开源数据库,由于成本低,操作简易的特点,所以在互联网企业中被广泛使用,即使是头部的BATJ。由此可见,想要在互联网行业混得风生水起,或者说想要进入BATJ等一线互联网公司,那么熟练掌握MySQL必定是一块必要的敲门砖。
|
4月前
|
存储 SQL 关系型数据库
|
4月前
|
存储 关系型数据库 MySQL
MySQL最全整理(面试题+笔记+导图),面试大厂不再被MySql难倒
作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上,MySQL并不难,今天这份最全的MySQL总结,助你向大厂“开炮”,面试不再被MySQL难倒。

热门文章

最新文章