1. Природа ошибки 22988 в MongoDB: причины несовместимости параметров WiredTiger
Природа ошибки 22988 в MongoDB: причины несовместимости параметров WiredTiger
Представьте ситуацию: вы обновляете Docker-контейнеры Rocket.Chat, ожидая новых функций, но вместо экрана входа видите бесконечную загрузку, а в логах базы данных мелькает загадочное сообщение: BadValue: WiredTiger error (-22988). Эта цифра — не просто порядковый номер сбоя, а сигнал о том, что база данных внезапно «забыла», как читать собственные файлы на диске.
Что скрывается за кодом 22988
Ошибка 22988 в MongoDB напрямую связана с движком хранения WiredTiger. Это основной механизм, который отвечает за то, как данные записываются в файлы, сжимаются и кэшируются. Когда MongoDB запускается, она сверяет текущие параметры конфигурации с теми метаданными, которые уже записаны в файлах данных (обычно в файле WiredTiger.turtle или WiredTiger).
> Ошибка 22988 (WiredTiger Error) — это состояние «несоответствия конфигурации», при котором параметры инициализации движка в текущей сессии противоречат параметрам, с которыми база была создана или запущена в последний раз. > > MongoDB Documentation
В контексте Docker и Rocket.Chat это означает, что контейнер с новой версией MongoDB пытается открыть «старую» папку с данными, используя настройки, которые движок считает недопустимыми или конфликтующими.
Почему это происходит в Docker-инфраструктуре
В изолированной среде Docker проблема редко возникает «сама по себе». Как правило, она становится следствием одного из трех сценариев, представленных в таблице ниже:
| Причина | Механизм возникновения |
| :--- | :--- |
| Скачок версии | Вы обновили образ MongoDB (например, с 4.4 до 5.0), минуя промежуточные этапы, и формат метаданных WiredTiger изменился. |
| Смена параметров сжатия | В новой версии образа по умолчанию включен другой алгоритм (например, zstd вместо snappy), который несовместим с текущими файлами. |
| Конфликт mmapv1 | Попытка запустить современные версии MongoDB на данных, которые когда-то были созданы очень старым движком mmapv1. |
Самая частая причина для администраторов Rocket.Chat — это автоматическое обновление через тег :latest в Docker Compose. Если вчера ваша база работала на версии 4.0, а сегодня Docker подтянул версию 6.0, движок WiredTiger заблокирует запуск, чтобы предотвратить необратимую порчу данных.
Конфликт параметров WiredTiger
Ключевой конфликт при ошибке 22988 часто кроется в строке конфигурации storage.wiredTiger.engineConfig.configString. В этой строке зашифрованы параметры создания системных таблиц.
Если вы попытаетесь изменить, например, размер внутренней страницы памяти или метод логирования в конфигурационном файле (или через флаги запуска контейнера), WiredTiger обнаружит, что эти значения отличаются от тех, что жестко зашиты в заголовках файлов .wt в вашем Docker Volume.
Результат всегда один:
-22988.Exited (14) или бесконечный Restarting.Взаимосвязь с Rocket.Chat
Для работы Rocket.Chat критически важна стабильность Replica Set (набора реплик) MongoDB. Даже если у вас всего один узел базы, он инициализируется как реплика. Ошибка 22988 разрывает эту цепочку: база не может стартовать -> Replica Set не инициализируется -> Rocket.Chat не может подключиться и падает с ошибкой Selection timeout.
Проблема усугубляется тем, что данные находятся внутри Docker Volume. Мы не можем просто «подправить» файл внутри упавшего контейнера, так как он постоянно перезапускается. В следующих разделах мы разберем, как «подступиться» к этим данным и заставить WiredTiger снова их принять.