Ограничения подключений MongoDB: Полное руководство
Узнайте, как увеличить количество подключений MongoDB Atlas, оптимизировать пулы подключений и уменьшить ошибки таймаута. Полное руководство для экземпляров M20 с практическими советами по конфигурации.
Лимит подключений MongoDB: как увеличить количество подключений и уменьшить ошибки
Я запускаю экземпляр MongoDB Atlas M20, который должен иметь максимальное количество подключений в пуле 1500. У меня есть 1 первичный и два вторичных узла. Когда я проверяю статистику сервера, я вижу, что подключения достигают максимума в 160. В логах я сталкиваюсь со следующими ошибками:
- “Время ожидания подключения истекло”
- “Пул подключений находится в состоянии паузы для сервера”
Моя строка подключения настроена как:
mongodb+srv://bb-live-user:@myserver.mongodb.net/Live?retryWrites=true&w=majority&connect=replicaSet&maxPoolSize=1000
Как можно увеличить количество доступных подключений и уменьшить количество ошибок?
Ваш экземпляр MongoDB Atlas M20 на самом деле поддерживает до 3 000 подключений, а не только 1 500, как вы упоминали - это было увеличено в последних обновлениях. То, что вы видите максимальное количество подключений на уровне 160, указывает на возможные проблемы с конфигурацией строки подключения или управлением подключениями в вашем приложении, а не на достижение лимита, установленного Atlas. Ошибки таймаута и состояние приостановки пула указывают на необходимость оптимизации пула подключений.
Оглавление
- Понимание текущих лимитов подключений
- Анализ конфигурации подключения
- Реализация оптимизации пула подключений
- Снижение ошибок таймаута и пула
- Лучшие практики управления подключениями
- Расширенные решения
Понимание текущих лимитов подключений
MongoDB Atlas значительно увеличил лимиты подключений для всех уровней. Согласно блогу MongoDB Atlas, текущие лимиты составляют:
- Уровень M20: 3 000 подключений (ранее 1 500)
- Уровень M10: 1 500 подключений (ранее 750)
- Для более низких уровней лимиты также были увеличены пропорционально
Лимиты скорости подключения, указанные в документации Atlas, применяются specifically к кластерным уровням M10 и M20, но они относятся к скорости новых подключений в секунду, а не к общему количеству одновременных подключений.
Ваше наблюдение о том, что количество подключений достигает максимума в 160 вместо приближения к лимиту в 3 000, указывает на то, что проблема заключается в управлении подключениями в вашем приложении, а не в ограничениях Atlas. На самом деле это выгодно, так как у вас есть значительный запас для работы.
Анализ конфигурации подключения
Ваша текущая строка подключения:
mongodb+srv://bb-live-user:@myserver.mongodb.net/Live?retryWrites=true&w=majority&connect=replicaSet&maxPoolSize=1000
Хотя вы установили maxPoolSize=1000, существует несколько других параметров пула подключений, которые следует оптимизировать:
Параметры строки подключения для рассмотрения:
maxPoolSize=1000- Это подходит для вашего уровня, но убедитесь, что ваше приложение может обрабатывать такое количество подключенийminPoolSize- Должен быть установлен для поддержания базового уровня готовых подключенийconnectTimeoutMS- Время попытки подключения (по умолчанию: 10 секунд)socketTimeoutMS- Время ожидания операции сокета (по умолчанию: 0, что означает отсутствие таймаута)waitQueueMultiple- Множитель для таймаута очереди ожиданияwaitQueueTimeoutMS- Максимальное время ожидания потока подключения
Как указано в документации драйвера MongoDB Node.js, значение по умолчанию для maxPoolSize равно 5, но вы правильно установили его значительно выше.
Реализация оптимизации пула подключений
Для правильной настройки пула подключений рассмотрите следующие изменения:
Рекомендуемая строка подключения:
mongodb+srv://bb-live-user:@myserver.mongodb.net/Live?retryWrites=true&w=majority&connect=replicaSet&maxPoolSize=1000&minPoolSize=10&connectTimeoutMS=30000&socketTimeoutMS=0&waitQueueTimeoutMS=120000
Ключевые изменения конфигурации:
- Установите
minPoolSizeравным 10 - Это поддерживает базовый уровень готовых подключений - Увеличьте
connectTimeoutMSдо 30 секунд - Дает больше времени для начальных подключений - Установите
socketTimeoutMSравным 0 - Отсутствие таймаута для операций сокета (используйте с осторожностью) - Установите
waitQueueTimeoutMSравным 120 секунд - Позволяет более длительное время ожидания при высокой нагрузке
Согласно руководству по настройке пула подключений MongoDB, эти параметры помогают сбалансировать использование ресурсов и производительность при нагрузке.
Снижение ошибок таймаута и пула
Ошибки, которые вы видите - “Timed out waiting for a connection” (Таймаут при ожидании подключения) и “The connection pool is in paused state” (Пул подключений находится в состоянии паузы) - указывают на то, что ваш пул исчерпан или находится в состоянии ошибки. Вот решения:
Управление пулом подключений:
-
Реализуйте правильную очистку подключений - Как упоминается в руководстве по устранению неполадок Atlas, подключения, которые открыты, но никогда не закрыты, могут накапливаться и вызывать проблемы.
-
Используйте промежуточное ПО для пула подключений - Рассмотрите возможность реализации пула подключений, такого как PgBouncer (для PostgreSQL) или аналогичные решения для MongoDB, для лучшего управления подключениями.
-
Мониторьте использование подключений - Используйте инструменты, такие как
mongostatили мониторинг Atlas, для отслеживания активных подключений и выявления паттернов. -
Реализуйте экспоненциальный бэкофф - При получении ошибок таймаута, реализуйте логику повторных попыток с экспоненциальным бэкоффом вместо немедленных повторных попыток.
Из обсуждения на Stack Overflow, пользователи успешно решили аналогичные проблемы путем правильной настройки этих параметров таймаута и реализации правильного управления подключениями.
Лучшие практики управления подключениями
Лучшие практики на уровне приложения:
-
Используйте экземпляры MongoClient как синглтоны - Создавайте один экземпляр MongoClient на приложение и используйте его повторно на протяжении жизненного цикла приложения, а не создавайте новые клиенты для каждого запроса.
-
Реализуйте правильное управление жизненным циклом подключения:
javascript// Пример правильного управления подключением const { MongoClient } = require('mongodb'); let dbConnection; async function connectToDatabase() { if (dbConnection) return dbConnection; const client = new MongoClient(process.env.MONGODB_URI, { maxPoolSize: 1000, minPoolSize: 10, connectTimeoutMS: 30000, socketTimeoutMS: 0, waitQueueTimeoutMS: 120000 }); await client.connect(); dbConnection = client.db(); return dbConnection; } // Вызывайте эту функцию один раз при запуске приложения -
Используйте мониторинг подключений - Реализуйте мониторинг для отслеживания использования пула подключений и оповещения при приближении к лимитам.
-
Рассмотрите возможность пула подключений на уровне прокси - Как предлагается в обсуждении на Reddit, вы можете использовать пулы подключений для более эффективного использования доступных ресурсов.
Расширенные решения
Если вы продолжаете испытывать проблемы несмотря на оптимизацию, рассмотрите эти продвинутые подходы:
-
Обновите уровень Atlas - Если вашему приложению действительно требуется больше подключений, чем предоставляет M20, рассмотрите переход на более высокий уровень.
-
Реализуйте разделение чтения/записи - Распределите операции чтения по вторичным узлам для снижения нагрузки на первичный.
-
Используйте мультиплексирование подключений - Реализуйте промежуточное ПО, которое мультиплексирует несколько запросов приложения через меньшее количество подключений к базе данных.
-
Рассмотрите MongoDB Atlas Serverless - Для переменных рабочих нагрузок бессерверный вариант может обеспечить лучшее управление подключениями.
Помните, как указано в документации Mongoose, вы можете фактически захотеть уменьшить maxPoolSize, если вы сталкиваетесь с лимитами подключений, но в вашем случае вы значительно ниже установленного Atlas максимума.
Ключевой момент - убедиться, что ваше приложение правильно управляет подключениями и не допускает их утечек, используя при этом увеличенные лимиты подключений, которые Atlas теперь предоставляет для уровня M20.