我必须在多台计算机上存储许多千兆字节的数据。这些文件由Guid唯一标识,一个文件只能在一台计算机上托管。我想知道我是否可以使用Guid作为分区键来确定我应该使用哪台机器来存储数据。如果是这样,我的分区功能是什么?
否则,我怎么能以这样的方式对数据进行分区,使得所有机器都得到非常相似的负载呢?
谢谢!
P.S。我没有使用Sql Server,Oracle或任何其他数据库。这是所有内部代码。 P.S.S. Guid是使用.NET函数Guid.NewGuid()生成的。
答案 0 :(得分:4)
詹姆斯在评论中说,你需要一些分布均匀的东西。 Guids没有这个属性。我会推荐一个哈希,即使是像Guid本身的哈希一样简单。
SHA-1哈希具有良好的分布。除非你打算只在两台机器之间分配,否则我不推荐偶数/奇数哈希。
答案 1 :(得分: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台机器时,这将不起作用,尽管您可以再次将其他字节拆分为奇数或偶数。
答案 2 :(得分:0)
如果你想循环你的发行版,我会考虑一个同步计数器的可能性,你用经典的循环方式计算你拥有的机器数量。
同步计数器可以是数据库中的一个字段,可以是单个Web服务,也可以是网络上的文件等。每次放置文件时都可以递增。