Bitcast是一種日志型的基於hash表結構的健值對的存儲系統,最早追溯於Riak分布式數據庫。
目前,Berkeley DB,Tokyo Cabinet,Innostore都使用了這種存儲引擎。使用這種引擎擁有以下優點:
- 比較低的讀寫時延。
- 比較高的隨機寫吞吐率。
- 能夠控制更大的數據庫。
- 容易備份和恢復。
- 相對簡單,容易理解。
- 可預計的高訪問壓力情況。
Bitcast只支持追加操作(Append-only),即所有的寫操作只追加而不修改老的數據,每個文件都有一定的大小限制,當文件增加到相應的大小,就會產生一個新的文件,老的文件只讀不寫。在任意時刻,只有一個文件是可寫的,用於追加數據,被稱為活躍數據文件(active data file)。而其它已經達到大小限制的文件,被稱為(older data file)。
活躍數據文件僅支持追加寫入,因此所有的寫入操作都是串形化的而不用磁盤隨機定位。寫入的健值對格式如下:
健值對的刪除也是追加寫的方式寫入活動數據文件中,真正的刪除會在下一次的數據合並中進行,
合並操作是定時對所有的舊數據文件進行掃描並生成新的數據文件(其本質是將同一個Key的多個操作進行合並。)
在Bitcast模型中,使用了Hash表的索引結構。除了存儲在磁盤的數據文件,還有內存中的Hash表,通過Hash表中的key值可以快速地定位到磁盤中的數據。大致結構如下圖所示:
hash表對應的這個結構中包括了三個用於定位數據value的信息,分別是文件id號(file_id),value值在文件中的位置(value_pos),value值的大小(value_sz),於是我們通過讀取file_id對應文件的value_pos開始的value_sz個字節,就得到了我們需要的value值。整個過程如下圖所示:
從上面我們可以知道,索引的Hash表存放在內存中,如果發生系統重啟,則須要掃描磁盤中的數據重建Hash表,如果數據量非常大,這個過程是非常耗時的。因此,Bitcast模型中還要生成一個hint file,在這處文件中,數據結構與磁盤中的數據文件非常相似,不同的是他不存儲具體的value值,而是存儲value的位置信息。其結構如下圖:
這樣,在重建hash表時,就不需要再掃描所有的數據文件,而僅僅需要將hint file中的數據一行行讀取並重建即可。大大提高了利用數據文件重啟數據庫的速度。
可參考源碼
beansdb.googlecode.com/files/beansdb-0.5.2.tar.gz