Назад | Перейти на главную страницу

Mongodb: обрабатывать автономные запросы, не влияя на обычные запросы

У меня есть набор реплик MongoDB с тремя участниками: первичный, вторичный и скрытый вторичный, только для резервных копий. В идеале я хочу добавить дополнительный экземпляр, предназначенный для медленных пакетных операций. Идея состоит в том, чтобы этот экземпляр выполнял операции в стиле map-reduce, выполнение которых может занять очень много времени, без замедления регулярных запросов, которые требуются для быстрого завершения.

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

Это не вопрос конфигурации. Ваши обычные запросы отправляются на текущий основной. Итак, все, что вам нужно сделать, это убедиться, что ваши пакетные операции (я предполагаю, что агрегаты и / или задания mapReduce) выполняются с вторичным. Вы можете сделать это, установив readPreference к secondary или secondaryPreferred.

Однако у этого есть ряд серьезных недостатков:

  1. Задания mapReduce не всегда могут отображать свои результаты в оперативном режиме, и их нельзя сохранить. Способ смягчить эту проблему - сохранить результаты со стороны приложения.
  2. Агрегации с $out этап будет выполняться на первичном, независимо от установленного предпочтения чтения
  3. В зависимости от ваших настроек записи, ваши вторичные серверы могут содержать устаревшие данные. В некоторых ситуациях это может быть проблемой.

В случае использования предпочтения чтения secondary или secondaryPreferred это невозможно, единственный способ минимизировать нагрузку от длительных операций, таких как агрегация наших заданий mapReduce, - это сегментирование, разделение нагрузки на несколько машин. Обратите внимание, что для реализации такого распределения нагрузки требуется тщательное планирование и моделирование данных.

Поскольку вы планируете выполнять медленные запросы на новой реплике, вы можете установить время задержки, соответствующее вашим длительным запросам на сокращение карты, например 3 минуты или 10 минут. Благодаря этой задержке вы можете получить полную производительность от вашей новой реплики. Он не будет обрабатывать несколько запросов одновременно.

Вот документация: Члены набора отложенных реплик