Файлы данных Mongodb становятся меньше после миграции

На моем первом сервере я получаю:

root@prod ~ # du -hs /var/lib/mongodb/
909G    /var/lib/mongodb/

После миграции этой базы данных с помощью mongodump/mongorestore На моем втором сервере я получаю:

root@prod ~ # du -hs /var/lib/mongodb/
30G /var/lib/mongodb/

После того, как я подождал несколько часов, Монго закончил индексацию и получил:

root@prod ~ # du -hs /var/lib/mongodb/
54G /var/lib/mongodb/

Я проверил базу данных и нет поврежденных или пропущенных данных.

Почему такая большая разница в размерах до и после миграции?

2 ответа

Решение

MongoDB не восстанавливает дисковое пространство, когда фактически размер данных уменьшается из-за удаления данных вместе с другими причинами. В онлайн-документации есть достойное объяснение:

Почему файлы в моем каталоге данных больше, чем данные в моей базе данных?

Файлы данных в вашем каталоге данных, который является каталогом / data / db в конфигурациях по умолчанию, могут быть больше, чем набор данных, вставленный в базу данных. Рассмотрим следующие возможные причины:

Предварительно выделенные файлы данных.

В каталоге данных MongoDB предварительно выделяет файлы данных определенного размера, частично для предотвращения фрагментации файловой системы. MongoDB называет первый файл данных.0, следующий.1 и т. Д. Первый файл, который mongod выделяет, составляет 64 мегабайта, следующие 128 мегабайт и т. Д., До 2 гигабайт, после чего все последующие файлы занимают 2 гигабайта. Файлы данных включают в себя файлы с выделенным пространством, но без данных. Mongod может выделить файл данных объемом 1 гигабайт, который может быть пустым на 90%. Для большинства более крупных баз данных неиспользуемое выделенное пространство мало по сравнению с базой данных.

В Unix-подобных системах mongod предварительно выделяет дополнительный файл данных и инициализирует дисковое пространство равным 0. Предварительное выделение файлов данных в фоновом режиме предотвращает значительные задержки при следующем выделении нового файла базы данных.

Вы можете отключить предварительное распределение, установив preallocDataFiles в false. Однако не отключайте preallocDataFiles для производственных сред: используйте только preallocDataFiles для тестирования и с небольшими наборами данных, где вы часто удаляете базы данных.

В системах Linux вы можете использовать hdparm, чтобы получить представление о том, насколько дорогостоящим может быть распределение:

time hdparm --fallocate $ ((1024 * 1024)) testfile

Оплог.

Если этот mongod является членом набора реплик, каталог данных включает в себя файл oplog.rs, который представляет собой предварительно выделенную ограниченную коллекцию в локальной базе данных. Распределение по умолчанию составляет приблизительно 5% дискового пространства в 64-разрядных установках, см. Размеры Oplog для получения дополнительной информации. В большинстве случаев вам не нужно изменять размер оплога. Однако, если вы это сделаете, см. Изменение размера оплога.

Журнал.

Каталог данных содержит файлы журнала, в которых хранятся операции записи на диск до того, как MongoDB применяет их к базам данных. Смотрите Механика ведения журнала.

Пустые записи.

MongoDB поддерживает списки пустых записей в файлах данных при удалении документов и коллекций. MongoDB может повторно использовать это пространство, но никогда не вернет это пространство операционной системе.

Чтобы де-фрагментировать выделенное хранилище, используйте компактный, который де-фрагментирует выделенное пространство. Благодаря фрагментации хранилища MongoDB может эффективно использовать выделенное пространство. Для работы Compact требуется до 2 гигабайт дополнительного дискового пространства. Не используйте компактный, если у вас недостаточно места на диске.

Важный

Compact только удаляет фрагментацию из файлов данных MongoDB и не возвращает дискового пространства операционной системе.

Чтобы восстановить удаленное пространство, используйте repairDatabase, который перестраивает базу данных, которая дефрагментирует хранилище и может освободить пространство для операционной системы. Для восстановления repairDatabase требуется до 2 гигабайт дополнительного дискового пространства. Не используйте repairDatabase, если у вас критически мало места на диске.

http://docs.mongodb.org/manual/faq/storage/

Они не сообщают вам о двух других способах восстановления / восстановления дискового пространства - mongodump/mongorestore, как вы это сделали, или добавление нового члена в набор реплик с пустым диском, чтобы он записывал файлы с данными с нуля.

Если вы заинтересованы в мониторинге этого, команда db.stats() возвращает множество данных о данных, индексе, хранилище и размерах файлов:

http://docs.mongodb.org/manual/reference/command/dbStats/

Со временем файлы MongoDB развиваются фрагментированно. Когда вы выполняете "миграцию" или ударите каталог данных и принудительно произведите повторную синхронизацию, файлы упадут. Если ваше приложение делает много удалений или обновлений, которые растут, фрагментация документов развивается довольно быстро. В нашем развертывании это обновления, которые увеличивают документы, которые вызывают это. Каким-то образом MongoDB перемещает документ, когда видит, что обновленный документ не может поместиться в пространстве исходного документа. Чтобы избежать этого, есть некоторый способ добавить коэффициенты заполнения в коллекцию.

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