确保分片 Mongo 集合上的唯一索引
Ensuring unique index on a sharded Mongo collection
我已经使用 ObjectId 字段“_id”作为分片键对我的 mongo 集合进行了分片。
我的需要是确保此集合的唯一索引。
遗憾的是,您无法在分片集合上创建唯一索引。
MongoDB 建议:
Use a secondary collection to enforce uniqueness.
docs
但是由于 mongoDB 不支持事务,因此总是会出现一致性问题,因为 mongoDB 不支持事务。
例如,
- 我们有集合 Sample 和 Sample_proxy(索引集合)。 Sample 被分片而 Sample_proxy 不是。因此可以在 Sample_proxy.
上创建唯一索引
- 在插入 Sample 之前,总是先尝试插入 Sample_proxy.
- 如果插入 Sample_proxy 失败 => 违反唯一索引。
- 如果没有,请实际插入 样本。
注意:如果实际插入失败,记得从Sample_proxy删除文档,保证一致性。
听起来很简单,但是!
如果您成功插入 Sample_proxy 并且在实际插入之前,机器停机了。
不能原子地查看两个不同的集合。
我看不出有什么方法可以完全消除不一致。
如果有解决办法,请赐教
Peeking into two different collections cannot be done atomically
原来可以做到。我使用分布式锁来防止问题中提到的潜在不一致,使用 Apache Zookeeper(具体来说是 Curator Framework)
注意:
使用分布式锁很容易成为任何分布式系统吞吐量的瓶颈。 关键是只有在绝对必要时才锁定。
我已经使用 ObjectId 字段“_id”作为分片键对我的 mongo 集合进行了分片。 我的需要是确保此集合的唯一索引。
遗憾的是,您无法在分片集合上创建唯一索引。
MongoDB 建议:
Use a secondary collection to enforce uniqueness. docs
但是由于 mongoDB 不支持事务,因此总是会出现一致性问题,因为 mongoDB 不支持事务。
例如,
- 我们有集合 Sample 和 Sample_proxy(索引集合)。 Sample 被分片而 Sample_proxy 不是。因此可以在 Sample_proxy. 上创建唯一索引
- 在插入 Sample 之前,总是先尝试插入 Sample_proxy.
- 如果插入 Sample_proxy 失败 => 违反唯一索引。
- 如果没有,请实际插入 样本。 注意:如果实际插入失败,记得从Sample_proxy删除文档,保证一致性。
听起来很简单,但是!
如果您成功插入 Sample_proxy 并且在实际插入之前,机器停机了。 不能原子地查看两个不同的集合。 我看不出有什么方法可以完全消除不一致。
如果有解决办法,请赐教
Peeking into two different collections cannot be done atomically
原来可以做到。我使用分布式锁来防止问题中提到的潜在不一致,使用 Apache Zookeeper(具体来说是 Curator Framework)
注意: 使用分布式锁很容易成为任何分布式系统吞吐量的瓶颈。 关键是只有在绝对必要时才锁定。