为啥在 MongoDB 中缩放时自动增量模式不好?
Posted
技术标签:
【中文标题】为啥在 MongoDB 中缩放时自动增量模式不好?【英文标题】:Why is auto-increment pattern bad when scaling in MongoDB?为什么在 MongoDB 中缩放时自动增量模式不好? 【发布时间】:2014-05-17 23:27:38 【问题描述】:我试图理解为什么auto-increment pattern is bad when scaling。
我也读过this article。里面有这么一句话:
相反,您需要使用正确的 UUID 方法来确保您不会遇到竞争条件,并且 ID 在集群中是真正唯一的。我正在尝试找出分片中 _id
重复的确切情况。
还有一个问题:非主键的自动增量呢?安全吗?
非常感谢!
【问题讨论】:
【参考方案1】:为了保证自增值的唯一性,ID的创建必须在单个主机上的单个线程上进行(即使使用多个线程,ID创建点也必须阻塞其他线程)。因此,在 100 台服务器的集群中,必须在 100 台服务器中的 1 台上的 1 个线程上创建 ID。这不仅仅是性能瓶颈,创建 2 个自动增量 ID 可能会相互阻塞,这是您引用的引文中提到的竞争条件。
需要注意的是,事务型 RDBMS 系统如 Oracle 和 SQL Server 已经解决了竞争条件问题,但没有解决性能瓶颈。
所以:不,如果您预计需要扩展系统,请不要在非主键中使用自动增量。
【讨论】:
感谢您的回复。有关 RDBMS 的信息也很有用。现在对我来说只有一件事不清楚:使用原子 AFAIK 的findAndModify
时,竞争条件如何。我错过了什么吗?你能解释一下吗?
为了获得竞争条件,您必须在生成另一个 ID 的过程中直接或间接生成一个 ID。我没有在您引用的代码中看到竞争条件漏洞。但是,我想说如果生成唯一的整数 ID 序列是您的要求的一部分,那么 Mongo 并不是最佳的实现选择。最好在为此目的设置的 RDBMS 中生成您的 ID 序列。然后,您可以在生成 ID 后在 Mongo 中使用它。如果可扩展性不是问题,我会说继续使用 Mongo findAndModify hack。
非常感谢。现在我明白了什么是什么以上是关于为啥在 MongoDB 中缩放时自动增量模式不好?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Golang mongo-driver 的 MongoDB 自动增量 ID
Unity3D游戏物体操作 ③ ( 旋转操作 | 旋转工具 | 基本旋转 | 设置旋转属性 | 增量旋转 | 缩放操作 | 轴向缩放 | 整体缩放 | 操作工具切换 | 操作模式切换 )