В MongoDB произошла значительная путаница по поводу освоения космоса, и некоторые рекомендуемые практики совершенно опасны для использования в определенных типах развертывания. Более подробная информация ниже:
TL; DR repairDatabase пытается спасти данные из автономных развертываний MongoDB, которые пытаются восстановиться после повреждения диска. Если он восстанавливает пространство, это чисто побочный эффект . Восстановление пространства никогда не должно быть главным соображением бега repairDatabase.
Восстановить пространство в автономном узле
WiredTiger: для автономного узла с WiredTiger при запуске compactосвободится пространство для ОС с одним предупреждением: на compactкоманду на WiredTiger в MongoDB 3.0.x повлияла эта ошибка: SERVER-21833, которая была исправлена в MongoDB 3.2.3. До этой версии compactна WiredTiger мог молча провалиться.
MMAPv1: из-за того, как работает MMAPv1, нет безопасного и поддерживаемого метода для восстановления пространства с использованием механизма хранения MMAPv1. compactв MMAPv1 будет выполнять дефрагментацию файлов данных, потенциально освобождая место для новых документов, но не освобождая пространство обратно в ОС.
Вы можете запустить, repairDatabaseесли полностью понимаете последствия этой потенциально опасной команды (см. Ниже), поскольку по repairDatabaseсуществу перезаписывает всю базу данных, отбрасывая поврежденные документы. Как побочный эффект, это создаст новые файлы данных MMAPv1 без какой-либо фрагментации и освободит место для ОС.
Для менее авантюрного метода он может быть запущен mongodumpи mongorestoreвозможен также в развертывании MMAPv1, в зависимости от размера вашего развертывания.
Восстановить пространство в наборе реплик
Для конфигураций набора реплик лучший и самый безопасный способ восстановления пространства - выполнить первоначальную синхронизацию как для WiredTiger, так и для MMAPv1.
Если вам нужно восстановить пространство со всех узлов в наборе, вы можете выполнить скользящую начальную синхронизацию. То есть, выполнить начальную синхронизацию на каждом из вторичных серверов, прежде чем окончательно отключить первичный, и выполнить на нем начальную синхронизацию. Скользящий метод начальной синхронизации - самый безопасный метод для выполнения обслуживания набора реплик, и он также не включает простоев в качестве бонуса.
Обратите внимание, что возможность выполнения скользящей начальной синхронизации также зависит от размера вашего развертывания. Для чрезвычайно больших развертываний может оказаться невозможным выполнить первоначальную синхронизацию, и, следовательно, ваши параметры несколько более ограничены. Если используется WiredTiger, вы можете выбрать один дополнительный из набора, запустить его как автономный, запустить compactна нем и присоединиться к нему.
относительно repairDatabase
Пожалуйста, не запускайте repairDatabaseна узлах набора реплик . Это очень опасно, как упомянуто на странице repairDatabase и описано более подробно ниже.
Название repairDatabaseнемного вводит в заблуждение, так как команда не пытается что-либо исправить. Эта команда предназначалась для использования в случае повреждения диска на отдельном узле , что может привести к повреждению документов.
Команда repairDatabaseможет быть более точно описана как «база данных по утилизации». Таким образом, он воссоздает базы данных, отбрасывая поврежденные документы, пытаясь привести базу данных в состояние, в котором вы можете ее запустить, и извлечь из нее неповрежденный документ.
В развертываниях MMAPv1 такая перестройка файлов базы данных освобождает пространство для ОС как побочный эффект . Освобождение места для ОС никогда не было целью.
Последствия repairDatabaseна реплику набора
В наборе реплик MongoDB ожидает, что все узлы в наборе будут содержать идентичные данные. Если вы работаете repairDatabaseна узле набора реплик, есть вероятность, что узел содержит необнаруженное повреждение и repairDatabaseпокорно удалит поврежденные документы за вас.
Как и ожидалось, это заставляет этот узел содержать набор данных, отличный от остальной части набора. Если обновление попадает в этот единственный документ, весь набор может потерпеть крах.
Что еще хуже, вполне возможно, что эта ситуация может оставаться в состоянии покоя в течение длительного времени, только чтобы нанести удар внезапно без видимой причины.