У меня есть набор реплик MongoDB с тремя участниками: первичный, вторичный и скрытый вторичный, только для резервных копий. В идеале я хочу добавить дополнительный экземпляр, предназначенный для медленных пакетных операций. Идея состоит в том, чтобы этот экземпляр выполнял операции в стиле map-reduce, выполнение которых может занять очень много времени, без замедления регулярных запросов, которые требуются для быстрого завершения.
Я не знаю конфигурации Mongo, которая могла бы этого достичь. Я хотел бы услышать идеи, как обрабатывать тяжелые автономные запросы, не затрагивая короткие запросы, близкие к реальному времени.
Это не вопрос конфигурации. Ваши обычные запросы отправляются на текущий основной. Итак, все, что вам нужно сделать, это убедиться, что ваши пакетные операции (я предполагаю, что агрегаты и / или задания mapReduce) выполняются с вторичным. Вы можете сделать это, установив readPreference к secondary
или secondaryPreferred
.
Однако у этого есть ряд серьезных недостатков:
$out
этап будет выполняться на первичном, независимо от установленного предпочтения чтения В случае использования предпочтения чтения secondary
или secondaryPreferred
это невозможно, единственный способ минимизировать нагрузку от длительных операций, таких как агрегация наших заданий mapReduce, - это сегментирование, разделение нагрузки на несколько машин. Обратите внимание, что для реализации такого распределения нагрузки требуется тщательное планирование и моделирование данных.
Поскольку вы планируете выполнять медленные запросы на новой реплике, вы можете установить время задержки, соответствующее вашим длительным запросам на сокращение карты, например 3 минуты или 10 минут. Благодаря этой задержке вы можете получить полную производительность от вашей новой реплики. Он не будет обрабатывать несколько запросов одновременно.
Вот документация: Члены набора отложенных реплик