У 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належним чином видалить пошкоджені для вас документи.
Передбачувано це робить, що вузол містить інший набір даних від решти набору. Якщо оновлення потрапить на цей єдиний документ, весь набір може вийти з ладу.
Що ще гірше, цілком можливо, що ця ситуація може тривалий час перебувати в спокої, лише раптово завдаючи ударів без видимих причин.