Статьи

Часть 1 кластера Tomcat: простой балансировщик нагрузки

Я собираюсь начать новую серию постов о кластеризации Tomcat . В этом посте мы увидим, в чем проблема при обычном развертывании на одной машине, что такое кластеризация и почему это необходимо, и как настроить простой балансировщик нагрузки с веб-сервером Apache httpd + кластер серверов Tomcat.

Зачем нужна кластеризация? (Tomcat Clustering)

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

Итак, как мы решаем эту проблему ? Путем добавления большего количества экземпляров Tomcat к коллективно (группа / кластер) запускаются как один производственный сервер (в отличие от одного экземпляра Tomcat). Каждый экземпляр Tomcat будет развертывать одно и то же веб-приложение. Таким образом, любой экземпляр Tomcat может обработать запрос клиента. В случае сбоя одного экземпляра Tomcat другой Tomcat в кластере обрабатывает запрос.

Но есть одна большая проблема с этим подходом. Каждый экземпляр tomcat либо работает на выделенном физическом компьютере, либо на одном компьютере запущено много экземпляров tomcat (см. Мой пост о запуске нескольких экземпляров tomcat на одном компьютере ). Таким образом, каждый Tomcat работает на своем порте и, возможно, на другом IP.

Проблема с точки зрения клиента, относительно того, какой tomcat нам нужно сделать запрос. Потому что есть много экземпляров Tomcat как части кластера. Для каждого Tomcat нам нужно создать комбинацию IP и порта. подобно

http://192.168.56.190:8080/ или http://192.168.56.191:8181/

Итак, как мы решаем эту проблему?

Добавив один сервер перед всеми экземплярами Tomcat, чтобы принять все запросы и распределить их по кластеру. И этот сервер действует как балансировщик нагрузки. Доступно множество серверов с возможностями балансировки нагрузки. Здесь мы собираемся использовать веб-сервер Apache httpd в качестве балансировщика нагрузки с модулем mod_jk.

Теперь все клиенты будут иметь доступ к балансировщику нагрузки (веб-сервер Apache httpd) и не будут беспокоиться об экземплярах Tomcat. Так что теперь наш URL-адрес http://ramkitech.com/ (Apache работает на порту 80).

Apache httpd веб-сервер

Здесь мы собираемся использовать веб-сервер Apache httpd в качестве балансировщика нагрузки. Чтобы использовать возможности балансировки нагрузки сервера Apache httpd, нам нужно включить либо модуль mod_proxy, либо модуль mod_jk. Здесь мы используем модуль mod_jk.

Прежде чем продолжить, проверьте мой старый пост (виртуальный хост Apache httpd) о том, как установить сервер Apache httpd и модуль mod_jk, и как настроить mod_jk.

Как настроить Simple Load Balancer

Для простоты я собираюсь запустить 3 экземпляра Tomcat на одной машине (мы можем запустить их и на выделенных машинах) с веб-сервером Apache httpd. И одно и то же веб-приложение развернуто во всех экземплярах Tomcat.

Здесь мы используем модуль mod_jk в качестве балансировщика нагрузки. По умолчанию он использует алгоритм циклического перебора для распределения запросов. Теперь нам нужно настроить файл workers.properties как концепцию виртуального хоста на сервере Apache httpd.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
worker.list=tomcat1,tomcat2,tomcat3
 
worker.tomcat1.type=ajp13
 
worker.tomcat1.port=8009
 
worker.tomcat1.host=localhost
 
worker.tomcat2.type=ajp13
 
worker.tomcat2.port=8010
 
worker.tomcat2.host=localhost
 
worker.tomcat3.type=ajp13
 
worker.tomcat3.port=8011
 
worker.tomcat3.host=localhost

Здесь я настроил 3 экземпляра Tomcat в файле worker.properties . Итак, введите ajp13, а port — это порт ajp (не порт HTTP-соединителя), а host — это IP-адрес нашего компьютера.

Есть несколько специальных работников, которые мы должны добавить в файл worker.properties.

Первый — это работник балансировщика нагрузки, здесь его имя — балансировщик (вы можете указать любое имя).

worker.balancer.type = фунт

worker.balancer.balance_workers = tomcat1, tomcat2, tomcat3

