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

Балансировка нагрузки MongoDB

У меня есть приложение, написанное на java с tomcat, и я готов начать масштабирование для производства. Насколько я понимаю, мне не следует использовать балансировщик нагрузки с экземплярами маршрутизатора mongodb, поскольку это может вызвать проблемы.

Однако я понимаю, что в какой-то момент мне понадобится более одного роутера Mongo.
Как лучше всего это сделать?

Единственный способ, о котором я могу думать, - это когда я запускаю несколько копий моего сервера Tomcat, использую балансировщик нагрузки для маршрутизации трафика к одному из этих Tomcats и предварительно настроил каждый Tomcat для использования определенного маршрутизатора mongodb. Однако я не думаю, что это будет работать очень хорошо, так как если маршрутизатор mongodb выходит из строя, могут быть ошибки, а если tomcat выходит из строя, я трачу маршрутизатор mongodb.

На практике вам не понадобится больше экземпляров маршрутизатора MongoDB, пока вы не получите много серверов (каждый делает много трафика). Предполагая, что вы дойдете до этой точки, хотя проблему на самом деле решить намного проще, чем вы думаете.

Расширяя сказанное MrKurt, вы обычно делите серверы Tomcat на группы, а затем настраиваете каждую группу серверов Tomcat с набором маршрутизаторов MongoDB для аварийного переключения.

Итак, если у вас 30 серверов Tomcat, вы можете разделить их на 3 группы Tomcat по 10.
Затем настройте маршрутизатор Mongo для каждой группы и настройте что-то вроде:

Tomcat Группа 1 -> Монго 1, Монго 2, Монго 3
Tomcat Группа 2 -> Монго 2, Монго 3, Монго 1
Tomcat Группа 3 -> Монго 3, Монго 1, Монго 2

  • Каждая группа серверов Tomcat указывает на другой маршрутизатор Mongo
    Таким образом, вы не забиваете один-единственный интерфейс всеми своими запросами.

  • Если маршрутизатор Mongo по умолчанию для группы выходит из строя, вы переключаетесь на следующий
    Это обрабатывается драйвером подключения MongoDB.
    Обратите внимание на смещение цепочки аварийного переключения, как показано выше. Это предотвращает сброс чрезмерной нагрузки на любой сервер в условиях единичной ошибки.

  • Если вы потеряете один экземпляр tomcat, вы не «тратите зря» маршрутизатор Mongo.
    Вам придется потерять все экземпляры Tomcat в группе, чтобы один из маршрутизаторов Mongo перешел в режим ожидания (и даже в этом случае он не будет «потрачен впустую»: это по-прежнему избыточная мощность в случае отказа другого экземпляра маршрутизатора Mongo.

Большинство драйверов Mongo в наши дни могут обрабатывать несколько Mongo в строке подключения, драйвер Java реализовал это начиная с 2.9.0: https://jira.mongodb.org/browse/JAVA-381

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