2

想象一下,有一个关系数据库系统(比如说 MySQL)集群在许多服务器(可能是 100 台服务器)中。在这个数据库系统中有一个名为“users”的表,“users”包含一个主键(例如 UINT)。

此用户 ID 在所有服务器中必须是唯一的。此用户 ID 可能会自动递增。

那么分布式数据库系统如何处理这些类型的问题呢?RDBMS 如何生成在所有服务器中唯一的唯一索引?

我不想要任何关于如何在 MySQL 中执行此操作的 SQL 代码,我只需要知道在这种情况下它是如何完成的。

[编辑]

两个答案听起来都不错。

这是另一种情况,我们以 StackOverflow 为例。这个问题的 URL 是http://stackoverflow.com/questions/18359434。另一个 URL 是http://stackoverflow.com/questions/18359435,它指向在这个问题之后提出的问题。显然 stackoverflow 有多个数据库服务器。但是问题的 ID 是自动递增的。

那么 StackOverflow 使用的方法是什么?

StackOverflow 获得了大量流量,alexa 和 Quantacast 排名都在 100 左右。

4

2 回答 2

3

规范的解决方案是使用uuid()(参见此处)而不是整数来表示这种唯一标识符。这保证在空间和时间上都是独一无二的。

一个更“黑客”的解决方案是使用两部分主键。第一个是“我在哪个系统上”的标识符,第二个是该系统唯一的自动递增数字。

另一个“被黑”的解决方案是给每个系统范围。假设您正在使用大整数,那么 1,000,000,000 可能会在一个系统上启动值,2,000,000,000 在另一个系统上启动,等等。

我不建议您实际尝试在分布式系统中实现自动递增的数字。这基本上需要拥有一个维护最新号码的单一系统,并让其他系统要求它提供下一个号码。无论您如何实现这一点,都会在系统中引入瓶颈。

于 2013-08-21T14:07:03.800 回答
1

在这种情况下,我将使用 GUID 主键并且我不会遇到这个问题(虽然不确定 MySQL 是否知道这一点)。另一种老式的方法是使用主键范围 - 即让一个实例使用从 1.000.000 到 1.999.999 的键,下一个使用范围从 2.000.000 到 2.999.999 等,从而确保每个实例不能使用另一个的钥匙。

于 2013-08-21T14:08:17.307 回答