2011-07-25 5 views
2

複数のマシンに数ギガバイトのデータを格納する必要があります。ファイルはGuidによって一意に識別され、1つのファイルは1台のマシンでのみホストすることができます。私はパーティションキーとしてGuidを使用して、どのマシンをデータの保存に使うべきかを判断できるかどうか疑問に思っていました。もしそうなら、私のパーティション機能は何ですか?GUIDを良いパーティションキーにすることはできますか?

それ以外の場合、すべてのマシンが非常に似た負荷を得るようにデータをパーティション化するにはどうすればよいですか?

ありがとう!

P.S.私はSQL Server、Oracleまたは他のDBを使用していません。これはすべて社内コードです。 P.S.S. Guidは、.NET関数Guid.NewGuid()を使用して生成されます。

+0

これはGuidの生成方法によって異なりますか?彼らは無作為であるか、世代をコントロールできますか?あなたがそれを制御できるなら、それが良いパーティションキーであることを保証することができます。ランダムな場合は、生成アルゴリズムのプロパティに依存します。 –

+0

良い点。 Guidは、Guid.NewGuid()を使用して.NETによって生成されます。 – Martin

+0

私は分かりません。あなたのデータは「複数のマシンにまたがって」保存されますが、「1台のマシンでのみホスト可能です」残りの部分は、あなたのプログラムが答えられることを知らない人にとってはあまりにも具体的に聞こえます。 – jalf

答えて

4

Jamesがコメントで述べたように、あなたは良い、一様な分布を持つものが必要です。ガイドにはこのプロパティはありません。私は、ハッシュを推奨します.Git自体のハッシュと同じくらい簡単です。

SHA-1ハッシュは良好な分布をしています。 2台のマシンの間でのみ配布を計画していない限り、私は偶数/奇数ハッシュをお勧めしません。

+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台の以上のマシン間で分割するときに、他のバイトが奇数か偶数であることに再び分割ができるが

EDITは、確かにこれは動作しません。

0

配布をラウンドロビンしたいなら、クラシックなラウンドロビン方式のマシンの数を%にした同期カウンタの可能性を検討します。

同期カウンタは、データベース内のフィールドでも、単一のWebサービスでも、ネットワーク上のファイルでもかまいません。ファイルが配置されるたびにインクリメントされる可能性のあるもの。

+0

どのように、あなたはそれを配置した後にデータを見つけることになるでしょうか? –

+0

@Kyle W申し訳ありませんが、私は彼がパーティションバランサを望んでいると思っていました。ファイルの情報の残りの部分に検索キーを格納する必要があります。 –

関連する問題