Здесь тип этого работника — фунт, то есть балансировщик нагрузки. его особый тип обеспечивает балансировка нагрузки. И еще одно свойство — balance_workers, используется для указания всех экземпляров tomcat, таких как tomcat1, tomcat2, tomcat3 (через запятую)

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

worker.stat.type = статус

Здесь мы используем специальный тип статуса.

Теперь мы модифицируем свойство worker.list.

worker.list = балансир, стат

Так что снаружи есть 2 рабочих, которые видны (балансировщик и стат). Так что все запросы отправляются на балансировщик. Затем работник-балансировщик управляет всеми экземплярами Tomcat.

workers.properties

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
worker.list=balancer,stat
 
worker.tomcat1.type=ajp13
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
 
worker.tomcat2.type=ajp13
worker.tomcat2.port=8010
worker.tomcat2.host=localhost
 
worker.tomcat3.type=ajp13
worker.tomcat3.port=8011
worker.tomcat3.host=localhost
 
worker.balancer.type=lb
worker.balancer.balance_workers=tomcat1,tomcat2,tomcat3
 
worker.stat.type=status

На этом рабочие параметры настройки завершены. Далее нам нужно отправить все запросы работнику балансировщика.

Поэтому нам нужно изменить файл httpd.conf сервера Apache httpd

01
02
03
04
05
06
07
08
09
10
11
12
LoadModule    jk_module  modules/mod_jk.so
 
JkWorkersFile conf/workers.properties
 
JkLogFile     logs/mod_jk.log
JkLogLevel    emerg
JkLogStampFormat '[%a %b %d %H:%M:%S %Y] '
JkOptions     +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat     '%w %V %T'
 
JkMount  /status  stat
JkMount  /  balancer

Вышеприведенный код является просто кодом плиты котла. В первой строке загружается модуль mod_jk, во второй строке указывается рабочий файл (файл worker.properties). Все остальные только для целей регистрации.

Но последние 2 строки очень важны.

JkMount / status stat означает, что любой запрос, который соответствует / status, затем этот запрос направляется работнику stat. Это тип рабочего статуса, поэтому он показывает статус балансировщика нагрузки.

JkMount / балансировщик. Эта строка соответствует всем запросам, поэтому весь запрос направляется работнику балансировщика. Балансировщик использует алгоритм циклического перебора для распределения запросов к экземплярам Tomcat.

Вот и все.

Теперь откройте балансировщик нагрузки из браузера. Каждый запрос распространяется на 3 экземпляра Tomcat. Если один из экземпляров Tomcat дает сбой, балансировщик нагрузки динамически распознает его и прекращает пересылку запросов к этим неудачным экземплярам Tomcat. Другие экземпляры tomcat продолжают работать. Если неудачный tomcat восстанавливается, из сбойного состояния в нормальное состояние, балансировщик нагрузки добавляет его в кластер и также перенаправляет запрос этому tomcat. (проверьте видео)

Здесь большой вопрос: как балансировщик нагрузки знает, когда происходит сбой экземпляра Tomcat или когда Tomcat только что восстановился из сбойного состояния?

Ответ: Когда происходит сбой одного экземпляра tomcat, балансировщик нагрузки не знает, что этот экземпляр вышел из строя. Поэтому он попытается переслать запрос всем экземплярам Tomcat. Если подсистема балансировки нагрузки попытается переслать запрос неработающему экземпляру Tomcat, он не получит ответ. Таким образом, балансировщик нагрузки выставит состояние этого экземпляра как сбойное и перенаправит тот же запрос другому экземпляру Tomcat. Поэтому с точки зрения клиента мы не чувствуем, что один экземпляр Tomcat вышел из строя.

Когда Tomcat восстанавливается из сбойного состояния, балансировщик нагрузки снова не знает, что Tomcat готов к обработке. Это все еще помечено как неудачное. Периодически балансировщик нагрузки проверяет состояние работоспособности всех экземпляров Tomcat (по умолчанию 60 секунд). После проверки состояния работоспособности балансировщик нагрузки обновляет состояние этого экземпляра до OK.

Пожалуйста, поделитесь своими мыслями через комментарии.

Видео :

http://www.youtube.com/watch?feature=player_embedded&v=9gtpyqhd-NI

Ссылка: Tomcat Clustering Series Часть 1: Простой балансировщик нагрузки от нашего партнера JCG Рамы Кришнана в блоге