對資料庫和分散式很感興趣,學習路線是什麼?

本人現大三,剛拿到北航直博名額,今後從事資料庫方向。


深夜倒時差睡不著,上來寫寫

對傳統資料庫不太了解,畢竟不是科班出身。

對分散式系統學習還是有點心得,理論基礎要打牢。

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 http://pingcap.com,不過建議還是你把郵件發給 shenli,畢竟我推薦沒有 iPhone 拿,他是有的...有機會未來見。


分散式的學習不是很了解,資料庫有些經驗

可以按照如下步驟學習

1. 入門:

接觸過資料庫的基礎知識和應用之後,就可以開始進行內核級的學習了,先學習傳統的關係型資料庫,因為它是一切資料庫的基礎,包括現在比較火的內存資料庫,分散式資料庫等。

從IV Database System Implementation開始,把這本書吃透了,包括數據的物理存儲結構,索引,查詢引擎,緩衝池,SQL編譯,查詢優化,系統恢復,並發控制。然後實現上面這些理論知識,完成一個支持簡單DML,DDL的資料庫。一定要實現,只是學習理論,不動手實踐是不可能深刻理解的,就像空中樓閣。

《資料庫系統實現(英文版)(第2版)》([美]加西亞·莫利納,等)【摘要 書評 試讀】- 京東圖書

http://dsm.fudan.edu.cn/JSPWiki/attach/Material_db/database%20system%20complete%20book_2nd.pdf

2. 深入理解:

參考這個論文列表,把裡面的論文都讀一遍,了解關係型資料庫歷史,了解資料庫的發展過程中走過的彎路,理解它為什麼會變成現在這個樣子

rxin/db-readings

同時也要鍛煉系統級編程的能力,深刻理解操作系統的工作原理,並行編程,熟悉一些硬體的工作原理,為以後打下良好的基礎。可以讀一些優秀的開源資料庫的源碼,如Peloton的cmu-db/peloton,只有幾萬行代碼,PostgreSQL的,代碼非常多,不過注釋非常清晰

3. 進階

看最近幾年資料庫相關的論文,各個方向的發展都全面了解一下,可以參考這兩個課程提到的論文Schedule - CMU 15-721 :: Advanced Database Systems (Spring 2017),Practical Course: Database Implementation,找一些感覺興趣的論文復現一下裡面提到的方法。很多演算法,數據結構都有一定的適用場景和局限性,要通過自己實現與實驗來深刻體會。

4. 破繭成蝶

這才是讀博最重要的階段,通過之前的學習,應該對資料庫的各個方面都非常了解了,而且也打下了良好的編程能力,可以選1,2個感興趣的方向,看看有沒有什麼可以改進,突破的點,想出自己的idea,實現並與現有的方法進行對比,如果可以做的很好,就非常厲害了。


系統方向,最好的學習方法當然是實踐。有志於此的初學者不妨自己動手分步驟完成這樣一個原型系統:gfs+mapreduce+hive。

這個練手項目可以學習體會如下分散式系統和資料庫的基本概念和組件:

0. server-client

1. RPC multi-thread

2. IO fs persistency

3. consistency

4. replication

5. recovery fault-tolerance

6. master-slave

7. job scheduler

8. data shuffle

9. SQL

10. parser

11. execution plan

以及最重要的,設計API的藝術。

——

補充

1. google之前,分散式社區和資料庫社區井水不犯河水。google(bigtable及同時代的cassandra等)開啟了一個新時代,影響了多數後來系統的設計。之前的分散式系統課,範例講的是NFS!

2. 這個練手項目,考慮到可行性和學習收益,刻意避開了資料庫事務,事務並發控制,時髦的paxos consensus等主題。

3. 最重要的是,動起手來。


多關注資料庫的三大頂級會議, 還有OSDI等.

將motivation和workload作為最根本的方法論。

徹底搞明白存儲精髓WAL+RSM.

