Squeak.ru - шаблоны программирования

Как предотвратить сбой MongoDB при огромных совокупных запросах?

У меня есть экземпляр MongoDB, где иногда необходимо делать ранее неожиданные запросы. (В этом весь смысл без схемы, верно?)

Некоторые из них очень сложны и поэтому занимают много времени. Меня это устраивает, но я борюсь с тем, что эти запросы приводят к сбою самой службы Mongod.

Я бы подумал, что естественным способом обработки этих случаев будет просто тайм-аут или отклонение запроса, но похоже, что Mongod просто падает (ядро убивает процесс mongod с ошибкой OOM)

Это расстраивает, потому что это происходит без предупреждения. Я знаю, что MongoDB оставляет управление памятью ОС, поэтому я не понимаю, почему он допускает сбои такого типа.

Есть ли простой способ справиться с такой ситуацией?

13.09.2018

  • Я не думаю, что это проблема с MongoDB. У вас есть OOMkill, что означает, что подготовленное оборудование: 1) не имеет достаточно оперативной памяти для работы, которую вы просите, и/или 2) не настроен своп. Обратите внимание, что OOMkill — это функция ОС. MongoDB не может истечь время ожидания или отклонить запрос, и это не приводит к сбою. Он был принудительно убит, потому что на сервере закончилась оперативная память. 13.09.2018

Ответы:


1

Конечно. cursor.maxTimeMS() позволяет установить время ожидания для запрос. По истечении указанного времени запрос будет завершен.

Из документации

MongoDB нацеливает операции на завершение, если соответствующий курсор превышает отведенный ему срок. MongoDB завершает операции, которые превышают отведенный им срок, используя тот же механизм, что и db.killOp(). MongoDB завершает операцию только в одной из назначенных точек прерывания.

MongoDB не учитывает сетевую задержку между клиентом и сервером в отношении ограничения времени действия курсора. Однако для сегментированного кластера MongoDB включает задержку между экземплярами mongos и mongod в отношении этого ограничения времени.

Запросы, которые генерируют несколько пакетов результатов, продолжают возвращать пакеты до тех пор, пока курсор не превысит отведенное ему время.

Применение

db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)
13.09.2018
  • Вау, спасибо большое! Поможет ли это эффективно решить проблему с памятью, от которой я страдаю? Я просто хочу убедиться, что длительные запросы не приводят к сбою mongod, и я думаю, что это произойдет, если тайм-аут эффективно отменит текущий запрос после тайм-аута и очистит память, но если это не так, у нас все равно будет то же самое проблема. 13.09.2018
  • @Vlad Если ядро ​​​​убивает mongod, вы можете ограничить использование памяти mongod с помощью cgroup или установить максимальный лимит памяти для wiredTiger 13.09.2018
  • Обратите внимание, что, хотя это может помочь ограничить время выполнения запроса, это не поможет с использованием памяти самим запросом. С другой стороны, ограничение размера кеша WiredTiger не изменит общую память, используемую процессом mongod. Я считаю, что для рабочей нагрузки просто требуется больше оперативной памяти, чем у сервера, поэтому у ядра закончилась память, и он просто убьет самого большого пользователя памяти, который всегда будет mongod. Лучшее решение — предоставить больше оперативной памяти и достаточно места подкачки. 13.09.2018
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...