Балансировка нагрузки MongoDB и отработка отказа маршрутизаторов запросов

Мне интересно, как балансировка нагрузки и отработка отказа между клиентом и маршрутизаторами запросов работают в MongoDB. Я пока не нашел подходящей документации. Все говорят, что это не имеет значения, и я так не думаю. Каждая часть программного / аппаратного обеспечения может выйти из строя, и всегда будет причина, по которой вы не сможете сразу же снова ее запустить.

Ситуация очень проста. Предполагая обычную настройку с сегментированными наборами реплик, клиент подключается к маршрутизатору запросов и выполняет операции. Что произойдет, если маршрутизатор запросов умрет? Есть ли предусмотренный способ автоматического переключения на второй маршрутизатор запросов? Или для балансировки нагрузки между двумя маршрутизаторами запросов?

Спасибо за помощь, Дирк


person user2722141    schedule 27.08.2013    source источник


Ответы (2)


Все говорят, что это не имеет значения, и я так не думаю.

И ваше право так. Аварийное переключение экземпляров mongos очень важно, без надлежащей архитектуры для решения этой проблемы вы можете столкнуться с серьезным сбоем в своем приложении. Это также нарушает высокую доступность MongoDB.

Что произойдет, если маршрутизатор запросов умрет?

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

Есть ли предусмотренный способ автоматического переключения на второй маршрутизатор запросов?

Если вы предоставите больше IP-адресов экземпляров mongos для конфигурации ваших приложений, это должно быть довольно автоматизировано.

Или для балансировки нагрузки между двумя маршрутизаторами запросов?

Вы также можете пойти по этому пути, если хотите предоставить только один IP-адрес, но тогда вам придется беспокоиться об этом балансировщике нагрузки и так далее, и тому подобное...

person Sammaye    schedule 27.08.2013
comment
Итак, предоставление списка IP-адресов mongos при инициализации времени инициализации клиента делает то, что я хочу? Все, что я прочитал до сих пор, это то, что в случае клиентов Java я могу подключиться к набору реплик (не сегментированному) с автоматическим определением первичных и вторичных. - person user2722141; 27.08.2013
comment
FWIW вы можете использовать DNS с несколькими записями A для балансировки нагрузки без SPOF. - person Mason; 27.08.2013
comment
О, я только что заметил, что читаю устаревшие документы. Спасибо, Гугл! ;-) Таким образом, в самой последней версии он также будет обнаруживать маршрутизаторы запросов. DNS также может быть вариантом здесь. Всем спасибо! - person user2722141; 27.08.2013

Есть некоторые драйверы (я уверен, что в JAVA и Python), которые поддерживают автоматический переход на другой ресурс и повторное подключение, если вы предоставите им соответствующий список процессов mongos. В драйвер JAVA также встроена некоторая циклическая балансировка, но эти функции существуют не во всех драйверах. например, драйвера С++ тоже нет. Проверьте функциональность данного драйвера, который вы планируете использовать.

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

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

person attish    schedule 27.08.2013