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

Горизонтальное масштабирование веб-приложения в Tomcat (балансировка нагрузки / кластеризация)

Я разрабатываю простое веб-приложение в стиле REST, состоящее из двух основных модулей.

Модуль # 1: сервер, предоставляющий веб-службы REST, без сохранения состояния, развернутый в Tomcat
Модуль # 2: Клиент REST

Есть один экземпляр Tomcat с развернутым модулем №1.

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

Как мне подойти к этому?

Я провел исследование, и вот возможные подходы, которые я вижу:

1. Ни кластера, ни стороннего прокси.

Я запускаю второй Tomcat на второй машине. Поскольку у меня есть контроль над клиентом и сервером, я могу предоставить очень простой алгоритм на стороне клиента и случайным образом выбрать хост, который будет выбран перед вызовом API. Не потребуется ни настраивать кластер, ни предоставлять сторонний прокси. Есть ли потенциальные подводные камни? Это правильный подход?

2. Кластер Tomcat

Когда дело доходит до конфигурации кластера Tomcat, означает ли это, что 2 Tomcats работают на отдельных машинах, и в их конфигурации указано, что они являются кластером? Нужна ли мне отдельная библиотека, инструмент для этого? Достаточно ли Tomcat? Будет ли у меня работать 2 процесса, как в первом подходе?

3. Балансировщик нагрузки Tomcat

В чем разница между кластером Tomcat и балансировщиком нагрузки Tomcat? Опять же, нужна ли мне отдельная библиотека, инструмент для этого? Достаточно ли Tomcat?

4. Сторонний прокси

Я нашел информацию о таких вещах, как HAProxy. Означает ли это, что все звонки проходят через него, и прокси решает, какой хост выбрать? Означает ли это, что помимо двух процессов Tomcat будет отдельно работать третий? На какой машине работает этот прокси, если у меня 2 Tomcats на двух разных машинах?

Какой мне выбрать? Я что-то не понимаю? Статьи, ответы приветствуются.

Сначала вы видите различия между обоими вариантами балансировки нагрузки (без кластера) и Кластер с репликацией.

Кластеризация имеет формальное значение. Кластер - это группа ресурсов, которые пытаются достичь общей цели и знают друг о друге. Кластеризация обычно включает в себя настройку ресурсов (обычно серверов) для обмена деталями на определенном канале (порте) и продолжения обмена своими состояниями, поэтому состояние ресурса реплицируется и в других местах. Обычно он также включает в себя балансировку нагрузки, при которой запрос направляется на один из ресурсов в кластере в соответствии с политикой балансировки нагрузки.

Кластерная архитектура используется для решения одной или нескольких из следующих проблем:

  • Один сервер не может эффективно обрабатывать большое количество входящих запросов
  • Приложению с отслеживанием состояния необходим способ сохранения данных сеанса в случае сбоя сервера.
  • Разработчику требуется возможность вносить изменения в конфигурацию или развертывать обновления своих приложений без прекращения обслуживания.

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

Документация: Apache Tomcat - Кластеризация / репликация сеансов.

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

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

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

Для реализации балансировщика нагрузки в Apache Http Server у вас есть несколько вариантов:

  • Используя JK native connector
  • Использование Apache HTTP mod_proxy

Ссылка: