2012-09-15 93 views
3

我正在使用分佈式鍵值系統(或數據存儲),它在後端使用levelDB作爲其嵌入式數據庫庫。如何在單個levelDB實例中創建多個邏輯表?

我想讓一個節點/機器承載多個表(用於複製和負載平衡)。我知道levelDB沒有表格的概念,所以我不能以表格形式對數據進行邏輯分區(因此不能將這些表格用作我的基本分佈單元)。

我的問題是:有沒有規定在levelDB的單個實例中有多個「邏輯表」?

據我所知,我可以在我的節點上運行多個levelDB實例,每個實例處理一個表。但我不想這樣做,因爲在這種情況下,當同時訪問這些多個數據庫實例時,會有嚴重的爭用(我相信在磁盤上)。雖然在單個數據庫實例中有多個邏輯表可以給我優化levelDB優化以最大限度地減少磁盤訪問。

回答

6

如果您想在LevelDB中擁有多個「邏輯表」,那麼您必須對密鑰空間進行分區或爲密鑰添加前綴。對於每個表中創建一個不同的前綴,如:

0x0001 is for table 1 
0x0002 is for table 2 
0x0003 is for table 3 
and so on... 

所以關鍵將包括表前綴和密鑰本身:[0x0001,0xFF11]將表1中解決關鍵0xFF11然後,您可以使用一個單一的LevelDB實例並具有多個「密鑰空間」,它們將對應於「表」。

+0

是的..看起來這是唯一的方法。我想爲每個平板電腦使用一個文件系統目錄,但顯然如果你打開多個目錄(使用Open(選項,,&db)),只有最後一個目錄用於數據存儲。 –

+0

反正打開的方法不會爲每個目錄(或打開操作)提供唯一的DB處理程序。 –

+0

我不知道你是如何設法用單個LevelDB實例打開多個目錄的......所以我不知道你的意思是「只有最後一個目錄用於數據存儲」。如果你需要多個目錄,那麼你需要使用多個LevelDB實例。 – Kiril

2

您最好的選擇是使用Lirik建議的鍵前綴對鍵空間進行分區。雖然打開多個數據庫是可能的,但我不會爲你的用例推薦它,因爲數據庫不會共享任何緩衝區和緩存。使用多個開放數據庫可能會對性能產生負面影響,並且會優化資源使用(主要是內存),這會使硬件更加困難。

+0

@Wouter ..是的,我完全同意你的觀點。不僅緩衝區和高速緩存不會如此有效,而且磁盤也可能因處理多個數據庫實例而變得瘋狂。我現在爲我的系統使用了多個實例,但在將其投入生產之前,我將使用密鑰前綴方法。謝謝。 –

+0

Fwiw,我的Plyvel項目有一個非常好的API。有關更多信息,請參見https://plyvel.readthedocs.org/en/latest/user.html#prefixed-databases。如果你不使用Python,你可能仍然對它的工作原理感興趣(你也可以複製它的實現)。 –