2011-07-25 19 views
2

我必須在多臺機器上存儲很多千兆字節的數據。這些文件由Guid唯一標識,一個文件只能在一臺機器上託管。我想知道是否可以使用Guid作爲分區鍵來確定我應該使用哪臺機器來存儲數據。如果是這樣,我的分區功能是什麼?能否成爲一個好的分區密鑰?

否則,我怎樣才能以這樣的方式分割我的數據,使得所有機器都獲得非常類似的負載?

謝謝!

P.S.我沒有使用Sql Server,Oracle或任何其他數據庫。這是所有的內部代碼。 P.S.S. Guid是使用.NET函數Guid.NewGuid()生成的。

+0

這不取決於如何生成Guids?他們是隨機的 - 還是你可以控制一代?如果你可以控制它,你可以確保它是一個很好的分區鍵。如果它是隨機的,它將取決於生成算法的屬性。 –

+0

好點。 Guid由使用Guid.NewGuid()的.NET生成。 – Martin

+0

我不明白。您的數據存儲在「跨多臺機器」,但「只能在一臺機器上託管」?對於任何不知道程序能夠回答的人來說,其餘的聲音太具體。 – jalf

回答

4

正如詹姆斯在他的評論中所說的,你需要一個具有良好,均勻分佈的東西。 Guids沒有這個屬性。我會推薦一個散列,甚至像Guid本身的散列一樣簡單。

SHA-1散列具有良好的分佈。除非您計劃僅在兩臺機器之間進行分配,否則我不會推薦甚至/奇怪的散列。

+0

非常感謝凱爾! – Martin

0

因爲GUID是隨機的,你可以通過存儲在另一臺機器上的奇怪的GUID和偶數的GUID散發出來......

static void Main(string[] args) 
{ 
    var tests = new List<Guid>(); 

    for (int i = 0; i < 100000; i++) 
    { 
     tests.Add(Guid.NewGuid()); 
    } 

    Console.WriteLine("Even: " + tests.Where(g => g.ToByteArray().Last() % 2 == 0).Count()); 
    Console.WriteLine("Odd : " + tests.Where(g => g.ToByteArray().Last() % 2 == 1).Count()); 
    Console.ReadKey(true); 
} 

給出了一個近乎平等的分配。

編輯

事實上,這不會跨越2噸以上的機器分裂時,雖然你可以再上一個其它字節是奇數或偶數再次分裂工作。

0

如果你想輪流分配你的分配,我會查看一個同步計數器的可能性,你可以用經典的循環方式來計算機器的數量。

同步計數器可以是數據庫中的字段,也可以是單個Web服務或網絡上的文件等。每次放置文件時都可以增加任何內容。

+0

那麼,如何在放置後找到數據? –

+0

@Kyle W對不起,我以爲他只是想要一個分區平衡器,您需要將檢索關鍵字以及關於該文件的其他信息一起存儲。 –

相關問題