好好閱讀經典論文, 搞清楚workload和motivation.

牢記兩個基本觀點:

沒有抽象的技術, 凡技術都有自己適用的應用場景.

沒有廣譜的系統, 凡系統都有自己典型的workload.

建議看先閱讀下面兩本書:

1. Stonebraker的Architecture of a database system.

2. Jim Gray的Transaction.

學習分散式的RoadMap

1. WAL + RSM

2. 研究分散式共識演算法, 因為這個是日誌複製協議的基石: TOB協議, Quorum-based協議(mpaxos, raft), Primary-backup協議.

3. partitioning replication + local storage engine.

4. local storage engine: bdb, innodb, leveldb(可以參考我寫的源碼閱讀).

5. 磁碟和網路優化技術.

6. 分散式一致性(隔離性).

7. 分散式事務: stm, mvcc, 樂觀鎖.

8. 分散式查詢優化.

工程實現超高的編程技巧

1.能夠像haskell那樣impure和pure分離.

2.冪等的設計, 讓部分有狀態的模塊成為metal unit, 同時冪等設計和failstop能夠將有效地避bf.

3.元編程能力, 降低代碼的冗餘和耦合, 代碼更適合擴展和組合.

4.超高的系統編程能力.

5.單測, mock測試設計能力.

6.漂亮的日誌輸出.

7.會做性能分析, 參考大牛博客.

8.會使用docker加速自己的開發效率.

周邊涉及

1.精通MySQL sharding, 不知道它的痛,就不知道為什麼要堅定不移地搞分散式關係資料庫.

2.精通大數據的BI解決方案, 不知道它的痛,就不知道為什麼要搞全新的分散式列式資料庫.

3.區塊鏈,分散式計算引擎也了解一點.

分散式存儲的源碼分析方法(詳情可以參考我的分享)


來我司實習唄


各位大給出的資料和路線(@楊志豐, @Ed Huang )都很好,我再補充一個另外的視角,:

目前做資料庫的主要是2波人:互聯網分散式存儲出身和傳統資料庫出身,二者思考問題可是2個不同的套路,:-)

這個thread中給的大部分資料都是關於前者(如何為一個分散式存儲系統加上資料庫功能)的,而傳統資料庫路線,建議看看如下資料(對我自己幫助很大):

  • 資料庫總論:http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf
    • 介紹經典思路(這個paper有中文)
    • 教材書就可以不看了,時效性較差
  • CMU資料庫課程
    • CMU 15-445/645 :: Intro to Database Systems (Fall 2017),非常適合有工程基礎但是沒有資料庫基礎的同學入門
    • Schedule - CMU 15-721 :: Advanced Database Systems (Spring 2017),討論更高級主題,主要是paper講解
      • 它們2個在youtube上有配上字幕的視頻,還可以提升一下英語
  • 實現上重點看看Postgres
    • pg國內用的人很少,但如果深入對它進行了解,會覺得打開了另一扇窗,有很多特別優良的特性
    • 包括但不局限於如下:
      • 豐富數據類型,更全面的SQL語法支持
      • Plan+Optimizer
      • 模塊化的Executor
      • FDW
      • MVCC,更強的隔離級別
      • PL,可編程性
      • 等等

最後回到樓主是直博本科學生,可以按照@楊志豐給出的路線做一些工程實踐,但不推薦投入大量時間(投入了恐怕也寫不好)。畢竟今後無論是做研究還是工程,都會站在巨人肩膀之上,資料庫也是一個一生之工程(複雜度堪比操作系統),有側重的了解基本原理之後,最後一定是在某個層次上進行自己的創新了。

如上都是自己的一些看法,我自己也是半路出家做資料庫,歡迎大家指正。

--2017-12-05更新--

CMU2017開了一門資料庫新課:CMU 15-445/645 :: Intro to Database Systems (Fall 2017)

難度介於15-415和15-721之間,更適合有工程基礎但是沒有資料庫基礎的同學入門。


