【问题标题】:Ensuring unique index on a sharded Mongo collection确保分片 Mongo 集合的唯一索引
【发布时间】:2018-09-05 12:17:29
【问题描述】:

我已经使用 ObjectId 字段“_id”作为分片键对我的 mongo 集合进行了分片。 我需要确保此集合的唯一索引。

很遗憾,您无法在分片集合上创建唯一索引。

MongoDB 建议:

使用辅助集合来强制唯一性。 docs

但由于 mongoDB 不支持事务,因此这种方法总是存在一致性问题。

例如,

  • 我们有集合 SampleSample_proxy(索引集合)。 Sample 是分片的,而 Sample_proxy 不是。因此可以在 Sample_proxy 上创建唯一索引。
  • 在插入 Sample 之前,请务必先尝试插入 Sample_proxy
  • 如果插入 Sample_proxy 失败 => 违反唯一索引。
  • 如果没有,则将实际插入到 Sample 中。 注意:如果实际插入失败,请记住从 Sample_proxy 中删除文档以确保一致性。

听起来万无一失,但是!

如果您成功插入 Sample_proxy 并且在实际插入之前,机器停机了怎么办。 不能原子地查看两个不同的集合。 我看不出有任何方法可以完全消除不一致。

如果有解决办法,请赐教。

【问题讨论】:

  • MongoDB 使用journaling 不会解决这种情况吗?
  • 我希望有更好的方法来解决这个问题
  • 我的意思是,日记可以防止您担心的潜在不一致发生。也就是说,您也可以使用您的唯一列作为您的分片键。

标签: mongodb indexing sharding


【解决方案1】:

不能原子地查看两个不同的集合

事实证明这是可以做到的。我使用分布式锁来防止问题中提到的潜在不一致,使用 Apache Zookeeper(具体来说是 Curator Framework)

注意: 使用分布式锁很容易成为任何分布式系统吞吐量的瓶颈。 关键是只在绝对必要时才锁定

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多