丁奇:我的 MySQL 心路历程

百家 作者:InfoQ 2018-12-17 00:43:29

丁奇:前阿里资深技术专家,极客时间《 MySQL 实战 45 讲》专栏作者。今天,他会分享自己是如何从小白成长为 MySQL 内核的开发人员的,跟大家谈谈经历了哪些比较重要的事,哪些事最有成就感,哪些事比较有难度,以及是如何应对的。


<iframe class="video_iframe" data-vidtype="1" data-cover="http%3A%2F%2Fshp.qpic.cn%2Fqqvideo_ori%2F0%2Fg0812dyyql9_496_280%2F0" allowfullscreen="" frameborder="0" data-ratio="1.7777777777777777" data-w="864" data-src="http://v.qq.com/iframe/player.html?vid=g0812dyyql9&width=352&height=198&auto=0" width="352" height="198" data-vh="198" data-vw="352" style="display: none; width: 352px !important; height: 198px !important;"></iframe>

我的经历
以丰富的经历进入百度

我是福州大学毕业的,据我了解,那时候我们学校的应届生很难直接进百度,都要跳到浙大读个研究生才行,后来我投简历居然进了面试。入职以后,我去问面试官为什么让我过简历筛选?他们说因为简历厚,因为我在读书的时候,做了很多项目,实习过不少公司。当时印象很深刻的是,面试官问我,你有这么多实习经历,有没有什么比较好玩儿的事?然后我说,跟你说个数据量很大的事儿 ,在跟移动做日志分析的时候数据量很大,有几千万行。他就笑了,后来我进了百度才知道,几千万行那都是小数据。

开始尝试看源码解决问题

当年进了百度,在贴吧做后端程序,比如权限系统等等。其实很简单,就是写一个 C 程序,响应客户端请求,返回结果。那个时候我用的是 MySQL,但我只是个用户。用了一段时间就出问题了,那个请求本来很快,但是偶尔又跑的很慢,老板问是什么原因,我又不好意思说不知道,就上网查资料,但那会儿是 08 年,网上资料很少,只好去看源码,觉得源码还蛮有意思的,而且真的可以解决一些问题,于是从那时候就进了坑。

混社区分享经验

等到 2010 年的时候,阿里正好在招数据库的开发人员,那时我还只是看得懂源码,没有什么开发经验,就说抱着试试看的态度去试一下,结果就成功进了阿里,跟着褚霸(霸爷)干了 7 年多才离职。在百度的时候,基本上没有在社区混,因为那时候百度可能更提倡内部分享,如何解决问题基本上都分享在内网里。去了阿里以后,才建了博客、开了微博,花名叫丁奇,博客、微博、社区也都是用的这个名字。


丁奇《MySQL 实战 45 讲》,“码”上订阅

为什么要了解数据库原理?

下面我讲几个亲自经历的事情,聊聊为什么要了解数据库原理。

了解原理能帮你更好地定位问题

有一次寒假同学聚会,大家谈起技术问题。一个在政府里的同学说他们的系统很奇怪,每天早上都得重启一下应用程序,否则提示连接数据库失败,他们单位的人都不知道该怎么办。我分析说,按照这个错误提示,应该就是连接时间过长了,断开了链接。数据库默认的超时时间是 8 小时,政企六点下班,下班之后系统就没有人用了,等到第二天早上九点甚至十点才上班,都超过 10 个小时了,肯定就会断开链接。估计那个系统程序写得比较差,连接失败也不重连,仍然用原来断掉的连接,就会报错。于是让他回去把超时时间改长一点,结果这个问题就解决了。我们作为开发人员,即使只知道每个参数的意思,可能就可以针对一些问题给出正确的应对方法。

了解原理能让你更巧妙地解决问题

