NoSQL中memtable機制的改進

2021-06-14 17:50:42 字數 2109 閱讀 5666

現有的主流的nosql儲存系統,如cassandra、bigtable、hbase等在ram中直接使用跳表、佇列或者樹結構等方式來管理key/value鍵值對,整個key/value集合被稱為memtable。當memtable中的資料大小達到閾值的時候會被寫入磁碟。因為使用者的寫操作都是將資料寫入memtable,為了避免memtable中的資料在轉存到磁碟時導致使用者寫操作失敗,在轉儲之前memtable會將所有資料轉存入乙個immutable memtable,清空後的memtable繼續響應使用者的操作,immutable memtable負責將資料轉存到磁碟,當資料轉存完成以後,immutable memtable就可以刪除了。

之所以採用memtable策略而不是把資料直接寫入磁碟有以下的好處:

1.加快寫入的速度。把資料寫入記憶體的速度要比寫入磁碟的速度快幾個數量級。

2.加快讀的速度。資料存在記憶體中,讀取的時候直接從記憶體讀取,避免了磁碟操作,提高了讀的效能。

3.提高資料寫入磁碟的效率。將多個資料一次寫入磁碟要比多個資料分開寫入要高效的多,因為多個資料一次寫入避免了每次寫資料時的磁碟尋到開銷。

以上這種方式中,memtable閾值的設定是乙個問題。如果memtable的閾值設定的過大,會有以下的缺點:

1.資料轉儲到磁碟的時間過長,會影響到這個期間其他執行緒或程序的讀寫操作;

2.當immutable memtable中的資料都轉存到磁碟以後,memtable中沒有新資料寫入的時候,會導致記憶體中短時間內沒有可用的有效資料,從而導致大量的讀操作需要進行磁碟訪問,從而形成乙個讀操作的效能低谷。如果memtable的閾值設定的太小,會有以下的問題:

1.記憶體的利用率會偏低;

2.在記憶體中有效資料較少,導致很多讀操作需要去訪問磁碟;

3.因為閾值較少,會導致資料轉存到磁碟的操作頻繁法發生。

為了解決以上的問題,本文設計了一種多memtable的方案。該方案的核心思想就是系統執行的時候可以在記憶體中最多同時存在n個memtable。在系統執行過程中,開始的時候資料會儲存在第乙個memtable中,當該memtable的資料存滿以後會把資料儲存在第二個memtable中,當第二個memtable儲存的資料量達到閾值時,會以此類推的存在下乙個memtable中。當n個memtable的資料都存滿以後,會把最老的乙個memtable(也就是第乙個memtable)的資料轉存到immutable memtable中,然後執行資料從記憶體轉存到磁碟的操作。

假設在多memtable方案中每個memtable的大小為m,傳統單memtable方案中每個memtable的大小為m,那麼只要保證滿足以下兩個條件,就可以保證多memtable方案有以下的優勢:

i mii.(m/m)*n>1

1.資料轉儲時間比單memtable方案短;

2.記憶體利用率高;

3.即使剛發生完轉儲也不會出現因為記憶體中可用資料較少而導致頻繁讀磁碟操作。

如前所述,在本文中資料寫入記憶體中的memtable中即可認為寫操作完成。本儲存系統使用了多memtable機制 。 以2個memtable 為例說明從開始儲存到轉儲的整個過程。如圖 所示,資料首先被存放在memtablea中,當memtablea存放的資料量達到閾值會把新寫入的資料存放在memtableb中;當memtableb存放的資料也達到閾值的時候會把memtablea的資料存入immutable中,為接下來的轉儲做準備 ;同時會生成乙個新的memtablec來儲存新寫入的資料。

在資料寫入memtable的時候,日誌會把相關的操作記錄下來,防止斷電造成的資料丟失;當資料從記憶體轉儲到磁碟以後,相應的日誌會被刪除。

值得一提的是,這裡的日誌是寫在機械磁碟上的,這是因為:其一機械磁碟的順序寫速度較快,效能較高;其二反覆擦寫對ssd的壽命不好。而此處的日誌檔案經常需要進行的是順序寫操作和檔案的刪除操作,只有當出現問題,下次開機恢復的時候才會讀取日誌檔案恢復memtable中的資料,所以此處將日誌寫入機械磁碟既不會對效能造成很大影響,也不會存在壽命的問題。

關於NoSQL中的 mongodb

是一類資料庫管理系統的通稱,這一類資料庫不同於傳統的關係型資料庫 關係型資料庫 mysql 因此 nosql 不同於 mysql 列儲存就是按列進行儲存,屬於高階資料庫 所謂文件儲存,也可以稱按 json 儲存,一段 json 就是一段文件 通常用於快取,訊息通訊等 簡單 沒有原子性,一致性,隔離性...

NoSQL中的redis中的操作Hash的常用方法

每天會在在我的其他文章中更新其他資料型別的操作方法,希望和大家共同成長 1.hset hget hmset hmget hgetall hdel 設定hset的k v 獲取 一次設定多個 一次獲取多個 一次獲取全部 刪除 2.hlen 查詢有幾個屬性 3.hexists key 查詢某個屬性是否在h...

go中NOSQL資料庫操作

nosql not only sql 指的是非關係型的資料庫。隨著web2.0的興起,傳統的關聯式資料庫在應付web2.0 特別是超大規模和高併發的sns型別的web2.0純動態 已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的資料庫則由於其本身的特點得到了非常迅速的發展。而go語言作為21...