想象一下,有一个关系数据库系统(比如说 MySQL),它集群在许多服务器(可能有 100 台服务器)中。在这个数据库系统中有一个名为“users”的表,“users”包含一个主键(例如UINT)。
该用户 ID 在所有服务器中必须是唯一的。该用户 ID 可以自动递增。
那么分布式数据库系统如何处理这些类型的问题呢? RDBMS 如何生成在所有服务器中唯一的唯一索引?
我不需要任何有关如何在 MySQL 中执行此操作的 SQL 代码,我只需要知道在这种情况下它是如何完成的。
[编辑]
两个答案听起来都不错。
这是另一种情况,我们以StackOverflow为例。此问题网址为 http://stackoverflow.com/questions/18359434
。另一个URL是http://stackoverflow.com/questions/18359435,它指向这个问题之后提出的问题。显然 stackoverflow 有多个数据库服务器。但问题的 ID 是自动递增的。
那么 StackOverflow 使用的方法是什么?
StackOverflow 获得了大量流量,Alexa 和 Quantacast 排名均约为 100。
最佳答案
规范的解决方案是使用 uuid()
(请参阅 here )而不是整数作为此类唯一标识符。这保证在空间和时间上都是唯一的。
更“黑客”的解决方案是使用两部分主键。第一个是“我所在的系统”的标识符,第二个是一个自动递增的数字,该数字是该系统唯一的。
另一个“黑客”解决方案是给每个系统范围。假设您使用的是大整数,那么在一个系统上可能以 1,000,000,000 开始该值,在另一个系统上可能以 2,000,000,000 开始,依此类推。
我不建议您实际尝试在分布式系统中实现自动递增的数字。这基本上需要有一个系统来维护最新的号码,并让其他系统询问下一个号码。无论您如何实现这一点,都会给系统带来瓶颈。
关于mysql - 分布式 RDBMS 中的唯一键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18359434/