MAATRIX / Блог / MongoDB на сервере: частые ошибки и решения

MongoDB на сервере: частые ошибки и решения

MongoDB на сервере: частые ошибки и решения

MAATRIX

Ошибки MongoDB на сервере обычно крутятся вокруг трёх тем: авторизация, сеть и ресурсы. Ниже — разбор частых проблем: authentication failed, connection refused, отказ старта службы mongod, нехватка памяти и переполнение диска. Для каждой сначала решение, потом причина — чтобы починить быстро и понять, как выстроить работу без повторов. Отдельно затронем безопасность, потому что многие проблемы MongoDB исторически связаны именно с неверной настройкой доступа.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Authentication failed

Ошибка Authentication failed означает, что логин, пароль или база аутентификации указаны неверно. Тонкость MongoDB в том, что пользователь привязан к конкретной базе, где он создан (обычно admin для административных учёток). Если не указать правильную --authenticationDatabase, авторизация не пройдёт даже с верным паролем:

mongosh -u admin -p --authenticationDatabase admin

Для пользователя приложения, созданного в базе appdb, базой аутентификации будет appdb, а не admin. Проверьте, где именно заведён пользователь — это самая частая причина. Посмотреть список пользователей можно, подключившись администратором и выполнив db.getUsers() в нужной базе. Если пользователь есть, а пароль не подходит, сбросьте его командой db.changeUserPassword("appuser", "новый_пароль") под административной учёткой.

Ещё одна ситуация — авторизация включена, но приложение подключается без учётных данных и получает отказ на любой операции. Убедитесь, что строка подключения приложения содержит логин, пароль и правильную authSource.

Connection refused

MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017 — по адресу и порту никто не слушает. Проверьте, запущена ли служба и на каком адресе она принимает подключения:

sudo systemctl status mongod
sudo ss -ltnp | grep 27017

Если процесса нет — mongod не запущен, смотрите журнал /var/log/mongodb/mongod.log. Если MongoDB слушает только localhost, а приложение на другом сервере обращается по внешнему адресу, добавьте внутренний адрес в bindIp в /etc/mongod.conf и перезапустите службу. Но помните: открывать порт наружу без авторизации и фаервола нельзя.

В контейнерах частая ловушка — приложение обращается к 127.0.0.1, имея в виду свой контейнер, а не хост с MongoDB. Используйте адрес хоста или имя сервиса. И проверьте, что фаервол между машинами разрешает доступ с адреса приложения к порту 27017.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS под MongoDB

mongod не стартует

Служба не поднимается — частая проблема, особенно на слабых VPS. Первым делом откройте лог /var/log/mongodb/mongod.log, там всегда есть причина. Несколько типичных сценариев. Если видите сообщения о нехватке памяти, серверу мало RAM: MongoDB 8 с движком WiredTiger требователен, и на 1 ГБ может не подняться под нагрузкой. Уменьшите cacheSizeGB или добавьте памяти.

Если в логе Unclean shutdown detected и проблемы с файлами данных, база не была корректно остановлена (например, сервер выключили жёстко или убил OOM-killer). Обычно WiredTiger восстанавливается сам, дайте ему время. Если старт зацикливается, проблема может быть в правах на каталог данных — он должен принадлежать пользователю mongodb:

sudo chown -R mongodb:mongodb /var/lib/mongodb

Ещё одна причина отказа старта — ошибка в YAML-конфиге /etc/mongod.conf. YAML чувствителен к отступам, и лишний пробел ломает разбор. После каждой правки проверяйте запуск. Отдельно упомяну частую ловушку на новых процессорах и в некоторых виртуализациях: старые сборки MongoDB требовали инструкций AVX, и при их отсутствии процесс падал молча. На актуальных версиях и нормальном VPS это редкость, но если mongod падает сразу после запуска без внятной причины в логе, проверьте, что версия базы соответствует возможностям процессора вашего сервера.

Exceeded memory или высокая нагрузка

MongoDB работает, но медленно и ест всю память. Чаще всего причина в двух вещах: индексы не помещаются в кэш или запросы идут без индексов. Проверьте, использует ли запрос индекс, добавив .explain() — если видите COLLSCAN, база сканирует всю коллекцию целиком, и нужен индекс на поле фильтрации:

db.users.createIndex({ email: 1 })

Правильные индексы ускоряют запросы в сотни раз и снижают нагрузку на память. Второй момент — кэш WiredTiger конкурирует за RAM с системой. Если MongoDB делит сервер с другими службами, ограничьте cacheSizeGB, чтобы база не выдавливала соседей в swap. Активный swap для MongoDB — прямой путь к тормозам, потому что база рассчитана на работу горячих данных в памяти.

Если индексы настроены, а памяти всё равно не хватает под объём данных, это честный сигнал: серверу нужно больше RAM. Выжимать производительность из недостаточной памяти бесполезно — MongoDB упирается именно в неё.

Переполнение диска

Отказ записи из-за нехватки места виден сразу. Проверьте диск и размеры баз:

df -h
mongosh --quiet --eval "db.adminCommand('listDatabases')"

Частые пожиратели места — разросшиеся коллекции, индексы и журнал операций (oplog) в конфигурации с репликацией. Удаление документов, кстати, не всегда сразу возвращает место операционной системе: WiredTiger освобождает его внутри файлов, но не отдаёт диску автоматически. Команда compact пересобирает коллекцию и возвращает место, но это тяжёлая блокирующая операция — запускайте в период низкой нагрузки.

Профилактика та же, что для любой базы: следите за свободным местом с оповещением заранее, выносите бэкапы на отдельное хранилище, продумайте удаление или архивацию старых данных. Если объём данных объективно растёт, нужен диск большего объёма. В MAATRIX можно арендовать VPS в России, США или Великобритании с нужным SSD и памятью под MongoDB и перенести данные без спешки. Оплата — картой РФ, по СБП, криптой или токеном MAAT, иностранная карта не требуется.

Как избежать большинства проблем

Три вещи снимают львиную долю ошибок MongoDB. Первое — включённая авторизация и закрытый фаерволом порт: это защита и от угона данных, и от лишних подключений. Второе — правильные индексы под ваши запросы: они убирают и тормоза, и избыточную нагрузку на память. Третье — достаточная RAM, чтобы индексы и горячие данные помещались в кэш. Настроив это один раз, вы избавляетесь от большинства типичных сбоев ещё до того, как они появятся.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS под MongoDB

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Почему authentication failed при верном пароле?

Скорее всего неверная база аутентификации. Пользователь привязан к базе, где создан: для админа обычно admin, для пользователя приложения — его база. Укажите правильную --authenticationDatabase или authSource.

mongod не стартует, что смотреть?

Лог /var/log/mongodb/mongod.log. Частые причины: нехватка памяти под WiredTiger, права на каталог данных (chown mongodb) или ошибка отступов в YAML-конфиге.

MongoDB тормозит и ест память — почему?

Обычно запросы идут без индексов (COLLSCAN в .explain()) или индексы не помещаются в кэш. Добавьте индексы на поля фильтрации и обеспечьте достаточно RAM.

Диск заполнился, удаление документов не помогает?

WiredTiger не возвращает место диску автоматически после удаления. Команда compact пересобирает коллекцию, но она тяжёлая — запускайте в период низкой нагрузки.

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.