leveldb 文档 impl.html 阅读记录
該文檔主要說明leveldb使用到文件,以及分級和文件合并的邏輯
leveldb的實現原理和Bigtable類似,不過在文件結構組織上存在著差異。
每個數據庫的文件都存儲在單獨的目錄結構下面。
文件
日志文件
日志文件 (*.log) 按序保存著最近的操作。每一個更新都會被追加到日志末端。當日志文件大小達到預先定義的大小,就會被轉化成一個 sort table,并且會創建一個新的日志文件用于新的操作。
當前日志文件在內存會有一份拷貝 memtable。每次查詢操作都會讀取該拷貝,所以讀取操作每次獲取到最新的被記錄的操作。
Sorted Table
一個 Sorted Table (*.sst) 按照 key 的字母序保存著記錄序列。每條記錄中保存的是 key 對應的 value,或者是一個刪除標記。
Sorted Table 安裝層級組織,每個層級都會有一系列這樣的文件。由日志文件生成的 Sorted Table 會被放在年輕的級別上,也就是 level-0。當年輕級別上的文件數超過限制后,所有年輕的文件會被和 level-1 有重復的文件合并,生成一系列新的的 level-1 文件。
在年輕級別的不同文件中可以存在相同的key。然而在其他層級的文件中不能包含重復的key。設字母 L 表示層級的層數 (L>=1)。當合并生成 level-L 的文件大小超過 (10L)MB 的時候,所有 level-(L+!)有重疊key 的文件都會被合并以生成一系列新的 level-(L+1)的文件。為最小化昂貴的seek開銷,這些merge操作通過批量的讀寫操作,逐步的將新的更新從young level遷移到最大的level下。
Manifest 清單文件
清單文件記錄每一級的 Sorted Tables,及對應的 key 的范圍和其他重要的元信息。每次重新打開數據庫都會創建一個新的清單文件。清單文件的格式和日志差不多,服務狀態的改變都會被追加到這個日志文件中。
Current
指明當前使用的清單文件名稱
Info logs
Informational messages are printed to files named LOG and LOG.old.
Others
Other files used for miscellaneous purposes may also be present (LOCK, *.dbtmp).
Level 0
當日志文件超過一定大小后:
- 創建一個新的 memtable 和日志文件用于記錄新的操作
- 后臺操作:
- 將舊的 memtable 的內容寫到一個 sstable 中
- 廢棄舊的 memtable
- 刪除舊的日志文件和舊的 memtable
- 把新的 sstable 添加到 level-0 里
Compactions,壓縮
當 level-L 的大小超過限制的時候,會在后臺線程對其進行壓縮。壓縮操作會選擇 level-L 的一個文件以及 level-(L+1) 有 key 重復的文件。在壓縮后,舊的文件會被廢棄。注意:由于 level-0不同文件中可能存在重復的key,所以需要特殊處理。壓縮 level-0 時,可以選擇多個文件。
合并將選中的文件生成一系列新的 level-(L+1)層的文件。如果新生成的文件中,有達到限制,我們會切換到該文件繼續新一級的合并。如果正在生成的 level-(L+1)文件包含 key 的范圍已經和 10+ 個 level-(L+2)文件有重合,也需要繼續往下合并,這樣可以保證后面的合并不會涉及太多的文件。
舊的文件會被廢棄,新的文件會被添加的清單文件中。
每一個層級的壓縮都是在 key 區間內輪轉的。比如在 level L ,合并后會將合并文件的最后一個key tmp記錄下來。下一次合并的時候,就從tmp往后的第一個文件開始(如果沒有這樣的文件,那么就重頭開始)
壓縮時會刪除重復的值。并且將廢棄那些包含刪除標記的key。
Timing
Level-0 壓縮最多會讀4個 level-0的文件,最差情況加會使用所有 level-1 的文件。那么就是讀 14M 寫14M。
非level-0的壓縮,會從 level-L 選擇一個 2M 的文件。最差情況下,會有 12 個擁有重復key的 level L+1的文件——(10 是因為 level-L+1 的文件大小是 level-L 的10倍,另外2 是因為 level-L 的文件一般是沒有對齊的)。因此合并操作需要讀26M數據寫26M數據。假設,磁盤IO操作是 100M/s,最差情況壓縮需要0.5s。
如果限制后臺寫的速度,10%的速度,那么一個壓縮操作需要5s。如果用戶以10M/s的速度寫入數據,那么就會有大量的 level-0 文件產生(會有50個)。這可能會顯著增加讀操作的開銷,因為每次讀操作都需要merge更多的文件。
解決方案1:為了降低文件問題的影響,我們可以提升日志文件轉換層level-0文件的限制。負面影響是,需要更多的內存保存對應的 memtable.
解決方案2:當level 0下的文件數上升很快時,我們可以人為地降低寫操作速率。
解決方案3:盡量降低merge的開銷。由于大多數的level 0下的文件的block都已經緩存在cache里了,因此我們只需要關注merge迭代過程中的O(N)的復雜度。
轉載于:https://www.cnblogs.com/kkfnui/p/leveldb-wen-dang-implhtml-yue-du-ji-lu.html
總結
以上是生活随笔為你收集整理的leveldb 文档 impl.html 阅读记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET MVC4 部分视图
- 下一篇: 丑数问题