MongoDB count() несоответствие для сегментированного кластера

Я загрузил коллекцию, состоящую из 24 895 212 элементов, в MongoDB. У меня есть шардинг с 5 шардами. Данные равномерно распределены по 5 фрагментам. Балансировщик в настоящий момент не работает (sh.isBalancerRunning() возвращает false).

Основываясь на документации, когда балансировщик завершит разделение, я смогу запустить команду db.collection.count(), чтобы получить количество строк. Однако, если я сделаю это, я получу 25 245 767 строк. Не уверен, откуда берутся дополнительные 350 555 строк. Обратите внимание, что если я запускаю команду:

mongos>  db.collection.find({}).itcount()

Я получил правильный счет 24 895 212, но проблема в том, что эта команда выполняется около 15 минут...

Любые идеи о том, где я иду не так, почему у меня есть 350,555 строк diff? Я также попытался запустить процесс очистки от сирот, введя команду:

mongos> db.runCommand( { cleanupOrphaned: "<db>.<collection>" } )

Однако этот процесс длился около 9 часов за ночь и не закончился утром...

1 ответ

Решение

Поскольку очистка потерянных документов (вызванных неудачными миграциями) не завершилась, вполне возможно, что они все еще существуют. Более того, существует открытая ошибка: количество собранных коллекций (на основной) может сообщить о слишком большом количестве результатов.

Эта ошибка должна быть исправлена ​​в 2.7. Я думаю, что вы столкнулись с той же проблемой.

Другие вопросы по тегам