MySQL能够处理拥有数十亿行的大型数据库,随着越来越多的公司和大型组织发现MySQL完全能够满足自己的数据库处理需求,其用户量一直还会持续高速增长。本书是一本介绍如何高效使用MySQL进行运维的高级实战指导用书,除MySQL核心技术之外,更是首次披露热门工具Galera与Inception的独家内幕。
媲美《高性能MySQL》的DBA进阶宝典
代表技术原创经典新高度的鸿篇巨著
推荐序1
周彦伟,我们又称呼他为盐味。在浙江大学同窗七年的时间里,盐味给人的印象是聪明又很认真,幽默而又内向,专注却不失好奇。所以,在他毕业之后去了一家软件公司的时候,我们都觉得他会成为一名合格的程序员。但他却总有意外之举——先是在写了五年程序之后,改行做了DBA;然后又以中国MySQL用户组主席的身份,把MySQL社区做得风风火火、红遍全国;紧接着又被Oracle授予象征Oracle和MySQL DBA至高荣誉的ACE Director;同时,他又领导了一个关于MySQL审核的开源项目Inception。作为他的大学同学和一名计算机技术教育从业者,我真心为他高兴。
最近得知,盐味的新书《MySQL运维内参》即将完稿出版,我深知写书的艰辛与不易,这是需要巨大的恒心和毅力,付出比常人更多的心血和汗水才能完成的,非常敬佩他和他的创作团队。
我曾在同济大学计算机科学与技术系参与过数据库课程的教学工作,遍观《MySQL运维内参》的内容,其对数据库系统原理和基础实现的讲解非常细致和认真,结合基本功能和源码实现的讲解又能让读者更清晰地理解MySQL技术,而理论与实践的结合更能维护论点、说明原理。相信此书能够帮助数据库特别是MySQL数据库学习者和使用者在学习工作中百尺竿头、更进一步。
王瀚漓
同济大学计算机科学与技术系教授、博导
推荐序2
MySQL是一个非常优秀的开源关系数据库管理系统。我第一次接触MySQL是在2002年,令业界称道的开源和高性能两大特性吸引我去尝试了解它。虽然后来由于种种原因没有在MySQL领域深耕,但一直很关注它的发展。MySQL的快速普及,除了得益于互联网的高速发展,其支持事务和行级并发的InnoDB存储引擎也功不可没,InnoDB设计上的简洁精美及其高性能令人叹服,值得数据库应用开发者、数据库管理员和数据库爱好者花时间去研读。学习它的设计思想,能帮助我们了解关系型数据库最核心的运作原理,我后来的工作深受其启发,获益良多!
《MySQL运维内参》不仅仅是一本关于MySQL运维的书。在第一部分MySQL篇,作者介绍了MySQL 服务器线程的启动和运行原理,并用相当大的篇幅详细介绍了InnoDB的数据字典对象和数据存储的细节,特别是InnoDB无处不在的索引和B+树算法,以及保证物理文件存储结构合法性的物理事务概念,这一概念对于关系型数据库系统的ACID特性至关重要。此外,还介绍了基于Binlog的复制,可用于经典的MySQL高可用场景。MySQL特有的嵌入式存储引擎架构在逻辑复制中可能引发ROWID问题,另外InnoDB半物理半逻辑的REDO方式,可能导致潜在的数据页断裂,因此需要引入特有的二次写入。这些MySQL/InnoDB深层的特性和机制,随着MySQL篇的展开,都一一呈现在读者面前。阅读这些章节,如同和一个在数据库实现方面有深厚功底的专家对话,能让我们了解MySQL/InnoDB的优势和局限,从而在实际工作中扬长避短,发挥MySQL及支撑它的硬件潜能。
保证数据安全有效是数据库运维的基本职责,作者以亲身经历,讲述了MySQL数据库在运行中可能碰到的故障和排查方式,以及如何规避可能的风险等。这些经验对于我们在实际工作中处理超长事务、死锁现象等都有很好的借鉴意义。
本书的第二篇讲述了高可用Galera集群的原理、实现细节,以及使用中可能碰到的问题和解决方式。Galera是一种基于复制的允许多点读/写的高可用集群系统,而其他MySQL的高可用架构基本都是主从式的,这使得Galera在处理业务的负载均衡方面具有明显的优势。考虑到作者一手打造了国内最大的Galera集群,并已经投入到高并发大流量的互联网生产环境,本书关于Galera原理和运维的相关描述的权威性是毋庸置疑的,因此本书也是难得的Galera学习和使用的参考资料。
MySQL的小巧灵活及过于快速的成长,也让它付出了代价。MySQL擅长快速执行充分调优的相对简单的SQL,而处理复杂SQL的能力很弱,因此甄别那些有可能会拖跨MySQL的劣质SQL语句(这个问题对于其他数据库系统也存在,只是程度不同)成为每一个MySQL DBA的重要任务,而Inception正是帮助DBA自动处理这一工作的利器,能极大提升这方面的效率。本书的作者同时也是Inception软件的作者,他们无私地把Inception这一成果贡献给了社区,并在本书中讲述了Inception的起源、功能特性和使用方法。Inception的实现利用了很多编译知识,如果能结合Inception的源码阅读本书的相关章节,一定能收获更多。
我虽然不是MySQL领域的专家,但是数据库相关的很多原理知识都是相通的,有幸能在出版之前阅读到本书,我深切感受到其语言表达和技术内容之美。现在推荐给大家,希望本书能对大家的工作、学习有所帮助。
韩朱忠
达梦数据库高级副总经理
推荐序3
在DB-Engines网站上,维护着一个数据库流行度积分榜,最近两年的积分榜前两位一直是Oracle和MySQL,并且两者的积分已经相当接近,我查看了一下目前的分数,Oracle是1416,而MySQL是1366,由此可见MySQL的流行(2017年1月17日数据)。
一个开源的关系型数据库能够挑战Oracle数据库十几年来雄霸天下的位置,这本身就是开源领域的巨大成功。而一个产品的成功,不仅仅是靠技术层面的安全、稳定和高效,更重要的是要有活跃的社区和生态圈。在中国MySQL生态的构建过程中,彦伟的贡献有目共睹,他在完成自我的技术成长之后,又率先拉起大旗创立了ACMUG用户组,并且踏踏实实地在全国范围进行活动组织和技术分享,极大地活跃和带动了MySQL社区的发展,彦伟也因此而成为了国内第三位MySQL方向的Oracle ACE总监。
所谓同声相应、同气相求。在彦伟的影响下,一批MySQL俊彦汇聚到去哪儿网的数据库团队,其中就包括本书另两位作者——年轻专家竹峰和昌金。在技术上的实践和积累需要长期的底蕴和实干,彦伟的团队近年在去哪儿网的践行也尤其值得关注。现在,他们将实践多年的积累汇聚成书,与行业里的同仁分享,这对大家实在是难得而宝贵的财富。
我阅读了本书的部分章节,对比了MySQL的两次写与Oracle数据库相关实现上的异同,感觉颇为受益;而Inception作为MySQL的SQL审核产品,与云和恩墨的z3有异曲同工之妙,从Inception的诞生到开源,我一直都在关注,好的思路和产品,也必然是殊途同归的。我一直认为,在开发测试阶段强化SQL质量审核,是DevOps在数据库领域的最佳落地点,也是DBA们将踩过的坑和开发经验进行分享的最具价值的呈现,防患于未然的事前审核优化,才是对企业和业务负责任的态度。现在,作者们把Inception的来龙去脉呈现出来,一定会让很多DBA们感同身受,并开始学习和借鉴。
一本好书,十年磨砺!愿读者朋友们能够体味其中甘苦,一同尽饮DBA们带来的佳酿!
而至于无穷回味、激发创新、转折演绎,则要靠各位去谱写新的篇章!
盖国强
云和恩墨创始人,Oracle ACE总监,ACOUG主席
推荐序4
由于ACMUG(中国MySQL用户组)的缘故,我很早就认识了彦伟,并且意气相投、一见如故。他是ACMUG的创始人兼主席,同时也是一名运维经验丰富的DBA,他曾经分享过在人人网鼎盛时期以区区几名DBA应对MySQL巨大访问量的经历,也谈起过在去哪儿网主导的针对电子商务和交易的MySQL运维架构的革新和SQL审核工具Inception的创作。从UGC类型的人人网到电商类型的去哪儿网,这对DBA本身就是一个进阶。从使用开源工具到自己创作并开源工具,这更是一个巨大的进步。
王竹峰就是Inception的主要开发者,他的数据库理论和源码功底非常深厚,而他边运维边进行源码开发和研究的工作方式更加促进了他对MySQL整个体系架构原理的理解,带着问题看源码,装着源码解决问题,通过源码解读MySQL的各种特性,这已经成了竹峰的标签。
我是以运维DBA的角色开始我的职业生涯的,经历了长期一线实战的积累和锻炼,随后才慢慢转为数据库内核开发。即便是现在,我跟阿里云的其他同事也会经常处理一线运维问题,通过对这些问题的处理,我们积累了经验和需求,再反馈到数据库源码中去,这是我们不断前进的原动力。一线运维经验与数据库理论和源码相结合的重要性,我有深刻的体会。
得知彦伟愿意牵头把他和团队这几年的经验和技术通过书的形式写出来分享,我非常欣喜并期待,这是对广大MySQLDBA最好的礼物。
彭立勋
MariaDB基金会成员,ORACLE MySQL ACE
推荐序5
自从2015年10月MySQL 5.7 GA,以及2016年9月8.0 DMR版本启动后,我们可以看到Oracle官方明显加大了对MySQL的开发力度,努力把MySQL打造成一个全明星产品,让我们对MySQL未来的发展更加坚定了信心。
作为一个从业多年的MySQL DBA,我从未停止探索理解MySQL中各方面的技术实现细节,包括最重要的Server层及InnoDB存储引擎。此外,我也关注MySQL的各种高可用实现方案,以及作为DBA非常迫切需要的自动化管理平台。
2016年12月,MySQL 5.7正式发布了MySQL Group Replication,我们终于可以用上这个官方的多节点同时写入高性能架构的方案了。当然,新事物总是需要有一个阶段才能完善,还不能大规模上线使用。那么,现阶段如果有这样的需求怎么办呢?毫无疑问,肯定是选择Galera
Cluster方案。
如果有这样一个工具,能帮助DBA完成SQL上线前的审核,审核通过后能自动上线,万一反悔或误操作还能“倒带”(回滚),相信您一定会很期待吧!如果这个工具还开源了,是不是更兴奋了呢?没错,这就是Inception!它完全可以帮您实现这些梦想,让DBA无须再痛苦地做SQL审计和上线执行。
在过去的几年里,周彦伟先生、吴炳锡先生和我一起打造了国内最有影响力的MySQL用户组织ACMUG。从和周彦伟的协作中能感受到他对技术细节的拿捏把控。因此我们也有理由相信,由周彦伟先生、王竹峰先生等人主导编写的这本MySQL大作将会引爆今年的MySQL技术圈。同时我们也要感谢本书所有作者的辛苦编撰和无私的经验分享。
叶金荣
知数堂培训联合创始人,ORACLE MySQL ACE
推荐序6
我和彦伟是老朋友了。最近得知彦伟在写一本叫作《MySQL运维内参》的书籍,感到若合一契。
互联网刚开始进入中国的时候,国内数据库市场一直被昂贵的商业数据库统治,在一些大型企业、机构尤为明显。但最近几年,以MySQL为代表的一批开源数据库已经在慢慢成长,足以应付复杂的使用场景,也足以在那些要求高可用、高一致性、高安全性的领域施展拳脚。国内在MySQL方面的人才也快速涌现。这个时候,我们都感到需要一些有行业经验的人站出来,把成熟的MySQL使用经验分享给大家,让MySQL能够真正独当一面,发挥更大的价值,成为众多企业的选择。
腾讯云在金融、保险、工业、政府、游戏互联网应用等多个领域和从业人员有过一些交流,他们也感觉缺乏运维方面的书籍来培训和指导他们的员工。彦伟这次的专著应运而生,既是行业的需要,也是他作为ACMUG创始人的责任。
彦伟书中内容翔实,不仅介绍了使用方法,也对InnoDB的原理、主从复制,以及业界内的一些不同做法做了介绍。文中介绍的Inception,与腾讯云的备份审计系统颇有相似之处。我们也经常在一起探讨云数据库的架构与实现,希望本书能给读者带来新的启发,为MySQL带来新的动力。
祝百万
腾讯云数据库技术负责人
自序1
十年前,我有幸加入了陈华、吴世春创办的酷讯网,开启了我的互联网职业生涯,同时也让我开始接触到开源世界的件件瑰宝,尤其是MySQL。终于,两年后,我正式成为了一名MySQL
DBA。这要感谢当时如日中天、被誉为中国Facebook的校内网和我的良师益友刘启荣先生,让我有机会和空间,在MySQL的世界里自由翱翔并得其所哉。
从事MySQL DBA工作是我一直以来引以为豪的事情。我一向认为DBA是一个与众不同的职业,如果要把人分成两类的话,那么有一种分法就是,一类是DBA,另一类是非DBA。
DBA是什么?
? 有点像SA。但在业务层面上比SA事多,主要是牵扯的人多,嬉笑怒骂,皆成文章。
? 有点像DEV。但总是会有冲突,多数情况下发生在双方对数据库使用的看法和优化上。我们只好自己开发一个Inception给DEV用。
? 有点像PM。设计库,优化表,处处都是艺术。
? 有点像CTO。你以为我说的是首席建表官?DBA不过是操着鸡毛蒜皮的心啊。
? 有点像出租车司机。一向不待见那种不等改完表甩手就走的人,等待是一种美德,善始善终方显英雄本色。
? 有点像消防队员。网站挂了,可能跟DB没关系,但DBA一定要出现;DB挂了,一定跟网站有关系,DBA也一定要出现。
? 有点像银行点钞员。数据就是钱啊,只是都不是自己的,但职业道德最为重要。
? 有点像养孩子。当爹又当妈,哪个实例伺候不好,都会出乱子。
DBA是服务型职业,服务好了,没你什么事;服务不好,事情就大了。
DBA承载着一个重要的角色,有着特殊的职责和使命,一个优秀的DBA其实是非常难得的。DBA应该具备怎样的能力呢?我曾经提出过“DBA精神”:责任心、服务心、沟通心、学习心、进取心和分享心。
DBA精神是责任心的体现
维护数据库数据的安全和完整是管理员的首要责任。作为一个DBA,在管理数据库的过程中,要把数据库看作自己的财产、儿女和身体的一部分。此种职责,需要你像呵护自己的眼睛一样去照顾你所维护的数据库。时刻去想,有没有做应该有的备份,有没有加应该有的监控,有没有做必须要做的安全权限限制。一旦出了问题,有没有第一时间去分析和解决问题。这就像自己的眼睛,一旦出现红肿病态,怎会有人视而不见?
DBA精神是服务心的体现
现代互联网对DB的需求,需要支撑业务持续稳定的运行和源源不断的变更,这要求DBA有7×24小时的服务精神。这是一个服务性职业,需要随时随地响应来自各方面的各种需求。其一,人的需求,业务要发展,DB就会有变更,只有DBA与开发人员紧密配合,才能顺畅高效地完成工作。其二,事的需求,DB是一个动态的系统,不断地运转就会不断地面临新问题,机器故障、磁盘报警、内存不足、CPU过载等。这是一个脆弱的系统,它不会对DBA的迟钝有半点仁慈,一旦有问题,任性的宕机是必然的结果。其三,心的需求,DBA应该发自内心地主动去对DB不断地做优化,这种优化,可以在结构上,可以在架构上,可以在业务逻辑上,关键在于有没有用心。说得通俗一点,“没事找事”。
DBA精神是沟通心的体现
DBA的工作,不是封闭的科学研究和孤傲的英雄主义,不管是主动地优化,还是被动地接受任务,都需要与人做不断的沟通与交流。如果不懂业务流程,不知道数据的来龙去脉、轻重缓急,那就谈不上数据库表的设计和优化。而数据库的优化,最大的进展往往来自对业务逻辑的优化。这需要运用良好的沟通心态和技巧,深入了解业务流程和架构。与人沟通,是DBA获取知识和信息的主要途径,需要做到能与人沟通和会与人沟通。在生活工作中,人的个性是千差万别的,面对形形色色的沟通对象,充分调动对方的积极性,进行愉快有效的交流,也是DBA需要掌握的一门技术。
DBA精神是学习心的体现
DB在技术体系中是一个承上启下的中间环节,它运行在物理硬件和操作系统之上,同时承载着上层各种各样的业务逻辑的调用。对DB的运维和管理,不仅仅需要掌握数据库自身的基础知识,还需要知己知彼,去了解它上下游的知识和特性,才能保证这个系统的稳定和优化。所以,一个优秀的DBA需要了解你所使用的硬件,这包括磁盘的特性、网络的布局、内存的使用和CPU的处理能力等;需要了解DB所运行的操作系统的知识,它是怎样调度I/O的,怎样管理内存的,怎样优化文件的;需要了解上层业务是怎样调用数据库的,SQL是怎样写的,看懂了业务逻辑的程序才能明白某些SQL是不是多余的,某些SQL是不是可以优化。MySQL官方和MariaDB官方,都已经针对硬件开始在官方源码的基础上做自动优化了,同时MySQL官方还提供了自己集成于业务端的高可用方案,这都是开源数据库进步发展的必然结果。同时,由于开源数据库的盛行,针对数据库自身代码的学习和研究,也逐渐成为优秀DBA的必修课了。
DBA精神是进取心的体现
随时发现问题、分析问题、解决问题。通过问题现象,依赖自己的经验和知识,同时探索未知的知识去解决现实中的问题,在这个过程中,也是自己积累经验和不断成长的过程。相对而言,解决问题本身并不重要,重要的是在此过程中探索解决问题的方法并总结所获取的经验,DBA的职业优势也在于此,同时,主动花费心思与精力去不断追求问题的优解和技术的极致,也是DBA应尽的职责。
DBA精神是分享心的体现
这些年,我们一直在倡导做一件事情,那就是提倡DBA在开源社区持续做技术分享。我们做了ACMUG,全称是 China MySQL User Group。A可以认为是All、About,或者是Active,它代表了所有关心MySQL及其相关技术的积极参与分享活动的人。在过去的数年里,ACMUG已经组织了上百场技术分享,分享者都是工作在一线的DBA或数据库技术爱好者,通过参与这个活动,大家都切切实实地得到收益,个人在技术上也取得了巨大的进步。通过分享,大家学到了技术、开拓了视野、展开了思路,当然也交到了朋友。我们希望能通过这样的活动,将DBA精神延续下去,让更多人受益,让更多技术普及。
本书的写作,正是出于分享的目的。我们依靠开源软件和技术实现了自己的职业理想和人生价值。饮水思源,投桃报李,我们愿意把自己在工作中的点滴积累分享出来,以期能帮助到更多的人。
写书,其实并不是那么轻松。周围的好多朋友都有这样的想法,甚至已经付出了巨大的努力与心血,但最终并未能如愿,非常地遗憾。一方面,互联网是一个以快为王道的行业,大家平时的工作并不轻松,尤其是DBA,7×24小时的服务要求你要时刻准备着投入工作。另一方面,开源社区也是日新月异、一日千里,稍一迁延,所述的题材和内容也就落伍了。
下面一段引文是我在2015年7月为将要开始写作的这本书写的一篇自序,这是当时要写的内容的一个轮廓,现在看来已经大相径庭了。
去哪儿网是一个做线上旅游产品的网站,主营线上机票和酒店,以及其他旅游相关的产品,例如火车票,度假线路和旅游攻略,目的地生活,接送机场、景点、火车站的专车,景点门票等。发展到现在,去哪儿网已经算是一个纯粹的电子商务网站了,而在网上的各种业务逻辑和操作,大部分都是用MySQL作为后台数据库支撑的,这也包括交易的支付业务和账务系统。要完成这些,除了依靠强大的前端业务逻辑及丰富的流水日志外,对MySQL运维管理也是极大的挑战,这也使得去哪儿网的MySQL DBA得到了极大的历练。
在工作过程中,为了支撑业务的发展,围绕着MySQL运维这个主题思想做了很多事情,大致来说,可以分为以下几个方面。
其一,定义《去哪儿网MySQL数据库开发规范》。这主要是针对开发人员的数据库操作规范,定义这个规范的主要目的是为了方便我们规范地使用MySQL数据库,在可知的情况下,充分利用数据库的优点去解决我们的业务需求,同时最大可能地规避已知MySQL的不足之处。另外还有一些约定俗成的规范,例如表名、字段名要用小写字母,这完全是使用习惯的规范,大家完全不必太在意,可以根据自己的习惯调整,但我建议,如果在同一家公司内部,还是统一起来比较好。
其二,开发《InceptionSQL审核系统》。为了最大程度地保障线上数据库安全,我们规定,所有的线上SQL必须通过DBA的审核之后,才能上线执行,因为在高并发、高负载的系统中,任何一条不优化的SQL都有可能引起数据库负载过高,从而导致数据库实例挂掉。去哪儿网是一个快速发展的公司,各种业务需求变化多端,平时DBA审核SQL的压力非常大,再加上我们定义了自己的开发规范,这在人工审核的过程中很可能出现一些问题,例如审核不全面,尺度不统一,判断不正确等。为了改善这一状况,提高DBA的工作效率,加快项目上线的速度,我们花大力气开发了一套InceptionSQL审核系统,这套系统能完成DBA平时审核过程中的大部分人工工作,极大地提升了工作效率,也大大提高了审核的正确性,目前已经是DBA工作过程中不可或缺的有力帮手了。
其三,优化数据库架构,提升数据库的可用性。去哪儿网是实时的在线交易网站,它对交易数据的一致性和可用性要求非常高,在这个目标上,我们付出了极大的努力。长期以来,去哪儿网的MySQL架构是MMM,MMM是一个比较实用的MySQL集群方案,在早期的MySQL运维中,一度被很多人采用,在MySQL领域是一个使用比较广泛的架构。但是随着技术的发展和业务对数据库服务能力需求的提升,MMM已经渐渐不能满足我们的需要了,特别地,它有一些致命的缺陷,可能会导致业务完全无法使用。我们花费了巨大的精力去探索什么才是适合自身的MySQL架构方案。最终,我们选定了基于Galera同步的Percona XtraDB Cluster(PXC)方案。在此方案中,我们选定了PXC为底层数据库存储架构,同时加上自主开发的分布式哨兵监控系统及连接池管理模块,形成了一套完整的数据库高可用架构方案,这套方案在线上运行良好,极大地满足了线上业务的高可用和高一致性的需求。
另外,由于基于PXC的数据库方案是高一致性的,它对可用性做了必要的牺牲,但在业务中,有些地方是不太计较一致性的,或者可以接受相当程度的延时。为了满足此类业务的需求,我们在保留PXC的同时,另起了一个新的方案QMHA,它起源于MHA,但我们不满足MHA的监控方式及线上切换的缺陷,同时,觉得自己的分布式哨兵监控系统工作得实在太好了,所以决定在MHA的思路上,用组件来完善这个架构,它的底层是数据库的Master-Slave
Replication,用分布式哨兵作为监控工具,同时利用MySQL 5.6之后的GTID和Semi-Sync-Replication这些特性,来保证数据的最终一致性。
第四,自动化运维。台上一分钟,台下十年功。如果安全的线上运维是台上表演的话,那么围绕着MySQL的自动化运维和数据安全所做的工作就是台下功了。我们在这方面做了不少工作,其中值得一提的是MySQL备份系统,完善的备份是整个数据库系统必须要有的重要一环。它在某种意义上也是数据库高可用的一部分,一旦有线上误操作或其他意外,备份数据会救公司一命。我们使用Percona XtraBackup自己定制了一套完善的备份系统,可以作为一些场景需求的参考。
另外,为了在工作中能快速完成集群的部署,我们定制了自己的集群部署平台。它可以实现分钟级的MySQL集群部署,这里需要指出的是,我们的集群结构很复杂,它除了传统的启动MySQL实例外,还需要管理监控哨兵、Zookeeper资源、集群namespace资源,以及一些常规的备份和监控功能。
最后,为了方便管理我们的数据库集群,完成复杂的线上节点切换和维护,我们实现了数据库集群管理平台,让DBA在线上操作时,可以摆脱复杂的运维步骤,大大简化了操作流程,同时也有效防止了误操作的可能,提高了运维操作的安全性。
随着去哪儿网DB团队的壮大,我们的知识和技术也在慢慢积累。这些知识平时散布在各种Wiki、Doc、Blog及内部邮件中,系统性和可读性都非常差,非常不利于知识的传播和传承,特别是最近新人入职,对他们的培训也要花费很大的精力。我不禁想,如果能把这些知识整理出来,做成一本书,岂不两全其美。如果去哪儿网之外的技术同仁们也对此感兴趣,我也乐于把它分享出来,供大家在工作中参考。如果能对大家有所帮助,也算是我们对技术社区的点滴回报,真是善莫大焉。
MySQL是历史悠久的开源数据库,有着非常强大的社区和人数巨多的拥趸,这里面卧虎藏龙、大牛辈出。由于我们知识范围有限,如果本书中有疏漏或不妥之处,还望见谅,我们会积极改进,不断进步。
周彦伟
2015年7月21日于北京
亲爱的读者会发现,有很多文中提到的内容在本书中并未涉及。真实的情况是,近两年来,我们一边工作,一边偷空写作,写写停停,停停写写,随着时间的流逝,很多内容已经不再适合放入本书,例如我们对于MMM和MHA的使用方案和运维经验;另外,在实践中我们也发现,有些技术和方案是紧密联系业务的,事关公司敏感信息的内容也无法放入本书。于是,我们又有了写写删删、删删写写的痛苦经历。技术书籍的时效性对于我们有切肤之痛,曾经有多少次,本书几乎走到了夭折的边缘。
这里,要衷心感谢一下我最亲密的战友王竹峰先生,与之相识、相知真乃人生一大快事。竹峰的存在,不仅帮我实现了自己诸多的技术设想,也帮我坚定了去做很多事情的信心。在本书的写作过程中,竹峰的坚持与毅力鼓舞了大家,竹峰的贡献是本书能够出版的关键。本书的另一位作者强昌金,在工作和写作中所表现出来的初生之犊的冲劲和孜孜不倦的精神,也极大地推动了本书的完成。
给读者带来最实用的内容是我们一直追求的目标。我们能力有限、学识浅薄,只能花出十二分的气力,写一些自己熟悉和擅长的内容呈现给读者。对于没有把握的内容,宁可缺失,也不能草草充数了事。这些年,我们最熟悉的东西有三种,那就是本书中介绍的MySQL、Galera和Inception。MySQL是本书的根本,我们使用了多年,而且竹峰在MySQL源码上的钻研心得也极大地提高了本书的含金量。我们在去哪儿网所推行的基于Galera的PXC方案,算是近年来最先进的MySQL集群化方案之一了,它的数据一致性和高可用性特别适合去哪儿网这种涉及交易和电子商务的服务型业务,经过三年的实践,它帮我们支撑了大部分业务需求,使我们受益匪浅。而Inception,则是我们送给所有MySQL
DBA和MySQL相关开发人员的礼物,Inception的出现,把DBA审核SQL、操作SQL的效率提升了一个量级,也为数据库操作的安全性和规范性提供了行业参考,作为Inception的设计、开发、使用及推广者,我们不能不去提它。
而对于已经不再适应时代发展和技术潮流的内容,我们也绝不手软。MMM和MHA的部分曾经写得很辛苦,而临到最后,我们还是决心把它们删去,如果有希望了解这方面知识的读者,请自行查找吧。但还是要奉劝大家,MySQL集群化的时代已经到来,基于Galera的Percona
XtraDB Cluster和MariaDB Cluster及最新的MySQL Group Replication才是上上之选。
MySQL已经进入了MySQL 5.7时代,并且MySQL 8.0也已经呱呱落地。我们也高度重视在这方面的匹配。虽然开始写书的时候还在用MySQL 5.6版本,但是到了后期,除了某些原理性的源码解析,对于版本差别没那么敏感之外,我们还努力去兼容新版本的特性。尤为荣幸的是,来自MySQL官方资深的技术顾问杜修文先生和MySQL一线开发团队的宋利兵先生愿意以特邀撰稿人的身份特别为我们的书写了一部分内容,这是MySQL最新版本相关功能的权威解读。
我们在书中努力加入了很多在平时工作过程中碰到的案例及经验总结,也算是本书的一个特色吧,希望这些能在实战中切切实实地帮助到读者。
最后,还是想把上面几年前说过的话再重复一遍:MySQL是历史悠久的开源数据库,有着非常强大的社区和人数巨多的拥趸,这里面卧虎藏龙、大牛辈出。由于我们知识范围有限,如果本书中有疏漏或不妥之处,还望见谅,我们会积极改进,不断进步。
周彦伟
2017年1月25日于北京
自序2
北漂帝都,转眼间已四年有余。这四年间,有两个人对我有着至关重要的影响,我必须先行致谢。
首先感谢我的好友周彦伟先生。入京以来一直是他带领着我学习、工作,让我有巨大的进步。一直想写本书,但苦于知识水平有限,客观条件也不允许,一直没能如愿。在他的帮助下,才得此机遇,圆了这个梦,一个我们共同的梦,再次感谢。
其次要感谢我的爱人田丽芳女士。不管是生活中,还是工作中,她的秀外慧中、深明大义及勤奋严谨的作风,都让我感动。在本书的写作过程中,她也做了很大的贡献,帮助做了内容方面的校正,这也得益于她对MySQL的热爱,并能意志坚定地选择加入MySQL DBA这个大的行列中来,真心感谢她。
互联网发展至今,开源软件已经深入人心,并且受到广泛的支持和响应,很多公司在使用开源软件的同时也输出了一些好的开源产品。MySQL作为当今世界上最受欢迎的开源数据库产品之一,在很多互联网企业里起到了不可或缺的作用。由于MySQL的诸多特性,比如开源免费、灵活、轻量简单且越来越多的企业开始使用MySQL,在业界诞生了一大批相关从业者,他们研究MySQL的原理,探讨MySQL的架构,完善MySQL的运维,丰富MySQL的工具,促进MySQL的发展,我们称这些人为MySQL DBA,而本人也是其中之一,深感荣幸。
怎样才能成为一名合格的MySQL
DBA?在写作过程中,我一直在思考这个问题。受能力和见识所限,也许本书不能很好地回答这个问题,但根据我个人的成长经历,还是有几点感悟可以跟大家分享。
? MySQL DBA,是一类操作型工种,必须要经常动手,想要快速成长,需要经历很多有计划的或真实的线上问题处理才可以。一个优秀的DBA,需要见多识广,达到处事不惊、遇事不乱的状态,这样才能在问题出现时,果断出击,快速恢复服务。经验是DBA最大的财富。
? MySQL DBA,也是一类服务型工种,属于服务行业。我们的使命就是要最大程度地保证业务所依赖的后端数据库的稳定性,并且提供最长的可服务时间。基于此,DBA都要尽力去培养一颗“为人民服务”的心,时刻做好在第一线战斗的准备。
? 本人最初从事的是数据库内核开发工作,相对MySQL DBA来说,这属于两个层面,内核开发是以MySQL内部实现原理及方法为视角的,而MySQL DBA是以如何使用好它为视角的。如果有机会,可以将这二者做一个完美结合,或者角色互换,将会有完全不同的效果,因为只有实际使用了,才可以产生实际的需求,才能促进MySQL更好地发展。而做过开发之后再做运维工作,毫无疑问会非常轻松,并且有希望发展到目无全牛的境界。
作为一名有缘既做数据库开发又做数据库运维的DBA,在撰写本书的时候就是本着让每一位对MySQL感兴趣的读者可以由表及里、深入浅出地去理解MySQL的初衷来构想的。在本书中,我会简单介绍MySQL的运行原理、InnoDB存储引擎包括哪些重点模块,以及各个模块之间又是如何很好地配合来完成用户提交请求的等内容。但在讲述这些实现原理时,我往往会更加强调方法及深层次的理解,而不局限于其本身,同时还会强调读者自身是如何思考的,在学习过程中,必须要时刻伴随自己的思考想象,加上MySQL的自身实现,才能不断地对其加深理解,做到融会贯通。
本书在讲述MySQL时,不会是面面俱到的,所以书名也不是类似“MySQL宝典”之类的。本书主要讲述从MySQL DBA的角度来看,哪些对运维来说是重要的,哪些对业务来说是高效的,并且他们都该如何理解,比如日志、索引等章节。
本书的内容,还包括了在去哪儿网经历了多年实践的Galera Cluster。Galera无疑是MySQL界的福音,因为它改变了长久以来,MySQL异步复制导致经常修复数据的局面,并且因为其多点写入的特性,给MySQL的应用和架构设计带来了非常大的发挥空间。本书要做的,就是基于我们长达三年多的使用经验,并且立足于对其深入的理解,来讲述Galera Cluster是如何实现的,如何支持了多点写入,冲突是如何解决的,有哪些问题且如何避免,诸如此类都会有所涉及。
很多人只听到了Galera Cluster可能出现的问题,再加上目前使用者及相关文档书籍比较少,导致出现了恶性循环,而本书其中的一个目的就是将这些谜团一一揭开,还原一个真正强大好用的Galera Cluster。万事不可能完美,我想表达的观点是,当问题不再是问题时,还有什么能阻止你对它的青睐?
本书还包括了一部分特殊的内容,即我们的开源产品Inception。根据目前的反馈,它在业界已经被广泛使用。这也是在我从开发转行做了DBA之后,将开发与运维结合的产物,也是我们使用开源产品之余,向业界贡献的一款开源产品。很多DBA反映,由于它的出现,MySQL DBA的工作瞬时有了翻天覆地的变化,并且轻松了很多,是广为传颂的业界良心产品。作为Inception的开发者,我深感荣幸,同时也诚惶诚恐、战战兢兢,只能尽自己最大的努力,争取把它做得更好、更强大,以感谢广大支持者的厚爱。Inception已经开源,其手册也已经在网络上广泛传播,而本书所要讲述的,不局限于手册内容,更包含了对Inception的一种理解、它对我们的意义及一种设计理念。
本书还包括了很多案例,这是在长期运维工作中,我和同事不断积累的一些我们认为值得学习的方法及知识点。
在本书中,很多章节都涉及了有关源码的解读和分析,由于不同章节,写作时间不完全一样,其中一些章节,尽量保持了与最新版本源码同步,比如讲述关于“MySQL源码编译方法”的章节就是,因为是编译方法的学习,采用的是最新的源码。
而有些涉及代码的部分,主要是用来讲述MySQL或者InnoDB的内部实现原理。在大多数情况下,即使代码稍有改变,原理也不会有太多变化,所以很多还是使用了MySQL 5.6版本的源码,我的写作初衷是想要大家尽可能地去理解,做到融会贯通,并且主要讲述的是学习方法,而不局限于其本身,更不是照本宣科地只是学习某个版本的源码而已。
所以针对出现了源码内容的部分章节,还是要根据自己的兴趣,带着自己的问题,根据相关章节中提供的思路,追根溯源,不断地往复。对每一个问题,首先要有自己的初步想象,在这个问题解决之后,将自己的想象与其真实的实现方法对比,不断地校正自己的想象,从而产生新的问题,循环迭代,不断提升自己对MySQL的理解。
我热爱学习,也热爱分享。在生活中,不管是好的想法,还是好的资源,都喜欢去分享。能以个人微不足道之力,给周边朋友或是业界,甚至整个社会带来一些福利,贡献一点力量,足矣!
最后,在学习、生活方面,我想与大家分享一段话作为结语:
盖士人读书,第一要有志,第二要有识,第三要有恒。有志则不甘为下流;有识则知学问无尽,不敢以一得自足,如河伯之观海,如井蛙之窥天,皆无识者也;有恒则断无不成之事。此三者缺一不可。
——曾国藩
王竹峰
2017年1月19日于北京
前言
MySQL是开源世界里面一颗璀璨的明珠,是最流行的关系型开源数据库。关于MySQL的著作浩如烟海、充栋盈车。如何才能写出一本有特色内容的书呢?本书独辟蹊径,从运维和实践相结合的角度,分专题和知识点逐一讲解。用源码去解释MySQL的知识点,分析碰到的问题,这就是本书的特色。
本书内容所涉及的知识点的选择,建立在我们多年工作经验的基础之上。在平时维护MySQL的过程中,觉得需要引起注意或需要弄清楚的,就把它分享出来,希望能管中窥豹,帮助到读者朋友。
本书总体分三个部分。
第一部分是MySQL。
在这一部分中,我们介绍了MySQL大部分常见知识点的概念和原理,以及运维经验。所谓源码面前,了无秘密。我们从MySQL源码入门开始,介绍源码结构、启动过程、创建连接、表对象缓存等,希望读者在研究MySQL的时候,能充分借助MySQL源码开源的优势,从源码出发,深入理解MySQL的精髓。当然,限于篇幅,我们只能抛砖引玉,适可而止。期望聪明的读者能打好基础,登堂入室。
本部分会重点介绍InnoDB的相关概念,从源码目录结构,到InnoDB体系架构及其数据字典、数据存储结构、索引的实现原理、两次写(DoubleWrite)、日志管理机制、InnoDB记录格式等,都进行了深度的剖析,这块内容比较复杂,也凝聚了我们巨大的心血,期望能帮助读者理解其中的相关概念。
随着MySQL 5.7的成熟及MySQL 8.0的发布,一大波MySQL新技术迎面扑来,我们也不会放过这次学习的机会。值得称道的是,本书中包含了来自两位MySQL官方团队的专家特地给我们供稿的内容,分别详细讲述了MySQL对JSON的支持:MySQL Group Replication和MySQL Document Store。另外,我们也关注了MySQL的GTID、SYS Schema、Semi-Sync Replication等,通过对它们详细的描述,相信本书能为广大读者在快速熟悉和掌握MySQL新版本中出现的功能的学习助上一臂之力。
在讲述各个知识点的同时,也会结合工作过程中的一些经验,跟大家分享自己的心得,例如我们详细介绍了Percona XtraBackup,也分享了在使用它的过程中碰到的问题。类似地,还有快速删除大表的案例、死锁的案例、处理很多文件时碰到的问题等。
最后,值得一提的是,我们还结合各个知识点,对MySQL如何保障数据库安全做了比较详细的总结,希望这会改变人们对开源数据库是否可靠这样问题的一些有争议的看法。
第二部分是Galera。
Galera是去哪儿网架构MySQL高可用的技术基础,我们选择了以Galera Cluster为基础的Percona XtraDB Cluster为技术原型,自主研发了针对去哪儿网这种以交易为主需求的电子商务网站的MySQL高可用架构方案,目前已经在线使用了三年,可能也是国内最大的Galera集群,我们也很荣幸能成为MySQL集群化的早期践行者。
本部分首先介绍了Galera Cluster的设计与实现,让读者能从宏观层面理解它。当然,虽然说是宏观,但是根据本书写作的主导思想,也不免会从源码的角度去剖析其架构、理解其精华。Galera提供了非常丰富的参数让使用者去灵活地设置,我们也做了重点介绍和解析。
在准备工作完成之后,开始讲述Galera的重要知识点:验证方法、消息传送、GCache实现原理、SST/IST细节、Donor/Desynced详解、并发控制、FlowControl及grastate.dat文件揭秘等。仔细研读了这些内容之后,相信读者对Galera的理解会更上一层楼。
实践是本书的另一个特色。所以在Galera部分也加入了不少的实践案例,例如业务更新变慢的根由溯源、手动构建集群死锁、从库的转移等,通过这些内容分享工作中的一些心得,希望读者能够从中受益。
第三部分是Inception。
这是我们从零做出来的一个开源项目。Inception已经开源,其手册也已经在网络上广泛传播,而本书所要讲述的,更是对Inception的一种理解,以及它的意义和设计理念。
关于它的诞生、安装与使用,以及支持的选项、结果集和命令集等,我们都会介绍。同时,值得注意的是,我们特地安排了一节Inception的彩蛋,里面讲述了几个Inception的特殊功能,它们已经成为了日常工作中不可或缺的重要工具。
如何阅读本书
基于本书的目的,不是为了帮助你了解整个数据库的所有内容,如果想要了解整个MySQL数据库的所有内容,在线手册无疑是最好的帮手。而本书只关注了在工作中总结出来的对工作有用的重点内容。所谓的重点内容很多,它们之间可以不相关,也可以相关,所以行文组织是比较自由的,相应的阅读模式也可以比较自由。
书中的MySQL部分,其讲到的案例都是非常独立的,与其他章节没有什么关系,所以可以采取跳跃式阅读。对于一些讲述原理的内容,如果不同章节中有相关联的部分,在内容中都会有类型参照关于“某某某”的内容来引导阅读,所以也不需要刻意遵守章节顺序。
书中的Galera部分,大部分是在讲述它的实现原理,对于这些内容,最好是按照书中的顺序阅读,这样才可以最好、最快速地理解它们。而后面会讲述一些操作方法及案例等内容,都是基于前面的原理的,案例之间没有相关性,可以采取跳跃式的阅读方法,找到自己感兴趣的内容。
书中的Inception部分,讲述了如何诞生、如何使用、如何设计及所支持的功能等内容,这基本也是有顺序的,建议按照书中顺序来阅读。
读者对象
如果你是一名技术管理者,期望本书能帮你建立对MySQL数据库的信心,助你完成数据库方向的技术体系建设,同时也能帮助你了解MySQL的原理和架构。其中的知识要点,如果在面试中使用的话,应该能帮你找到你所渴求的那
1% 的顶尖人才。
如果你是一名架构师,期望本书能帮你在MySQL架构上大显身手,本书中介绍的MySQL
Replication、Semi-Sync Replication、Group Replication、Galera
Cluster,几乎囊括了所有MySQL架构的基础,一定有一款适合你。
如果你是一名开发者,期望本书能帮助你在开发过程中,充分理解MySQL的原理,设计出合理的数据库表和索引,更好地利用MySQL的优势,避开MySQL的劣势,合理使用这个优秀的开源数据库。
如果你是一名DBA,那么真心恭喜你,本书的知识能助你成为那1\%的顶尖人才。
勘误和支持
由于我们对MySQL及相关技术的认知水平有限,以及在书写过程中可能存在一些疏忽,书中可能还存在一些不尽如人意的地方,或是不够完美还需要改进的地方,抑或是存在一些错误等问题。我们希望广大读者朋友们能指出其中的问题并留下您的宝贵建议或意见,我们会不断改进,不断完善,在此先感谢大家。
如果有朋友有任何关于本书的问题,或者建议意见等,想要与我们联系,可以发邮件到mysql@dbace.club,我们会尽己所能及时回应大家。
我们会在我们的公众号上随时发布本书勘误细节和最新技术进展,同时也会把相关重要意见不定期地结集发布,为了保持随时沟通并获取最新的改进资料,可以扫描右侧二维码关注我们的公众号:formysql。
致谢
感谢去哪儿网这个大平台。有机会去实践个人理想是一件值得庆幸的事情,而我们恰恰是幸运的。作为DBA,去哪儿网从业务和规模两个方面给我们提供了无比宽阔的平台。去哪儿网是典型的电子商务网站,并且业务种类繁多,场景复杂,这可以让我们有大把的机会去实践各种业务需求,特别是电子商务网站对数据一致性要求的严谨和服务可用性要求的苛刻,可以说是不断在逼迫我们积极创新、精益求精,这无疑促进了我们自身的进步。同时,去哪儿网作为名列前茅的行业平台,有庞大的用户群和访问量,这对数据库的性能和并发都提出了很高的要求,在这种情况下,DBA工作的紧迫和艰苦表现得淋漓尽致。宝剑锋从砥砺出,梅花香自苦寒来。多年以后我们发现,在这样的环境下,我们进步了。
在去哪儿网,要特别感谢吴永强先生和甘泉先生。他们先后见证了去哪儿网DBA团队的组建和成熟,是他们在背后的鼎力支持,才让我们有机会风风火火地折腾一场,完成了DBA技术体系的实践。同时,也要感谢去哪儿网DBA团队。如果说我们在MySQL上还有那么一点点小小的成果的话,那么这个成果一定是属于这个团队每一个人的,这是大家共同努力的结果。这个团队目前的成员有:李坤、孙凯、徐庶、郑平奎、高岩、强昌金、朴昌俊、许子文、沈彦、蒲聪、吕尚、李勇、黄勇、王竹峰、周彦伟。
感谢我们的老朋友杜修文先生和宋利兵先生,他们也是我们众多MySQL官方团队朋友的代表。在我们多年使用MySQL的过程中,他们曾经给予过我们无数次的指导和帮助,是我们学好MySQL、用好MySQL的良师益友。在这本书的写作过程中,他们又热心相助,牺牲自己的业余时间,为我们呈现了MySQL在NoSQL和Group Replication方面的最新技术细节,无论对本书,还是对于广大的读者,都是意外之喜。
在我们学习和使用MySQL的过程中,个人知识和经验的积累及解决问题的思路大部分都来自朋友们的指点和教诲,我们要感谢帮助过我们的朋友们,特别是一起参与ACMUG社区活动的朋友们,限于篇幅,我们不能点名逐一致谢,就以ACMUG代替吧,感谢ACMUG。
特别地,感谢为本书作推荐的作者:甘泉先生、王瀚漓先生、韩朱忠先生、盖国强先生、刘启荣先生、田发明先生、彭立勋先生、金官丁先生、叶金荣先生、祝百万先生、姜承尧先生、阳学仕先生,诸位师长和朋友的倾情推荐给了我们巨大的信心和勇气,我们表示衷心的感谢。
由于我们几人出身工科,文字功底粗陋,同时在技术上也不可避免地破绽百出。这里要特别感谢参与本书校对的李坤、田丽芳、高岩,是他们不厌其烦的耐心核对和明察秋毫的细心校正,才使得本书不至于佶屈聱牙、不堪卒读。
最后,感谢本书的读者,你们的支持是我们最大的动力,谢谢你们!
参数名“ENABLED_PROFIING”改为“ENABLED_PROFILING”
“为了支持读去老数据的功能”改为“为了支持读取老数据的功能”
图8.2改为:
书上的图8.8如果看不清,可以看下面这张图:
书上的图8.9如果看不清,可以看下面这张图: