如何從零寫一個kv資料庫?

還在上學,想自己試著寫一個kv資料庫,不知道憑自己的水平能不能實現,求大家給點建議和方向


我感覺 @Leviathan 的答案更像是"如何從零寫一個kv伺服器",而不是「如何從零寫一個kv資料庫」。我理解題主的重點應該是 kv 存儲引擎吧。

kv 存儲引擎底層無非就那麼幾種數據結構:bitcask, LSM Tree, B Tree 等等。其中 bitcask 應該是最好理解也是最容易實現的,無非就是一個哈希,不做優化只有幾百行代碼。

題主可以從 bitcask 寫起,然後分析 bitcask 的優劣,再去考慮其他結構相比 bitcask 解決了哪些問題,產生了哪些新問題。

幾個代碼參考,都是代碼規模不太大方便閱讀的:

Leviathan1995/Biu 幫 @Leviathan 打個廣告,這裡面有比較純粹的 bitcask 實現。

douban/beansdb 豆瓣的基於 bitcask 的分散式 kv,但是中間為了方便數據同步用了哈希樹,還有一些雜七雜八的東西,稍微複雜一點。

leveldb 這個太有名了就不放鏈接了。LSM Tree。

weicao/cascadb buffered B Tree

另外國外還有人寫過一系列博客,教你如何實現 kv 存儲引擎:Implementing a Key-Value Store

正好我最近也在寫一個 kv 存儲引擎,與題主共勉。


如果是實現一個KV存儲引擎,可以分步驟來實現:

第一步:實現一個內存版,支持單線程的BTree數據結構,當然可以選擇其他數據結構,比如Hash Table,或者LSM

第二步:在第一步的基礎上,實現支持多線程的Btree數據結構。可能需要了解一下,BTree加鎖的方法

第三步:前面兩步實現了內存版的BTree,這一步實現另外兩個功能,在關閉程序時,將內存中的BTree寫入文件;在啟動程序時,從文件中讀取BTree到內存中。這一步就要涉及到文件格式的設計,現在選擇的方式很多,這裡不展開。

第四步:上面三步實現了一個可序列化的Btree數據結構,只在程序結束時保存數據到文件中,但是內存是有限的,往往不夠用,因此需要實現一個後台線程,這個線程要監控內存的使用情況,如何內存不夠,就將內存中的數據寫到文件中。除此外,還需要修改一下此前的數據結構,使它能夠同時支持在文件和內存中查找數據。

第五步:實現事務。資料庫事務有四個特性,就是ACID,原子性,一致性,隔離性,以及持久性。這些就要涉及到資料庫日誌文件,另外還有資料庫並發,以及資料庫的恢復,這些比較複雜,需要一段時間學習和理解。

第六步:添加檢查點功能,checkpoint是資料庫恢復中的一個很重要的功能。可以算是資料庫日誌的一部分,我單獨分出來,是因為實現好有點難。關於它的原理可以去看資料庫恢復相關的文章。

第七步:優化。前面六步只能實現一個簡單的kv數據存儲引擎,還需要不斷優化才能保證它正確,穩定以及高效地運行。

以上七個步驟是從零到一實現一個KV數據存儲引擎的基本步驟,希望能幫到你。


adamierymenko/kissdb

github上一個簡單的kv實現。

進階可以參考LevelDB,代碼看不懂可以參考淘寶那岩寫的源碼閱讀資料,另一個大佬詳細版的資料leveldb。CSDN上也有很多LevelDB相關的資料,自己學會甄別。

如果LevelDB的代碼熟悉之後還想做進一步的了解,可以看看facebook的RocksDB等變種,也可以Google Scholar搜一些LevelDB相關的論文,實現這些論文的改進,與論文給出的測試結果對比。


還在上學,想自己試著寫一個kv資料庫,不知道憑自己的水平能不能實現

假如題主是計算機專業的, 寫一個簡單的kv資料庫還是不難的.當初我打算寫一個編譯器的時候也是感覺自己水平不夠,後來發現flex bison 這些工具都是現成的, 後端再加上llvm, 自己如果明白整個原理,把它們組裝起來還是不難的。

實現kv推薦題主底層用rocksdb或leveldb, 可以考慮自己實現redis協議,這樣redis的客戶端可以直接拿來用,就不用自己寫了,甚至網路庫也不用自己寫,直接使用開源的libevent, libuv就行。中間加一個proxy,用來對客戶端的請求進行處理,對一些簡單的部分可以做一些優化, 比如負載均衡.後期實現還可以加一個monitor,可以用來解決hotkeys等一些周邊問題。

下面是我自己畫的一個圖,供題主參考。

遇到瓶頸可以參考一下antirez/redis 的代碼,或者參與國內的一些kv項目,有什麼設計實現的問題可以在issue里提,比如ideawu/ssdb,Qihoo360/pika。 pika項目我貢獻過幾個pr,雖然都是幫助實現幾個命令,並沒有參與到核心的代碼,但也幫助我理解了整個項目的原理,


MIT 6.824: Distributed Systems 6.824 Home Page: Spring 2017

其中一個lab就是做一個distributed kv service。不過這個課主要focus在如何做distributed上


題主可以從最最基本的那種做起,就是只做處理網路得代碼,存儲引擎直接使用個字典類型,這樣就是得到一個nosql資料庫了

至於後續的優化,就需要題主自己參考其他開源項目啦


看redis


題主說了是零基礎

那麼最好先學學各種數據結構

比如hashmap

treemap

等等


先去了解一些開源代碼如Mysql


推薦閱讀:

區塊鏈和分散式資料庫有什麼本質不同?
設計的時候,如果去掉外鍵關聯,postgresql和mysql,哪個更有優勢?
為什麼新的分散式資料庫又開始支持關係模型了?
適合初學者學習資料庫的書有哪些較好的?
MySQL有什麼推薦的學習書籍?

TAG:資料庫 | Redis | NoSQL | 資料庫原理 |