如何設計並實現一個 DBMS?
請問有沒有相關書籍講如何設計並實現一個DBMS
Stanford的那本書入門做個課程作業啥的夠了。 然後Jim gray的書參照著實現產品系統的細節。然後David lomet的論文弄明白blink tree怎麼實現細節。 再weikim的書弄懂實現redo/undo log的細節. 事務和故障恢復根源都是aries 這篇論文。到此單機版的dbms 沒啥問題了。
如果做replication,那就得去讀分散式演算法的書了。但大多沒實現細節。所以你得去讀mysql 或者postgres的replication源碼實現了。
再然後你想要跨data center, 你可以去讀google spanner的實現細節。由此引出paxos你可以去好好讀讀。 Stanford 搞出來了個raft代替multi paxos你也可以藉此機會好好研讀。
Nosql都不是dbms。什麼Hbase, Cassandra, mongodb 源碼別去看,看了誤導你。 MySQL 看就看innodb實現,Postgres 倒是全讀不錯。
另外推薦個輕量級的資料庫,基於Jim gay 和weikum兩本書實現的。產品級的項目,還開源。邊看書邊讀這個db你就基本上什麼都會了。項目名叫 affinityng
Database System Concept 和 Database System Implementation 是兩本不錯的書,但是大家好像只提到了書,卻沒有說該怎麼做。寫一個資料庫,路徑的選擇很重要,否則很容易放棄。推薦這樣的路徑:
1. 資料庫是一個後端server,因此網路通信,如何並發處理多個客戶端連接,收發數據,是首先要解決的問題。這個問題比較簡單,不再贅述。
2. 資料庫最基本的工作模式,是接收並理解一段代碼,根據這段代碼的邏輯,往伺服器上寫入/讀取一些數據。因此,最基本的模塊有兩個,一個是代碼的解釋和執行, 一個是數據存儲。
a.sql的解釋和執行,可以用lexyacc簡單寫一個語法解析器,一段sql發過來能夠正確轉換成內部結構體;再圍繞這些內部結構體,寫出語義分析代碼,最終將sql轉換成對存儲模塊的調用。
b.存儲模塊,除了設計好供上層調用的API,重點解決兩個問題:1. 構建B樹,管理一張表的數據; 2.將整顆B樹持久化到磁碟/從磁碟中讀取B樹數據。一般的做法是一個B樹節點對應一個數據塊,一個數據塊對應多條記錄,以及相鄰B樹節點的數據塊地址。 以數據塊為單位寫入,讀取。為優化資料庫的讀寫性能,需要在設計緩存和日誌模塊,將數據塊緩存到內存,作為讀取操作的緩存;日誌則用來優化磁碟數據寫入,將寫入數據塊時的隨機寫磁碟,轉換為寫日誌的順序寫磁碟,如果宕機能夠根據日誌恢複數據塊。在保證數據持久化的同時提高磁碟寫入性能。 c.存儲模塊寫好後,還需要一個元數據模塊,來描述各數據塊對應的庫表,和資料庫中記錄的語義。簡單的做法,可以把業務表的定義放在配置文件中,系統啟動後即載入配置文件,將庫表定義放入內存,用來解釋數據塊內容;如果還要支持DDL,即根據SQL語句創建/修改表結構,則可以從create table這條sql的實現入手,去構建元數據的管理模塊,一方面做到根據元數據解釋數據塊;另一方面做到將元數據持久化。3. 事務支持。事務這套理論,用來解決多用戶並發操作相同庫表時,操作的一致性問題。理想的情況下,資料庫系統最終需要讓多個並發操作的結果,能夠等同於將這多個操作,進行某種串列排列後執行的結果,即並發操作的可串列化,但是實際上達、做到這一點成本很高,資料庫系能會很差,所以事務理論定義了4種隔離級別,對一致性做了一些妥協,來保證並發讀寫性能。單機資料庫下,事務機制不管從理論還是實現,都已經非常成熟,但要做好並不容易。
這三步完成後,一個支持SQL的,具備事務能力的,RDBMS基就成型了。但這只是玩票級別,真正能夠用於生產環境,還有很長的路要走。一個成功的,達到工業強度的RDBMS,在我看來,至少需要過這幾關:
1. 設計能力。 比如,如何設計好資料庫的體系架構,能夠應對訪問壓力,對CPU、內存和磁碟IO做有效的管理,宕機後能夠迅速恢復並不丟失數據;又比如,如何設計好代碼層次結構,在不斷添加新功能時,還能夠控制代碼的複雜度。
2.代碼質量。資料庫系統,對代碼質量的要求,無需多言。但要做好很難,首先sql種類很多,而sql的靈活性也很大,單是select sql,要測試完整恐怕沒有幾萬個測試用例是搞不定的;事務模塊的測試,需構造各種並發場景,對各分支判斷進行檢查。還有宕機情況下的數據可靠性,以及一些高階功能,如MVCC,查詢優化的效果等,都是要花大成本才能保證代碼質量的。
3.運行環境和對業務的支持。大型通用的資料庫軟體,應該能夠兼容多種硬體環境、操作系統;標準的api介面,以及外圍的運維工具,如導入導出、性能分析、數據恢復等等。都不是容易的活。總之,做一款資料庫容易,但打造一款能夠到工業強度的則很難,要做到大型通用,就更加困難了。基礎軟體領域這麼多年,開源資料庫能用的也只有Mysql和PG兩款,可以看出做資料庫之難。
做好資料庫很困難,用好資料庫也不容易。在雲計算的時代,雲資料庫是趨勢,使用雲資料庫,可以讓開發團隊專註於業務的開發,把資料庫的管理和運維問題,交給雲計算公司即可。UCloud的雲資料庫產品:UDB,多年來一直以穩定可靠、方便易用、性能碾壓競品這三點,而擁有良好的口碑。2016年UDB團隊推出了分散式資料庫產品:UDDB,有效解決了單機資料庫使用中遇到的容量和性能問題。UDDB產品並不是一款重新打造的NewSQL,因為耕耘資料庫領域多年的我們,深知做一款工業強度的資料庫產品之難。所以,UDDB底層存儲復用了UDB,而上層採用成熟的資料庫中間件技術,來做到讀寫分離、垂直分表和水平分表,覆蓋了大多數分散式資料庫的需求,能被應用於各種業務場景。目前UDDB已經正式上線,歡迎測試和使用。瀉 @邵成 葯……這是我們這學期課程作業。
以SQL資料庫為例。書是《database system concept》,機械工業有中譯,翻譯水平一般。然後可以參考Stanford的一套課程CS346,裡面有比較清晰的系統結構劃分。CS346 - Database System Implementation最後可以參考github上一些源碼,大的設計思想去讀SQLite的源碼。
另外帶個私貨……馬上就要搞完的一星期糙快猛資料庫……https://github.com/badpoet/SQLeast如何自己實現一個關係型資料庫? - 編程 - 知乎 其中有一些討論,供題主參考。很多時候,我從數據流來思考和尋找問題的解決方案,DBMS或許也可以如此。
《Database System Concept》
除了那個Database System Concept,補一個Database Systems : The Complete Book,或者光看這本書的下半冊Database System Implementation也行。
Database Systems (豆瓣)
Database System Implementation (豆瓣)這個是幾年前開始做資料庫的時候,同事推薦他在Stanford上學時用的書,書本身內容還是不錯的方方面面都有介紹,不過這種書細節不會特別多,遇到某個問題不清楚的時候大概看一下。其實很多時候還是直接看看人家別人的資料庫是怎麼做的來的更直接。發一個SB代碼。。。完全是自己亂寫的沒參考什麼書。。。所以基本上只能作為一點對設計架構的參考,實現什麼的就不要care了。。。
也是我們這學期的大作業23333。。。
codewdy/mymymysql · GitHub(其實就是小透明求關注,沒啥水平)看成了BDSM。
哈哈,剛好最近正在研究資料庫這方面的相關知識,故厚著臉皮前來回答,如有回答得不對的地方,還望各位拍磚的時候輕一點。作為一個剛入門的資料庫菜鳥,雖然學藝不精,但我覺得有一些經驗還是可以拿出來分享一下。//--------------------------------------正文-----------------------------------------------------------------------------------------先回答題主的問題,有,就是樓上有人推薦的那一本《資料庫系統實現》。。。。。。。。。。。。。你以為這樣就完了?NO,實際上下面才是我要說的重點。
首先我不知道題主關於資料庫這方面的相關知識掌握得怎麼樣了,不過從題主問的這個問題,我大概可以默認題主跟我一樣也是剛入門不久的資料庫菜鳥或者是想要入門的。
雖然《資料庫系統實現》這本書是本非常經典的書,但是你要知道資料庫系統作為一個非常的大型軟體系統,其中涉及了許多方面的知識包括像SQL命令解析、查詢優化、查詢執行、查詢緩存、底層存儲等,而這一些知識自然不可能在一本400來頁的書裡面全部給你講清楚。所以你如果想要真正設計並實現一個可靠的DBMS,那麼除了這本書以外,你至少也要了解磁碟存儲的相關知識以及各種RAID技術等,另外《資料庫系統實現》這本書只能說是在大體上給你說明實現一個DBMS的思路,具體的細節方面還是需要你去研究各類開源DBMS的源代碼。話說得有點多,總之我的意思大致就是如果你想要設計並實現一個DBMS的話,基礎要紮實,勤研究代碼。推薦一下具體的書籍:《大話存儲》---&>《資料庫系統概念》/《資料庫系統實現》---&>各種資料庫代碼研究書籍《資料庫系統實現》
資料庫系統實現
先用好DBMS
推薦閱讀:
※國內哪些互聯網公司使用了 Cassandra 資料庫?
※一個不聰明但勤奮好學能吃苦的女孩紙 適合做DBA嗎?
※OLAP中roll-up和drill-down和slicing?
※GPU 資料庫 MapD 性能超傳統資料庫 70 倍,資料庫瓶頸不是 IO 嗎?
※中國市場上不同類型的資料庫各佔多大比例,他們各自都是哪種類型的公司在使用?
TAG:資料庫 |