共計 2000 個字符,預計需要花費 5 分鐘才能閱讀完成。
今天就跟大家聊聊有關 Bitcask 模型是什么,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
Bitcask 是一個日志型的基于 hash 表結構和 key-value 存儲模型,但是其簡潔有效的設計。下面丸趣 TV 丸趣 TV 小編來講解下 Bitcask 模型是什么?
Bitcask 模型是什么
1. 日志型的數據文件
何謂日志型? 就是 appendonly,所有寫操作只追加而不修改老的數據,就像我們的各種服務器日志一樣。在 Bitcask 模型中,數據文件以日志型只增不減的寫入文件,而文件有一定的大小限制,當文件大小增加到相應的限制時,就會產生一個新的文件,老的文件將只讀不寫。在任意時間點,只有一個文件是可寫的,在 Bitcask 模型中稱其為 activedatafile,而其他的已經達到限制大小的文件,稱為 olderdatafile,如下圖:
文件中的數據結構非常簡單,是一條一條的數據寫入操作,每一條數據的結構如下:
上面數據項分別為 key,value,key 的大小,value 的大小,時間戳 (應該是),以及對前面幾項做的 crc 校驗值。(數據刪除操作也不會刪除舊的條目,而是將 value 設定為一個特殊的值以作標示)
數據文件中就是連續一條條上面格式的數據,如下圖:
好了,上面是日志型的數據文件,如果數據文件這樣持續的存下去,肯定是會無限膨脹的,為了解決個問題,和其他日志型存儲系統一樣 Bitcask 也有一個定期的 merge 操作。
merge 操作,即定期將所有 olderdatafile 中的數據掃描一遍并生成新的 datafile(沒有包括 activedatafile 是因為它還在不停寫入),這里的 merge 其實就是將對同一個 key 的多個操作以只保留最新一個的原則進行刪除。每次 merge 后,新生成的數據文件就不再有冗余數據了。
Bitcask 模型是什么
2. 基于 hash 表的索引數據
上面講到的是數據文件,日志類型的數據文件會讓我們的寫入操作非常快 (日志型的優勢之一是將磁盤當作磁帶,進行順序讀寫的效率非常高,可以參見這里),而如果在這樣的日志型數據上進行 key 值查找,那將是一件非常低效的事情。于是我們需要使用一些方法來提高查找效率。
例如在 Bigtable 中,使用 bloom-filter 算法為每一個數據文件維護一個 bloom-filter 的數據塊,以此來判定一個值是否在某一個數據文件中。
而在 Bitcask 模型中,我們使用了另一種方法,使用了一個基于 hash 表的索引數據結構。
在 Bitcask 模型中,除了存儲在磁盤上的數據文件,還有另外一塊數據,那就是存儲在內存中的 hash 表,hash 表的作用是通過 key 值快速的定位到 value 的位置。hash 表的結構大致如下圖所示:
hash 表對應的這個結構中包括了三個用于定位數據 value 的信息,分別是文件 id 號 (file_id),value 值在文件中的位置 (value_pos),value 值的大小 (value_sz),于是我們通過讀取 file_id 對應文件的 value_pos 開始的 value_sz 個字節,就得到了我們需要的 value 值。整個過程如下圖所示:
由于多了一個 hash 表的存在,我們的寫操作就需要多更新一塊內容,即這個 hash 表的對應關系。于是一個寫操作就需要進行一次順序的磁盤寫入和一次內存操作。
3. 有用的 hintfile
至此,Bitcask 模型基本上已經講述完成,而這一節講到的 hintfile,則是一個有用的技巧,本人認為并不一定是 Bitcask 模型的必須特性。
從上面我們可以知道,我們稱其為索引的 hash 表,是存儲在內存中的,雖然在各自的實現中可以做一些持久化的保證,但是 Bitcask 模型中并不對在斷電或重啟后的 hash 表數據不丟失做出保證。
因此,如果我們不做額外的工作,那么我們啟動時重建 hash 表時,就需要整個掃描一遍我們的數據文件,如果數據文件很大,這將是一個非常耗時的過程。因此 Bitcask 模型中包含了一個稱作 hintfile 的部分,目的在于提高重建 hash 表的速度。
我們上面講到在 olddatafile 進行 merge 操作時,會產生新的 datafile,而 Bitcask 模型實際還鼓勵生成一個 hintfile,這個 hintfile 中每一項的數據結構,與 datafile 中的數據結構非常相似,不同的是他并不存儲具體的 value 值,而是存儲 value 的位置 (像在 hash 表中的一樣),其結構如下圖:
這樣,在重建 hash 表時,就不需要再掃描所有 datafile 文件,而僅僅需要將 hintfile 中的數據一行行讀取并重建即可。大大提高了利用數據文件重啟數據庫的速度。
看完上述內容,你們對 Bitcask 模型是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注丸趣 TV 行業資訊頻道,感謝大家的支持。