Другое

Ограничения подключений 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

Ключевые изменения конфигурации:

  1. Установите minPoolSize равным 10 - Это поддерживает базовый уровень готовых подключений
  2. Увеличьте connectTimeoutMS до 30 секунд - Дает больше времени для начальных подключений
  3. Установите socketTimeoutMS равным 0 - Отсутствие таймаута для операций сокета (используйте с осторожностью)
  4. Установите waitQueueTimeoutMS равным 120 секунд - Позволяет более длительное время ожидания при высокой нагрузке

Согласно руководству по настройке пула подключений MongoDB, эти параметры помогают сбалансировать использование ресурсов и производительность при нагрузке.

Снижение ошибок таймаута и пула

Ошибки, которые вы видите - “Timed out waiting for a connection” (Таймаут при ожидании подключения) и “The connection pool is in paused state” (Пул подключений находится в состоянии паузы) - указывают на то, что ваш пул исчерпан или находится в состоянии ошибки. Вот решения:

Управление пулом подключений:

  1. Реализуйте правильную очистку подключений - Как упоминается в руководстве по устранению неполадок Atlas, подключения, которые открыты, но никогда не закрыты, могут накапливаться и вызывать проблемы.

  2. Используйте промежуточное ПО для пула подключений - Рассмотрите возможность реализации пула подключений, такого как PgBouncer (для PostgreSQL) или аналогичные решения для MongoDB, для лучшего управления подключениями.

  3. Мониторьте использование подключений - Используйте инструменты, такие как mongostat или мониторинг Atlas, для отслеживания активных подключений и выявления паттернов.

  4. Реализуйте экспоненциальный бэкофф - При получении ошибок таймаута, реализуйте логику повторных попыток с экспоненциальным бэкоффом вместо немедленных повторных попыток.

Из обсуждения на Stack Overflow, пользователи успешно решили аналогичные проблемы путем правильной настройки этих параметров таймаута и реализации правильного управления подключениями.

Лучшие практики управления подключениями

Лучшие практики на уровне приложения:

  1. Используйте экземпляры MongoClient как синглтоны - Создавайте один экземпляр MongoClient на приложение и используйте его повторно на протяжении жизненного цикла приложения, а не создавайте новые клиенты для каждого запроса.

  2. Реализуйте правильное управление жизненным циклом подключения:

    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;
    }
    
    // Вызывайте эту функцию один раз при запуске приложения
    
  3. Используйте мониторинг подключений - Реализуйте мониторинг для отслеживания использования пула подключений и оповещения при приближении к лимитам.

  4. Рассмотрите возможность пула подключений на уровне прокси - Как предлагается в обсуждении на Reddit, вы можете использовать пулы подключений для более эффективного использования доступных ресурсов.

Расширенные решения

Если вы продолжаете испытывать проблемы несмотря на оптимизацию, рассмотрите эти продвинутые подходы:

  1. Обновите уровень Atlas - Если вашему приложению действительно требуется больше подключений, чем предоставляет M20, рассмотрите переход на более высокий уровень.

  2. Реализуйте разделение чтения/записи - Распределите операции чтения по вторичным узлам для снижения нагрузки на первичный.

  3. Используйте мультиплексирование подключений - Реализуйте промежуточное ПО, которое мультиплексирует несколько запросов приложения через меньшее количество подключений к базе данных.

  4. Рассмотрите MongoDB Atlas Serverless - Для переменных рабочих нагрузок бессерверный вариант может обеспечить лучшее управление подключениями.

Помните, как указано в документации Mongoose, вы можете фактически захотеть уменьшить maxPoolSize, если вы сталкиваетесь с лимитами подключений, но в вашем случае вы значительно ниже установленного Atlas максимума.

Ключевой момент - убедиться, что ваше приложение правильно управляет подключениями и не допускает их утечек, используя при этом увеличенные лимиты подключений, которые Atlas теперь предоставляет для уровня M20.

Авторы
Проверено модерацией
Модерация