数据生态:MySQL复制技术与生产实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

写书的出发点

2019年11月,我们撰写了《千金良方:MySQL性能优化金字塔法则》一书。从那以后,身边不断有人问我一个问题:“写技术类的书不怎么赚钱,为什么还要写?”刚开始,我还认真回答,但提问者听到回答之后大多仍然表示不解,后来问的人多了,我索性回答:“为了赚名气!”这个答案简单、粗暴、有效!的确,通过《千金良方:MySQL性能优化金字塔法则》一书,我们小“赚”了些名气,不过对于为什么写书这个问题,这不是我的全部答案。现在,借本书的前言,我将自己全部的想法写出来,希望能完整、全面地回答这个问题。

• 督促自己有计划地学习

2018年12月,我们有幸参加了电子工业出版社在北京举办的作译者聚会。聚会上有两位嘉宾的话令我印象深刻。一位来自阿里巴巴的安全专家说他已经撰写十余本书了,另一位来自美团的某团队负责人说他规划要写十余本书。“听君一席话,胜读十年书”,他们完全颠覆了我之前对于写书这件事的看法。在此之前,我一直以为,技术图书是写作者不断沉淀工作中所学的知识,由量变到质变的产物。能写一本书,说明某个方面知识的积累已经达到一定厚度,非常不易。在那一刻,我才知道,原来写书这件事,还可以刻意规划,也难怪大拿们能够做到连续数十载一年写一本书!于是,从那时开始,我们也开始尝试有计划地学习、有计划地写书。

• 化解繁重的工作和技能精进之间的矛盾

在2018年12月的作译者聚会之后不久,我们再次受邀参加电子工业出版社在杭州举办的作译者聚会。这次聚会上,一位嘉宾的话又让我获益匪浅,他说“视野的高度决定了做事的高度”。在他的影响下,我阅读了吴军博士的《见识》一书,其中“西瓜与芝麻”和“不做伪工作者”的故事令人印象深刻。这让我联想到,自己及身边的同事、朋友们,也未尝不是经常做着捡芝麻的事情,沉迷于低效率的勤奋而不自知,由于工作时长问题,相当多的人也缺少精进的时间和精力。

不少朋友曾经问我如何从零开始学习MySQL,这些人中有刚走出校园的实习生、程序员,也有想从其他数据库开发转向MySQL开发的开发者。对于这一问题,我一时间不知如何作答,但问的人多了,一来我不好意思总说自己也不知道如何学习MySQL,二来突然发觉这或许是一个需要有人站出来解决的问题。于是我开始思考,想象作为一个MySQL“小白”应该如何入门。

经过不断的思考,我慢慢有了一些答案。例如,可以尝试系统地研究某个知识点,将其研究透彻,然后分享出来供大家一起学习,以便帮助那些没有足够精力和时间精进的朋友们快速进步,让那些可能走弯路的朋友们少走弯路。或许这就像吴军博士在《文明之光》中所描述的那样,当农耕文明发展到一定阶段,赖以生存的食物不再短缺的时候,就能够腾出一部分人力不再从事农耕劳作,转而专门从事满足新需求的工作,如此这般,人类文明便可以不断向前进步。

• 系统地学习和研究某个课题

借用吴军博士的话说,一本书可以看作系统学习和研究某个课题后的答卷,就好比在大学里写论文一样,它能够验证你对课题的学习和研究是否有成效,让大家都可以看见、分享你的学习和研究成果。

• 锻炼写作能力

写作是一项技能,需要反复地刻意练习,而写书的过程通常要求高、周期长,这是一个非常好的练习机会。

掌握正确的学习和研究方法

要系统地学习和研究一个课题,按照由浅入深的顺序,我们可以将其过程大致分为如下三个阶段:

• 第一阶段:认识整体

对于一个复杂课题,可以先从整体上搞清楚它的知识体系组成框架,搞清楚其中各个组成部分(知识模块)的大致脉络,从而从全局上建立起初步认知,以便为下一阶段选择知识模块进行深入研究做好铺垫。

• 第二阶段:逐一深入

基于第一阶段的整体认识,可以优先选择一些工作中需要用到的知识模块,或者感兴趣的知识模块,作为子课题逐一进行深入的系统研究。

• 第三阶段:回归整体

由于人的精力有限,在第二阶段,深入研究各知识模板期间,一些知识模块可能会被遗忘,因此需要回归整体,结合自己的验证与理解,建立牢固的知识体系。

在学习和研究的过程中要勤动手记录,可将零散的知识整理为博客文章,博客文章积累到一定数量之后亦可整理为图书,持续地做这样的知识积累工作,直到形成完善的知识体系,日后可供自己与他人使用。

2019年11月出版的《千金良方:MySQL性能优化金字塔法则》,可以说是我们在第二阶段中对一个子课题(MySQL性能优化)的答卷,而本书则可以说是我们对另一个子课题(MySQL主从复制)的答卷。对于MySQL来说,主从复制是一个非常重要的知识模块,而且据我所知,还有非常多从事MySQL相关工作的同行们,对MySQL主从复制的原理、应用场景等知识掌握得并不全面,甚至对其一知半解的人也不在少数。因此,在本书中,我们将其作为重点展开介绍。不过,遗憾的是,在学习和研究的第一阶段,我们还没有撰写相关图书,但我们正在积极筹备中,在不久的将来会为广大读者朋友们交上一份满意的“答卷”!

