В 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
покорно удалит поврежденные документы за вас.
Как и ожидалось, это заставляет этот узел содержать набор данных, отличный от остальной части набора. Если обновление попадает в этот единственный документ, весь набор может потерпеть крах.
Что еще хуже, вполне возможно, что эта ситуация может оставаться в состоянии покоя в течение длительного времени, только чтобы нанести удар внезапно без видимой причины.