2009-04-25 113 views
4

在非分片数据库中,我可以使用自动增量来生成一个唯一的ID来引用特定的行。如何在分片数据库中创建唯一的行ID?

我想分解我的数据库,说成12个分片。现在,当我插入特定的分片时,自动增量ID不再是唯一的。

想听听任何人处理这个问题的经验。

+0

从未听说过术语分片之前 - 感谢将它添加到我的词汇中 – MrTelly 2009-04-25 12:45:11

回答

9

几个方法

1)给出每个碎片它自己的ID,并使用复合密钥

2)给出每个碎片它自己的ID,并设置ID取值范围为每个碎片

3)使用全球唯一的ID - GUID

+3

使用GUID,不用担心范围和组合键。您不可避免地会在某个时候添加另一个分片或需要重新组织您的分片,并且您的编号方案需要进行重构。 – 2009-04-25 12:45:07

+1

@Jeff:GUID确实有一个严重的缺点,它们很大。根据分配数据库的原因,这可能是一个重要的因素。使用ID范围允许一个小的(32位)单个字段PK,在各个DB之间没有冲突。所以我会同意,如果音量不是问题,请使用GUID,但它们并不总是合适的。如果不将创建数据库的标识与标识链接起来,它会有所帮助。这样DB可以“租用”ID范围,从而消除“重构”中的问题。 – AnthonyWJones 2009-04-25 12:57:13

+0

就我个人而言,我憎恶GUID作为钥匙,因为你不能大叫 - 看看记录123456,GUIDs是反人类 – MrTelly 2009-04-25 13:12:45

1

1)您可以在两行(一个指示标识和第二数据库ID)

2)使用的GUID

2

我已经习惯这种问题的两种方法:

  • GUID:易于实施,将产生较大的表和索引虽然。
  • ID域名:我提出了这个术语,但基本上它意味着将32位(或64位)的整数类型分成两部分,顶部代表一个域。用于该域的位数取决于您希望支持的域数与希望单个域引入的记录数相对应。在这种方法中,您为每个分片分配一个域。缺点是DB(我知道)不直接支持这种方法,你需要自己编码ID分配。
0

我有同样的困境。我想我会采用redis解决方案。我将使用像redis-cloud.com这样的服务来生成唯一的ID。所以我仍然可以使用bigint插入到我的分片表中的每个数据。 IT将是连续的,所以不会发生分页。此外,分页现在很容易做到。 IT解决了我友好的URL问题,因为我不想在URL中使用GUID。此外,Redis云是一个可扩展的解决方案,非常可靠并具有自动故障切换功能。

我不需要决定一个范围来分割我的数据,我只是在主键上使用MD5哈希来平均地在这些分片之间划分数据。对于医管局,我决定使用Amazon RDS进行简单的即时备份/恢复和复制。

我认为Flickr使用相同的技术,但他们有两个生成器,一个用于奇数,另一个用于偶数。