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