Обеспечение уникального индекса для коллекции Монго - PullRequest
0 голосов
/ 05 сентября 2018

Я осквернил свою коллекцию монго с полем ObjectId '_id' в качестве ключа шарда. Мне нужно обеспечить уникальный индекс для этой коллекции.

К сожалению, вы не можете создавать уникальные индексы в защищенной коллекции.

MongoDB предлагает:

Используйте вторичную коллекцию для обеспечения уникальности. 1009 * Docs *

Но всегда могут быть проблемы с согласованностью, побеждающие этот метод, поскольку mongoDB не поддерживает транзакции.

Например,

  • У нас есть коллекции Sample и Sample_proxy (индексная коллекция). Образец отсеивается, а Sample_proxy - нет. Таким образом, уникальный индекс может быть создан для Sample_proxy .
  • Перед вставкой в ​​ Образец , всегда сначала пытайтесь вставить в Sample_proxy .
  • Если вставить в Sample_proxy не удается => нарушение уникального индекса.
  • Если нет, сделать фактическую вставку в Образец . Примечание. Если фактическая вставка не удалась, не забудьте удалить документ из Sample_proxy для обеспечения согласованности.

Звучит надежно, Но!

Что если вы успешно вставите в Sample_proxy и перед фактической вставкой аппарат выключится. Просмотр двух разных коллекций не может быть сделан атомарно. Я не вижу способа полностью устранить несоответствие.

Если есть решение для этого, пожалуйста, просветите меня.

1 Ответ

0 голосов
/ 26 сентября 2018

Просмотр двух разных коллекций не может быть сделан атомарно

Оказывается, это можно сделать. Я использовал распределенные блокировки, чтобы предотвратить потенциальное несоответствие, упомянутое в вопросе, используя Apache Zookeeper (определенно, Curator Framework)

Примечание: Использование распределенных блокировок может легко ограничить пропускную способность любой распределенной системы. Ключ должен блокироваться только в случае крайней необходимости .

...