Bitcast是一種日誌型的基於hash表結構的健值對的存儲系統,最先追溯於Riak分佈式數據庫。數據庫
目前,Berkeley DB,Tokyo Cabinet,Innostore都使用了這種存儲引擎。使用這種引擎擁有如下優勢:數據結構
Bitcast只支持追加操做(Append-only),即全部的寫操做只追加而不修改老的數據,每一個文件都有必定的大小限制,當文件增長到相應的大小,就會產生一個新的文件,老的文件只讀不寫。在任意時刻,只有一個文件是可寫的,用於追加數據,被稱爲活躍數據文件(active data file)。而其它已經達到大小限制的文件,被稱爲(older data file)。分佈式
活躍數據文件僅支持追加寫入,所以全部的寫入操做都是串形化的而不用磁盤隨機定位。寫入的健值對格式以下:google
健值對的刪除也是追加寫的方式寫入活動數據文件中,真正的刪除會在下一次的數據合併中進行,日誌
合併操做是定時對全部的舊數據文件進行掃描並生成新的數據文件(其本質是將同一個Key的多個操做進行合併。)code
在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中的數據一行行讀取並重建便可。大大提升了利用數據文件重啓數據庫的速度。hash
可參考源碼
beansdb.googlecode.com/files/beansdb-0.5.2.tar.gz