MySQL的数据生态

MySQL的二进制日志记录了一个数据库实例内数据的变更,这些内容是按照时间的先后顺序记录的。根据具体的二进制日志格式选项设置,可以记录数据库实例内执行的原始SQL语句文本,也可以记录数据库实例内执行SQL语句时产生的数据变更的行记录值。二进制日志可以满足类似如下一些应用场景:

• MySQL Server崩溃之后对其进行恢复时,二进制日志作为事务的协调者。

对于一个未完成提交的事务,MySQL Server崩溃之后进行恢复时,会在二进制日志中检查是否存在对应的内容,如果存在,则事务可以重新提交,如果不存在(或没有启用二进制日志记录功能),则必须回滚事务,将该事务修改的记录进行回滚。

• 在不同实例间进行数据同步(主从复制、组复制)。

主库中的数据变更被记录到二进制日志,然后主库将二进制日志发送给从库,从库使用这些二进制日志进行回放,模拟主库中执行的操作,从而实现主从库之间的数据同步。

• 数据异地容灾。

可以在异地数据中心增加一台服务器,将其配置为新的从库,从主库中获取二进制日志进行回放,达到数据异地容灾的目的;也可以由应用程序模拟一个从库,从主库中获取二进制日志,进行解析、处理,然后将数据存放在容灾专用的系统中。

• 恢复被误删除的数据(通常称为“数据闪回”)。

通常,对于未提交的事务,事务的ACID特性能够保证数据的一致性,直接使用事务提供的回滚功能即可实现对误删除数据的恢复,不受事务控制的修改语句除外,因为不受事务控制的语句修改的数据无法执行回滚。但事务一旦完成提交,就无法再对数据进行回滚,这时可以对二进制日志中记录的值与条件进行反转,生成新的SQL语句(要求二进制日志以row格式记录,必须记录全镜像,且只支持增/删/改语句的反向操作),然后重新在数据库实例中执行新的SQL语句,从而恢复被误删除的数据。

• 数据在异构数据库之间流转。

二进制日志中记录的是数据的逻辑变更,可以从中提取出数据的纯文本和字段的顺序,然后通过应用程序做一些处理,数据就可以在异构数据库之间流转了。这是其他大多数数据库软件不具备的特性。

二进制日志独有的特性是MySQL数据流动与循环的基石,在不同应用场景下形成了独特的“数据生态”,这也是本书名字的由来。

读者对象

无论你是MySQL的初学者、数据库架构师及相关开发人员、非MySQL数据库DBA,还是中高级的MySQL DBA,认真阅读此书,相信或多或少都能有所收获。

• MySQL的初学者、MySQL相关开发人员、非MySQL数据库的DBA,可以从头开始完整学习MySQL的复制技术。

• 数据库架构师、中高级MySQL DBA,可以借助本书对MySQL复制技术的相关知识进行查漏补缺,扫除盲点。

如何阅读本书

全书分为“基础篇”“方案篇”“参考篇”,其中:

• “基础篇”对MySQL主从复制技术的用途、概念、基本原理及演进等进行全方位的介绍。

• “方案篇”对MySQL主从复制技术在生产中的应用场景、复制拓扑的生命管理周期、高可用切换与主库故障转移等进行全方位的介绍。

• “参考篇”对MySQL二进制日志的基本组成结构、常见的复制对象在主从复制拓扑中的流转过程等进行全方位的介绍。

对于初学者、MySQL相关开发人员、非MySQL数据库的DBA而言,如果时间充足,建议从头到尾依次学习本书内容。

数据库架构师、中高级MySQL DBA则可以通过目录快速查找所需内容。

如果你具备一定的MySQL源码阅读能力,或者想要挑战更高难度,可以结合简书平台高鹏的专栏“深入理解主从原理32讲”中的系列文章进行学习。对该专栏中的内容,高鹏也进行了整理,并整理成了《深入理解MySQL主从原理》一书,有需要的读者朋友可自行购买。

作者分工

本书作者各自负责的章节:

• 罗小波:负责撰写“基础篇”“方案篇”,以及“参考篇”中的第28章。

• 沈刚:负责撰写“参考篇”中除第28章以外的其他章节,以及博文视点官网的附录资源。

致谢

首先,非常感谢给本书作序的大拿:叶金荣老师、熊军、徐轶韬。感谢撰写封底推荐语的大拿:林晓斌(丁奇)、高鹏(八怪)、温正湖、杨奇龙、熊中哲、李春。感谢他们的认可与支持!

其次,非常感谢为本书校稿的朋友们:刘云、董红禹、高鹏。感谢他们不辞辛苦,反复咀嚼文字,努力寻找书稿中的纰漏,帮助提升阅读体验!

再次,非常感谢参与本书命名讨论的朋友们:李春、董红禹、徐婷、杜蓉、符隆美、孙黎!

最后,非常感谢帮忙为本书进行宣传的叶金荣老师、大力配合我们推动图书出版事宜的电子工业出版社编辑符隆美,以及其他负责内容审核、校对、排版的编辑们!