2014-11-07 2 views
2

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

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

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

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

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

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

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

ответ

2

Поскольку очистка сироту документы (вызванные неудачными переходами) не завершились, вполне возможно, что они все еще существуют. Кроме того, есть открытая ошибка: Sharded collection counts (on primary) can report too many results

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

+0

Это именно он. В соответствии с SERVER-3645, если я запускаю «db.collection.find ({}). Explain(). N« Я получаю правильный счетчик. Поэтому, надеясь, что это будет зафиксировано в 2.7. Выполнение команды cleanupOrphaned не является для меня вариантом, поскольку он работает для большого количества домашних, и мне нужно обновлять мою коллекцию чаще, чем это ... – user3892260

Смежные вопросы