如何在分片数据库中创建唯一的行ID?

时间:2009-04-25 12:37:41

标签: database sharding

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

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

希望听到任何人处理此问题的经验。

5 个答案:

答案 0 :(得分:9)

一些方法

1)为每个分片提供自己的ID,并使用复合键

2)为每个分片提供自己的ID并为每个分片设置ID范围

3)使用全球唯一ID - GUID

答案 1 :(得分:2)

我曾经遇到过这种问题的两种方法:

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

答案 2 :(得分:1)

1)您可以有两行(一行表示ID,第二行表示数据库ID)

2)使用Guids

答案 3 :(得分:0)

我有同样的困境。我想我会选择redis解决方案。我将使用redis-cloud.com之类的服务来生成唯一ID。因此,对于插入到分片表中的每个数据,我仍然可以使用bigint。 IT将是顺序的,因此不会发生页面拆分。此外,现在很容易进行分页。 IT解决了我友好的URL问题,因为我不想在URL中使用GUID。此外,Redis云是一种可扩展的解决方案,非常可靠并且具有自动故障转移功能。

我不需要决定分割我的数据的范围,我只是在主键上使用MD5哈希来在分片之间平均分配数据。对于HA,我决定使用Amazon RDS进行简单的时间点备份/恢复和复制。

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

答案 4 :(得分:0)

将数据库保留在consistent hash loop中会有所帮助。这样,您可以确保每个数据库只能处理一定范围的ID。因此,没有两个数据库将具有任何公共ID。这也解决了在系统中添加和删除数据库的问题。