确保分片Mongo集合上的唯一索引

时间:2018-09-05 12:17:30

标签: mongodb indexing sharding

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

不幸的是,您无法在分片集合上创建唯一索引。

MongoDB建议:

  

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

但是由于mongoDB不支持事务,因此始终存在一致性问题,无法克服该方法。

例如,

  • 我们有 Sample Sample_proxy 集合(索引集合)。 Sample 被分片,而 Sample_proxy 不被分片。因此可以在 Sample_proxy 上创建唯一索引。
  • 在插入 Sample 之前,始终首先尝试插入 Sample_proxy
  • 如果插入 Sample_proxy 失败=>唯一索引冲突。
  • 如果不是,请实际插入 Sample 中。 注意:如果实际插入失败,请记住从 Sample_proxy 中删除文档,以确保一致性。

听起来很安全,但是!

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

如果有解决方案,请赐教。

1 个答案:

答案 0 :(得分:0)

  

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

原来可以做到。我使用Apache Zookeeper(具体来说是Curator框架)来使用分布式锁来防止问题中提到的潜在矛盾

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