对数据库和分布式很感兴趣,学习路线是什么?

本人现大三,刚拿到北航直博名额,今后从事数据库方向。
关注者
4,073
被浏览
797,459

77 个回答

我看这问题已经是一年多前提出的了,想必题主现在已经是开始了自己的博士生涯。 看到其他答主已经列举出相当多学习资料以及知识点等内容,我就不再在这方面赘述,而是通过我自己读phd的经验以及近一两年工业界的些许经验讲讲我在数据库方向上的理解。

首先读phd的话不一定要选数据库。。。比如如今人工智能方向已经如日中天,从paper数量、影响力以及就业机会等方面来讲都好于数据库等其他一些系统方向。然而既然题主把范围设定在数据库方向上,那我们就单聊数据库。

我读完phd且工作一段时间后的最大体会是,数据库是一门工程驱动的科学,从这一角度来讲读完master去公司从事数据库开发学习到的东西也许并不会少于读phd。通过跟不同公司工程师的对话,我发现要能写数据库系统并不要求拥有phd学位,毕竟实践出真知。然而我认为读数据库方向phd最重要的是对数据库系统大局观的培养。换句话说,就是读完phd你知道的东西并不应该是一个topk算法或者knn算法怎么进行优化,抑或是concurrency control有多少种写法,而是应该理解数据库是如何运作的,并且人们为什么这么设计数据库。哪怕你的研究方向具体到如何在multicore/cluster/gpu上实现join算法,你也应该需要掌握更高层次的知识,例如整个OLAP设计的原理是什么(比如具体到optimizer如何estimate cardinality以便优化算法),或是不同硬件如何优化(比如具体到simd如何做cache的优化,GPU如何做pipeline等)。

数据库基本理论的研究已经基本完成,因此我并不认为利用一些不切实际的研究理论去搞数据库的传统模块很有前途。就拿我自己在phd阶段研究的事务处理来说吧。我读phd的时候可以算是concurrency control重新火起来的几年,其中重要的原因是内存数据库与确定性数据库的兴起。那段时间内多篇paper去研究了如何去重新优化OCC算法,如何优化logging等等,然而到今天回过头来看,这些方法并没有真正被工业界所采用。抛开工业界对snapshot isolation以及2PL的痴迷不谈,我认为导致这结果的最重要的一个原因就是这些paper采用了一堆仅仅在学术圈理论提出的方法,例如限定于使用存储过程、利用程序分析抽取read-write set、切分程序(transaction chopping)等等。工业界的选择决定了一个学术研究方向的兴衰。因此这两年我们已经很难看到这类方法在顶会中出现了。

数据库理论研究的基本完成并不意味着这里并没有更多的东西可以去探究。如果你要去研究如何从理论角度提升paxos或是理论角度提升2PL,那我觉得基本没戏,因为这些东西都已经通过严格的证明确认的它们的正确性、可用范围以及tradeoff等等。尽管如此,我们仍然可以通过三个方面去探索:(1)新硬件;(2)新的数据场景;(3)人工智能。

任何科学的发展都是螺旋形上升的。对于系统来说,推动发展的最直接的方面就是新硬件。我依然清楚的记得在我读phd第二第三年的时候我老板曾提出研究GPU/FPGA数据库。现在想来才能理解老板是多么有前瞻性。新型硬件系统,包括GPU,FPGA,NVRAM,高速网络等等都可以让我们就机会重新设计与实现现有的数据库模块。就拿NVRAM来说,尽管尚未普及,无数的paper已经通过模拟器去重新设计各个重要模块,包括logging,index等等。这些被人做了也没事,毕竟通过调研,我们总是能够找到一些尚未被研究透彻的硬件(例如xeon phi,apu),然后实现一些新的方法。当然要做这类研究一个前提是你得找个有钱的老板。毕竟硬件更新换代太快,读phd五年时间够换代一两次的了。