我在做贴吧系统的时候,每次访问页面都要请求一次权限。所以,这个请求权限的请求,访问概率非常高,不可能每次都去数据库里查,怎么办?我想了个简单的方案,在应用程序里面开个很大的内存,启动的时候把整张表全部 load 到内存里去,这样请求过来,直接从内存里取就行了。数据库重启时,我的进程也会跟着重启,接下来就会到数据表里面全表扫描,把整个用户相关信息全部塞到内存里面去。但是,后来遇到一个很郁闷的情况。有时候 MySQL Crash 了,我的程序重新加载权限到内存里,结果这个 select 语句要执行 30 分钟左右。本来 MySQL 正常重启一下是很快的,进程重启也很快,正常加载权限的过程只需要两分钟就跑完了,为什么异常重启的时候就要 30 分钟呢?后来我没辙了,只好看源码,发现 MySQL 有个机制,当它觉得系统很空闲时会尽量去刷脏页。具体到我们的例子里,MySQL 重启以后,会执行我的进程做全表扫描,但是因为这个时候权限数据还没有初始化完成,我的 Server 层不可能提供服务,于是 MySQL 里面就只有我那一个 select 全表扫描的请求,MySQL 就认为现在很闲,拼命的刷脏页,吃掉了大量的磁盘资源,导致我的全表扫描也跑得很慢。知道了这个原理,我就写了个脚本,每隔 0.5 秒发一个请求,执行一个很简单的 SQL 查询,告诉数据库其实我现在很忙,脏页刷慢点。脚本一发布使用,果然脏页刷得慢了,加载权限的扫描就跑得很快了,据说我离职两年多以后,这个脚本还在用。你看,如果我们懂得一些参数,可以理解这些参数,就可以做正确的设置,进一步懂得一些原理,就可以更巧妙地解决问题。

看得懂源码让你有更多的方法

2012 年的时候,阿里双十一业务压力比较大,那个时候是机械硬盘时代,不像现在,SSD 很多。为了应对压力我们开始引入 SSD,但是不敢把 SSD 直接当存储用,而是当二级缓存。当时用了一个叫 Flashcache 的开源系统,不知道大家有没有听过,现在已经是老古董了。Flashcache 实现把 SSD 当作物理盘的二级缓存,可以提升性能。但是我们自己部署后发现性能效果没有预想的那么好,甚至还不如纯机械盘。我跟霸爷就开始研究,霸爷负责分析 Flashcache 的源码,我负责分析 MySQL 源码。后来我们发现 Flashcache 是有脏页比例的,当脏页比例到了 80% 就会停下来强行去刷盘。一开始我们以为是全部的 20%,后来也是看了源码才知道,原来它分了很多个桶,比如说一个桶 20M,这个桶如果用完 80%,它就认为脏页满了,就开始刷。这就意味着如果你是顺序写,很容易就把一个桶写满。知道这个原理后,我就把日志之类顺序写的数据都放到机械硬盘,随机写的数据放到 Flashcache 上,效果就好了。大家看,如果你看得懂一些源码,你的操作行为就会不一样。

MySQL 学习路径

其实我刚刚讲的就是学习路径。首先是要会用,要去了解每个参数的意义,这样你的运维行为(使用行为)就会不一样。千万不要从网上拿了一些使用建议来,别人怎么用,你就怎么用,而不去想为什么。再往后,就要去了解每个参数的实现原理是什么样的。一旦你了解了这些原理,可能你的操作行为就会不一样。  再进一步,如果你看懂源码,你对数据库的理解也会不一样。

再来讲讲我是怎么带应届生的,实践是种很好的学习方式,我会让新人来了以后先搭主备,然后你会发现每个同学的自学能力都不一样。比如遇到有延迟,或者我们故意构造一个主备数据不一致的场景,让新人了解怎么分析问题,解决问题。