比較熟悉資料庫存儲系統,傳統資料庫出身,首先再次推薦《資料庫系統實現》,整體認識一下傳統資料庫是什麼。

其實樓上的大牛們說的都很好了,這裡從細節的角度聊聊存儲層需要關注的問題。

  1. 數據格式:頁面格式,kv,段頁式存儲,文檔格式等需要存儲在磁碟上的數據結構;
  2. 日誌格式:邏輯日誌,物理日誌;
  3. 副本和複製:複製方案(paxos),副本位置,異地複製方案;
  4. 事務模型:可以關注幾個系統,spanner,cockroach,tikv(類似的系統,但是事務模型不同,絕對大開眼界),單機的事務模型也可以關注一下,pg和mysql,oracle,DB2,也不盡相同,還有sharding中間件的事務模型,被廣泛使用,問題也不少;
  5. 數據分區:可以思考一下分區規則和系統設計方面的問題,hash,range,list分區等類型,多級分區,多列分區;
  6. 元數據管理:系統表設計,DDL和DDL變更的設計,表和索引,schema;
  7. 緩存機制:緩存和緩存一致性,資料庫的緩存遍布系統各地,從結果集緩存,執行計劃緩存,元數據緩存,頁面緩存等,在分散式系統內,做全局緩存是比較難的,可以看看memcache等分散式緩存系統,當然不同系統做法不同,也未必都有;
  8. IO管理:傳統資料庫,IO是核心的性能開銷,重點關注讀寫操作和磁碟同步,在分散式系統里,這個問題也很重要,需要仔細權衡在主要邏輯內發生了幾次網路IO和磁碟IO,以及他們的串列並行關係;
  9. 備份和恢復:全量備份,增量備份,日誌歸檔,日誌回放,並行回放(關注一致性)
  10. 其他需要關注的點:rebalance,resharding,並行,支持的數據類型;

分散式系統更多的關注存儲,其實sql引擎也很重要,但是個人了解有限,就不獻醜了。具體也要結合你的研究方向,希望能有幫助。

PS,實習真的是一個很好的方法,解一個bug就可能讓你上上下下熟悉系統的很多層面,而且有人交流和請教,實際上研發測試,提高會非常快。


Traditional vs. Modern Database Systems


是保研嗎,為什麼要選直博,做人要給自己留餘地啊


既然是準備讀博,而且選擇了資料庫方向,那麼我假設你是有一定的基礎的。

可以先閱讀一些資料庫領域的經典論文,弄清楚這個領域內的一些基本問題。

同時可以選一門網上的課程,最好是國外大學的,跟著課程做一些Project,鍛煉代碼能力,System方向的博士對代碼能力還是要求很高的。

另外,在AI這麼火,論文特容易發的情況下,選擇讀System方向的博士,看來是真愛,祝好


先看完資料庫原理,然後你還有興趣的話,再來問吧。。。


貌似大數據出現之前

就有分散式和資料庫了吧

樓上的幾位無一例外的推薦gfs,hadoop時代的東西


說說我學習的一點體會吧,主要是資料庫領域,以下兩點:

1.資料庫的應用

使用並熟悉一兩種資料庫,推薦開源的MySQL或PostgreSQL

書籍可以參考國內王珊的《資料庫系統概論》,國外的《資料庫系統概念》

2.資料庫的實現

參考《資料庫系統實現》,斯坦福大學資料庫高年級教材。

MIT的論文集,小紅書,Readings in Database Systems ,有關資料庫方方面面的經典論文。

關注三大會議(VLDB、SIGMOD、ICDE)等最新研究成果。

找一個感興趣點,深入研究,提出自己的方法。

以上內容前面的大牛們差不多都過說了,單說說事務處理方面的。最近正在研究,推薦幾本參考書,不建議沒一點了解直接讀論文。

Jim Gray的Transaction Processing

