6

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

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

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

4

5 回答 5

11

几种方法

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

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

3) 使用全局唯一 ID - GUID

于 2009-04-25T12:41:14.250 回答
3

我用来解决这类问题的两种方法:

  • GUID:易于实现,但可以创建更大的表和索引。
  • ID 域:我提出了这个术语,但基本上它意味着将整数类型的 32(或 64)位分为两部分,顶部代表一个域。用于域的位数取决于您想要支持的域数与您希望单个域引入的记录数。在这种方法中,您为每个分片分配一个域。不利的一面是数据库(我知道)不直接支持这种方法,您需要自己编码 ID 分配。
于 2009-04-25T12:48:01.720 回答
1

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

2) 使用指南

于 2009-04-25T12:43:21.107 回答
0

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

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

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

于 2012-10-28T06:31:05.673 回答
0

将数据库保持在一致的哈希循环中会有所帮助。这样,您可以确保每个 db 只需要处理一定范围的 id(s)。所以没有两个数据库会有任何共同的ID。这也解决了从系统中添加和删除数据库的问题。

于 2020-02-03T06:42:29.997 回答