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. Я думаю, что вы столкнулись с той же проблемой.