<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一個全新的 kv 存儲引擎 — LotusDB

          共 2595字,需瀏覽 6分鐘

           ·

          2022-04-01 21:07


          經(jīng)歷了大概 4 個月的打磨,LotusDB 的第一個 release 版本終于發(fā)布了,我看了下,有 200 多次 commit(接近 rosedb 一年多的 commit 次數(shù)了)。


          500f256d05a5957b0dce3180a5bc06b4.webp


          項目地址:https://github.com/flower-corp/lotusdb


          有了 rosedb 在 bitcask 模型上的實踐之后,以及自己在存儲這方面的一些經(jīng)驗積累,去年底的時候,在上班路上突然想到的一個 idea,讓我有了做一個新的 kv 存儲引擎的想法。


          有了想法之后便是驗證,因為其實心里還是沒譜,我又在 Github 上翻了翻,并沒有同類型的實現(xiàn)。后來又找一些大佬溝通了下,證明我的想法是可行的。


          這期間還發(fā)現(xiàn)了 Usenix Fast 上的一篇關(guān)于優(yōu)化 LSM 的論文,發(fā)現(xiàn)論文的內(nèi)容跟我的 idea 非常類似,這算是又多了一個理論依據(jù),于是便決定開干了。


          感興趣的可以參考下論文,叫做 SLM-DB,地址:https://www.usenix.org/conference/fast19/presentation/kaiyrakhmet



          眾所周知,數(shù)據(jù)存儲引擎,目前最主流的兩種模型是 B+ 樹和 LSM 樹,B+ 樹在關(guān)系型數(shù)據(jù)庫例如 Mysql 中應(yīng)用比較廣泛,而 LSM 的典型代表 rocksdb 也是大多數(shù)分布式系統(tǒng)數(shù)據(jù)落盤的首選。


          B+ 樹讀性能穩(wěn)定,而 LSM 寫吞吐高,LotusDB 在這基礎(chǔ)上做了一個巨大的改動,就是完全舍棄掉 LSM 中的 SST 文件,改由 B+ 樹來存儲索引,而 value 存放則參考了 Wisckey 和 bitcask 模型的設(shè)計,存儲到單獨的 value log 文件中。


          LotusDB 是對 LSM 和 B+ 樹的優(yōu)勢結(jié)合,目前并沒有同類型的實現(xiàn),我們應(yīng)該是第一個吃螃蟹的人。


          LotusDB 的架構(gòu)圖如下:


          ae2743a37929e3866b345e2a36a231ea.webp


          前臺的寫入和 LSM 完全一致,先寫 wal 再寫 memtable。


          而讀取則會從 memtable 開始,如果 memtable 找到了,直接返回;沒找到的話則從 B+ 樹中查詢索引,然后根據(jù)索引信息到 value log 中獲取 value。


          大家可以先了解個大概,后續(xù)我會出一個完整的《LotusDB 設(shè)計與實現(xiàn)》系列文章,全面解析 LotusDB 的架構(gòu)細節(jié)以及代碼實現(xiàn),目前已經(jīng)寫了幾篇待發(fā)布,歡迎關(guān)注公眾號的后續(xù)更新:


          9dc387724bc6d278dbcbedb28e8a970d.webp

          再來看看 LotusDB 提供的一些基本接口,目前實現(xiàn)了基礎(chǔ)的 Put、Get、Delete 接口,并且支持 Column Family(借鑒于 rocksdb),以及 value log 的自動 GC 回收。


          簡單的使用方法如下:


          package?main

          import?(
          ??"github.com/flower-corp/lotusdb"
          ??"io/ioutil"
          ??"time"
          )

          // basic operations for LotusDB:
          // put
          // put with options
          // get
          // delete
          // delete with options
          func?main()?{
          ??path, _ := ioutil.TempDir("", "lotusdb")
          ??opts := lotusdb.DefaultOptions(path)
          ??db, err := lotusdb.Open(opts)
          ??if?err != nil?{
          ????panic(err)
          ??}
          ??defer?db.Close()

          ??// 1.----put----
          ??key1 := []byte("name")
          ??err = db.Put(key1, []byte("lotusdb"))
          ??if?err != nil?{
          ????// ...
          ??}

          ??key2 := []byte("feature")
          ??// 2.----put with options----
          ??writeOpts := &lotusdb.WriteOptions{
          ????Sync: true,
          ????ExpiredAt: time.Now().Add(time.Second * 100).Unix(),
          ??}
          ??err = db.PutWithOptions(key2, []byte("store data"), writeOpts)
          ??if?err != nil?{
          ????// ...
          ??}

          ??// 3.----get----
          ??val, err := db.Get(key1)
          ??if?err != nil?{
          ????// ...
          ??}
          ??if?len(val) > 0?{
          ????// ...
          ??}

          ??// 4.----delete----
          ??err = db.Delete(key1)
          ??if?err != nil?{
          ????// ...
          ??}

          ??// 5.----delete with options----
          ??deleteOpts := &lotusdb.WriteOptions{
          ????Sync: false,
          ????DisableWal: true,
          ??}
          ??err = db.DeleteWithOptions([]byte("dummy key"), deleteOpts)
          ??if?err != nil?{
          ????// ...
          ??}
          }


          目前自認為 LotusDB 的代碼質(zhì)量比之前的 RoseDB 好多了,單元測試更加完備,注釋清晰,代碼也更加簡潔規(guī)范,如果你是 Go 新手,或者準備學(xué)習(xí) Go,也能夠把項目當做練習(xí)素材,自己對照著來學(xué)習(xí)。


          當然我們的愿景還是打造一個能夠在生產(chǎn)環(huán)境中實際落地的存儲引擎,目前的版本只是一個開始,后續(xù)還會有非常多的工作,包括但不限于:


          ?batch 操作,保證原子性
          ?多個 Column Family 保證原子性
          ?基于 SSI 的事務(wù)
          ?Iterator 迭代器
          ?數(shù)據(jù)壓縮
          ?數(shù)據(jù)備份
          ?index 的分裂


          如果大家在使用或者學(xué)習(xí)的過程中,有任何問題都可以微信聯(lián)系我:



          覺得有幫助的話,歡迎給項目點個 star 支持下!


          項目地址:https://github.com/flower-corp/lotusdb,點擊閱讀原文可直達 repo。

          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产色在线 | 国产aaa级 | 一区二区三区无码高清 | 有在线操逼的网站吗 | 亚洲av先锋影音 亚洲AV一二三区 亚洲sese在线 |