這個領域最經典的書,好的是很多演算法都有代碼,細節也有,以至於早期資料庫產品在實現存儲時就拿這本書來抄,有相當多的術語也是從這本書來的。但它組織有點亂,語言也比較晦澀(也可能因為翻譯的問題),不容易理解,並且有點過時,看看就行了。

Transactional Information Systems: Theory, Algorithms, and the Practice of Concurrency Control and Recovery,作者:Gerhard Weikum, Gottfried Vossen

這本書內容全面,比Jim Gray的書更有條理。濃濃的學院派味道,每個演算法都有證明,要是寫論文參考這本書很好。

Principles of Transaction Processing, 2nd Edition, 作者:Philip A. Bernstein, Eric Newcomer

這本書基本是從應用層面講事務處理的,不只局限於資料庫(比如可持久化消息中間件也需要一定程度的事務處理)。它比前兩本書都更容易懂,可以從這本書開始。

這三本書出版的時間都比較早,但大體上那些事務處理的經典問題都有涵蓋。想看最新的研究就得去找找論文了。比如Harvard的Determinism Database;並發控制的新演算法,MIT的Silo,CMU的TicToc;怎麼通過MVCC實現Serializable等等。

現在學術界和工業界之間的鴻溝很大,也是一個值得思考的問題。提出能被工業界認可和接受,並能應用到實際商用產品里的方法,這應該是學術界研究的目標之一。要不然,研究者就只能是自娛自樂了。


操作系統原理 分散式系統 資料庫系統實現 最後分散式資料庫系統實現


於是現在的「直博生」真的連學習線路都需要網友幫忙規划了嗎,垂釣開心不。


真正對一個事情感興趣的人,需要問別人路線是什麼? 你應該是在這個領域比任何人走得更遠,以至於所有的回答在你看來都是非常業餘水平的


建議題主諮詢諮詢自己的導師。

據我所知,國內是很少有「資料庫組」做從頭到尾自己搭一個DBMS這種研究工作的。固然學一下DBMS的原理是件非常好的事,但是對於今後幾年你的主業寫論文來說,從頭到尾做DBMS是一件非常費力不討好的事。畢竟這世界上是沒幾個慕尼黑工業大學(HyPer)和阿姆斯特丹大學(MonetDB)的。絕大部分學校的資料庫研究組還是在研究新的問題的,例如其它的數據模型,演算法,隱私,數據應用等等


北航直博貌似對今後從事資料庫方向並沒有什麼幫助...

題主不至於要去搞核高基吧...


我是學資料庫的,在某211學校讀,今年也是大三。主要學的資料庫是Oracle。hadoop,spark是數據倉庫,不是資料庫,二者有很大區別。高贊說到的mapreduce,是數據倉庫的範疇,不屬於資料庫。

題主想要學資料庫,首先要學資料庫系統概念。資料庫的通用語言sql,資料庫的設計原理,關係表達式與sql的轉化,這門課都會教你。這是基礎入門課程。

接下來一門很重要的理論課是資料庫實現原理。設計資料庫如何進行存儲,索引的設計原理,查詢優化,分散式資料庫的原理等。

接下來就是具體的dbms的學習了。傳統關係型資料庫三巨頭ms sql ,MySQL,Oracle。入門學的是mssql,操作的是圖形界面,對新手友好。MySQL,Oracle也有圖形界面的,但是一般使用的是命令行界面。MySQL現在很火,很多互聯網公司用的是這個。但是安全性方面,Oracle都是其他資料庫難以望其項背的。這也是Oracle資料庫軟體這麼昂貴的原因。學習MySQL的話要側重對源碼的學習,最好能對它進行個性化改造。Oracle的話,光是優化就學不完了。

題主是讀博學資料庫,那肯定要接觸資料庫前沿的東西,可以看看資料庫頂級大會sigmod大會的論文,各種資料庫前沿的研究讓人大開眼界。


推薦閱讀:

TAG:分散式資料庫 |