除了新硬件之外我认为最重要的就是场景了。场景包含了很多方面,比如数据量,数据类型,部署环境等等。各大公司所推出的新型数据库无不是被新的场景所驱动。例如spanner的提出很重要的一个动机就是保证全球一致性,aurora的提出是要在云环境下保证无限扩容、高可用等等。还有时序数据库的兴起也是因为近些年对IoT的追捧。尽管这些公司近几年也发了几篇industry track的paper,但我认为看这些paper对phd的研究并没有太直接的帮助,毕竟对于公司来说,用的还是传统的方法,而最大的难点在于如何实现高效且易用的这类新型数据库。比如aurora把log放到storage节点这个核心思想初衷就是一个工程问题,而并非学术问题。对于phd来说,可以做的方向我认为是给定了这些场景(比如aurora做log的方法),如何优化性能(比如如何结合一致性算法与concurrency control算法)。新型的数据类型比如时序数据库更多的是要学会如何利用数据的特性进行优化。我觉得想要做这方面的研究,最好跟工业界合作,毕竟他们有真实的场景及数据。

我当初做peloton的时候曾无限鄙视过人工智能这一想法,认为用人工智能做数据库简直是对数据库的侮辱(逃。好吧近几年的ML+DB热潮也是把我打脸了。当然随着我对机器学习更加深入的理解,我认为这的确是一个好方向。现有数据库系统的很多模块的设计对数据无感知。这些数据库模块bound了worst case,但并没有给出最优解。使用机器学习等方法无疑会促进数据库领域的发展。具体在这里我就不展开了,让我们拭目以待好了。

在读phd阶段,一个重要的问题是是否需要重新搭建自己的数据库系统。我认为在现有开源商用系统能够满足你的研究方向的情况下,最初阶段的研究是完全可以基于现有系统的。毕竟这些系统已经经过验证,学习这些系统的代码可以让你更加清楚的了解数据库设计中需要讨论的各种细枝末节。当然,当具有一定经验之后,的确可以去从头开始实现一些小的模块。但就我个人经验来言,phd阶段实现的系统最终多数会沦为玩具,并不会真实被工业界所使用,毕竟自己并没有那么多经验与时间去维护它们。当然了,亲手搭建这些玩具还是很有乐趣的。

以上仅仅是我一些浅显的观点,希望对各位有所帮助。也欢迎大家能够一起讨论:-)

深夜倒时差睡不着,上来写写

对传统数据库不太了解,毕竟不是科班出身。

对分布式系统学习还是有点心得,理论基础要打牢。


1. 从存储系统入手,Google 的老三篇入门,最好能顺手把 6.824 做了,不难,智商正常的本科生都能做完,另外推荐一本书 Distributed systems for fun and profit

2. 做完 6.824 后就可以从复制协议开始入手, Paxos 的几篇,Lamport 那篇有空膜拜一下好了,真正有价值的是 Paxos made live / Paxos made simple 那几篇,然后可以深入看看 Raft, 这个在 6.824 里面会用到.

3. 然后开始开非 Google 系的存储系统比如 Dynamo ,Haystack 啊什么的还有一些最终一致性的系统,比如 FB 在一些系统上的设计虽然没有 Google 那么 fancy,但是看看还是不错的,至少知道在 FB 的数量级下会遇到那些问题,如何用糙快猛的办法 workaround。。。 和一些分布式计算系统和流计算系统,比如 MR 就不说了,比如 Dremel 啊,Spark 啊,MillWheel 啊,Sawzall 啊

4. 把 SQL 优化器的一些基础知识学会咯,然后尽量用分布式系统的思想去思考。然后有点感觉了以后,可以看 F1 和 2017 的 Spanner 那两篇论文找找感觉,毕竟比较简单。然后就可以去找一些 OLAP 系统的论文看看了,HyPer 有一堆论文,Impala / Presto / Kudu 啊, AsterixDB 啊什么的,这个领域就多了去了。

5. 这时候就可以开始实践了,自己动手撸没啥意思,而且工程量巨大无比,我建议还是要和靠谱的团队一起工作,进步很快,比如暑假没事或者实验室老师不管的话可以来我们这边实实习啊,毕竟鄙司是分布式系统和数据库技术融合得很不错的公司,离你们学校又近,打个车 20 分钟就到了,我的邮箱是 huang at pingcap.com,不过建议还是你把邮件发给 shenli,毕竟我推荐没有 iPhone 拿,他是有的...有机会未来见。