那从学习路径来说,首先就要会,然后可以发现问题。在我的《MySQL 实战 45 讲》里,会出一些常见的问题,这些问题都不会很难,跟课程挂钩,但又无法直接从文章里拿到答案。大家可以尝试先不看答案自己思考,或者去数据库翻一翻,会是一个不错的过程。下一步就是实践,之后当你觉得开始有一些“线”的概念了,再去看 MySQL 的官方手册。在我的专栏里,有人问要不要直接去看手册?一开始千万不要看,里面有 100 多万个英文单词,你就算再厉害,也是看了前面忘了后面。所以一定要自己先有脉络,然后有一个知识网络,再看手册去查漏补缺。我自己就是这么一路走过来的。

DBA 的修炼
DBA 和开发有什么相同点?

正好我带过开发团队,也带过 DBA 团队。其实 DBA 本身要有些开发底子,比如说做运维系统的开发。另外,自动化程度越高,DBA 的日常运维工作量就越少,DBA 得去了解开发业务逻辑,往业务架构师这个方向去做。开发也是一样,不能所有的问题都指望 DBA,DBA 在每个公司都是很少的几个人,开发也需要对数据库原理有一定的了解,这样向 DBA 请教问题时才能更专业。所以两个岗位应该有一定程度的融合,开发要了解原理,DBA 要了解业务和开发。

运维 DBA 有前途吗

每个岗位都有前途,只是要根据时代不同稍微调整一下方向。像原来开玩笑说 DBA 要体力好,因为得搬服务器。后来核心技能成了会搭库,会主备切换,但是现在这些也不够用了,因为已经有了自动化系统。接下来一方面是要了解业务,做业务的架构师;另一方面,是要有前瞻性,做主动诊断系统,把每个业务的问题挑出来,做成月报,让他们优化,你帮他们优化好了,可以把优化的指标呈现出来,体现出你对公司的价值。

有哪些比较好的习惯和提高 SQL 效率的方法

要多写 SQL,培养自己对 SQL 语句执行效率的感觉。以后再写或者建索引的时候,知道这个语句执行下去大概的时间复杂度,是全表扫描还是索引扫描,是不是需要回表,在心里都有一个大概的概念,这样写出来 SQL 会快一点,而且不容易犯低级的错误。这也是我们《MySQL 实战 45 讲》专栏的目标。

看源码需要什么技术

一是要掌握语言,C 跟 C++。另外还要熟悉一些调试工具,代码是静态的,运行起来是动态的,看代码是单线程的,运行起来是多线程的,所以要会调试。还有,不建议用可视化的工具,它虽然很方便,但你不知道这个操作点下去实际本质上做了什么,所以建议自己手写代码和 SQL 语句,让自己更明白一些原理。

怎么学习 C、C++?

我在读研的时候 C 和 C++ 的学习进步最大。那时,去给专科上 C 和 C++,觉得已经会了,完全教得了。但去的时候才知道,自己会跟能够教别人是不一样。备课的时候,发现不能只讲会用的部分,还得把原理讲清楚。这样就倒逼着自己进行更深入更全面的学习。有的人看完技术博客和专栏,会把这篇文章的提纲列一下,写写自己的问题和对此的理解,这个过程很有利于学习。因为你听进来是一回事,讲出去是另一回事。

学数据库要什么心态

不只是数据库,所有多线程的服务,过程都是很枯燥的,遇到问题会很麻烦。但是,最后你找出问题时的那一下会很爽,我觉得你得找到这种感觉,它可以支持你接下来又枯燥很久,这样才能深入地坚持下去。

最后,小编推荐你关注丁奇的《MySQL 实战 45 讲》专栏。在专栏里,丁奇会帮你梳理出学习 MySQL 的主线知识,比如事务、索引、锁等,还会就开发过程中经常遇到的具体问题和你分析讨论,并且帮你理解问题背后的本质。你会收获 MySQL 核心技术详解与原理说明和 36 个 MySQL 常见痛点问题解析。

现在订阅,限时优惠¥68原价¥99,12 月 18 日恢复原价。


点击「阅读原文」,试读或订阅专栏

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接