В MongoDB наблюдается некоторая значительная путаница в вопросе о мелиорации, и некоторые рекомендуемые практики совершенно опасны для определенных типов развертывания. Подробнее см. Ниже:
TL; DR repairDatabase
пытается спасти данные из автономных развертываний MongoDB, которые пытаются восстановить повреждение диска. Если он восстанавливает пространство, это чисто побочный эффект.
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 page и описано более подробно ниже.
Имя repairDatabase
немного вводит в заблуждение, так как команда не пытается ремонт ничего. Команда была предназначена для использования при повреждении диска на автономном узле , что может привести к повреждению документов.
Команда repairDatabase
может быть более точно описана как «спасение» база данных". То есть, он воссоздает базы данных, отбрасывая поврежденные документы, пытаясь получить базу данных в состояние, в котором вы можете запустить ее, и избавить от него неповрежденный документ.
В развертываниях MMAPv1 эта перестройка файлов базы данных освобождает место для ОС как побочный эффект. Освобождение пространства для ОС никогда не было целью.
repairDatabase
для набора реплик В наборе реплик MongoDB ожидает, что все узлы в наборе будут содержать одинаковые данные. Если вы запустили repairDatabase
на узле набора реплик, есть вероятность, что узел содержит необнаруженное повреждение, а repairDatabase
послушно удалит поврежденные документы для вас.
Как и ожидалось, это делает этот узел другой набор данных из остальной части набора. Если произойдет обновление, которое ударит по этому единственному документу, весь набор может сработать.
Чтобы ухудшить ситуацию, вполне возможно, что эта ситуация может оставаться бездействующей в течение длительного времени, только чтобы внезапно ударить без видимых причина.
Пришлось использовать% {DATA: электронная почта}:% {WORD: data}