分布式RDBMS中的唯一键

时间:2013-08-21 13:57:37

标签: mysql database

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

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

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

我不想在MySQL中使用任何SQL代码,我只需要知道在这种情况下是如何完成的。

[编辑]

两个答案听起来都不错。

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

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

StackOverflow正在获得大量流量,大约100个alexa和Quantacast排名。

2 个答案:

答案 0 :(得分:2)

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

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

另一个“黑客”解决方案是给每个系统范围。假设你使用的是大整数,那么1,000,000,000可以在一个系统上启动,在另一个系统上启动2,000,000,000,依此类推。

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

答案 1 :(得分:0)

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