Могу ли я в MongoDB выполнить команду compact без выключения каждого экземпляра?

#mongodb

#mongodb

Вопрос:

В структуре сервера физически управляются первичный, вторичный и арбитр. версия mongo db — 4.2.3.

Некоторые документы были удалены в самом старом порядке, потому что в определенной коллекции было накоплено слишком много документов. Однако даже удаление документов не освободило область хранения. После проверки я обнаружил, что механизм mongodb сохраняет повторно используемые байты, даже если документ удален. Кроме того, я обнаружил, что ненужное дисковое пространство можно освободить с помощью команды compact в движке WiredTiger.

В настоящее время все клиенты, подключенные к БД, запрашивают с использованием IP-адреса и порта арбитра.

Поскольку БД состоит только из репликации, а не из сегментирования, если каждый человек выполняет команду compact независимо, даже если каждый экземпляр заблокирован, ожидается, что арбитр распространит запрос на доступные в данный момент экземпляры.

Возможно ли это?

Или я должен завершить работу каждого экземпляра, запустить его автономно, выполнить команду compact, а затем перенастроить psa?

Ответ №1:

Вы можете обновить свою MonogDB до последней версии 4.4. Документация compact:

Блокировка

Изменено в версии 4.4.

Начиная с версии 4.4 в WiredTiger, compact блокирует только следующие операции с метаданными:

 db.collection.drop
db.collection.createIndex and db.collection.createIndexes
db.collection.dropIndex and db.collection.dropIndexes
  

compact не блокирует CRUD-операции MongoDB для базы данных, с которой он
в данный момент работает.

До версии 4.4 compact блокировал все операции с базой данных, которую он уплотнял, включая операции CRUD MongoDB, и поэтому был рекомендован для использования только в периоды планового обслуживания. Начиная с версии 4.4, команда compact подходит для использования в любое время.

Ответ №2:

Всем, кто ищет ответ с помощью 4.4, пожалуйста, ознакомьтесь с этой ошибкой и записью документации, поскольку процедура compact по-прежнему переводит узел в состояние восстановления, если вы работаете в наборе реплик (и я предполагаю, что это вариант использования по умолчанию для большинства проектов)