【发布时间】:2018-09-05 12:17:29
【问题描述】:
我已经使用 ObjectId 字段“_id”作为分片键对我的 mongo 集合进行了分片。 我需要确保此集合的唯一索引。
很遗憾,您无法在分片集合上创建唯一索引。
MongoDB 建议:
使用辅助集合来强制唯一性。 docs
但由于 mongoDB 不支持事务,因此这种方法总是存在一致性问题。
例如,
- 我们有集合 Sample 和 Sample_proxy(索引集合)。 Sample 是分片的,而 Sample_proxy 不是。因此可以在 Sample_proxy 上创建唯一索引。
- 在插入 Sample 之前,请务必先尝试插入 Sample_proxy。
- 如果插入 Sample_proxy 失败 => 违反唯一索引。
- 如果没有,则将实际插入到 Sample 中。 注意:如果实际插入失败,请记住从 Sample_proxy 中删除文档以确保一致性。
听起来万无一失,但是!
如果您成功插入 Sample_proxy 并且在实际插入之前,机器停机了怎么办。 不能原子地查看两个不同的集合。 我看不出有任何方法可以完全消除不一致。
如果有解决办法,请赐教。
【问题讨论】:
-
MongoDB 使用journaling 不会解决这种情况吗?
-
我希望有更好的方法来解决这个问题
-
我的意思是,日记可以防止您担心的潜在不一致发生。也就是说,您也可以使用您的唯一列作为您的分片键。