Доброго времени суток, уважаемыее!
Прочитав этот топик, решил написать свой, так как по моему мнению автор не до конца раскрыл потенциал построение HA систем на Jboss(Tomcat), к тому же в статье есть много ошибок (не грамматических).
В этом топике я не буду приводить step-by-step по конфигурации узлов, лишь выборочно, где есть нюансы.
Откуда ноги растут
Не так давно, устроился я на работу в крупную телекоммуникационную компанию.
После месяца-двух освоения в новой среде, мне была поставлена задача разработать архитектуру для запуска, переписного под Java, обновленного проекта.
За входные данные было взято:
1. Зарегистрированных пользователей ИС — 9000000
2. Активных пользователей — 2000000
3. Ежедневно активных пользователей — 500000
В итоге получилась такая архитектура:
Для запуска проекта были заказаны 6 серверов в следующей конфигурации:
2x WEB: 16 core, 12 GB DDR
2x APP: 8 core, 32 GB DDR
2x DB: 8 core, 16 GB DDR
И так, на WEB сервера был установлен apache2+mod_jk
На APP сервера Jboss AS6, Java 6
В роли БД была взята Oracle 11R, но не думаю что в настройке datasource к другим БД есть большие отличия.
Настройка
И так, приступим к настройке:
WEB:
За основу конфиги можно взять в этом топике.
На обеих APP:
[user@app01 ~]$ echo "JBOSS_HOME=/opt/jboss" >> /home/user/.bash_profile
[user@app01 ~]$ export JBOSS_HOME="/opt/jboss"
[user@app01 ~]$ vim $JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml
Строку
<Engine name="jboss.web" defaultHost="localhost"
приводим к следующему виду
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">
Для APP2 соответственно node2.
Эта строка позволит нам использовать использовать липкие сессии в балансировке mod_jk.
jvmRoute=«node1» указывает mod_jk на какую из instance ему забрасывать запрос.
Далее заливаем наше приложение в $JBOSS_HOME/server/default/deploy/, стартуем Jboss и радуемся.
Наверное у многих возникнет вопрос
А зачем такие мощные сервера?
Отвечаю: данная схема позволяет нам расширять по горизонтали не только сервера, но и instances непосредственно на существующих серверах.
Для этого требуется скопировать каталог
[user@app01 ~]$ cp $JBOSS_HOME/server/default $JBOSS_HOME/server/node3
[user@app02 ~]$ cp $JBOSS_HOME/server/default $JBOSS_HOME/server/node4
Соответственно в каждом из server.xml указать необходимый jvmRoute
А на веб серверах добавить в workers.properties новые блоки для новых instance
В строкe worker.list добавляем новые instance
Добавляем новые блоки:
worker.node3.type=ajp13
worker.node3.host=ip_app1
worker.node3.port=8009
worker.node3.lbfactor=50
worker.node3.cachesize=10
worker.node3.cache_timeout=600
worker.node3.socket_keepalive=1
worker.node3.socket_timeout=300
worker.node4.type=ajp13
worker.node4.host=ip_app2
worker.node4.port=8009
worker.node4.lbfactor=50
worker.node4.cachesize=10
worker.node4.cache_timeout=600
worker.node4.socket_keepalive=1
worker.node4.socket_timeout=300
Собственно, уже при такой конфигурации вы готовые обслуживать довольно больше количество посетителей.
Стоит отметить, что для корректного функционирования этой схемы, на балансере так же требуется установка липких сессий, иначе пользователь может попросту потеряться среди ваших серверов.
UPD: Не забываем, что БД имеет органиченое число коннектов, так что при добавлении новых инстансов, нужно учитывать эту тонкость, иначе на боевой среде можете получить лежащую БД.
Заключение
Топик не претендует на истинность, а лишь показывает в каком виде работает довольно крупный проект крупной организации, а так же какой кровью можно обслужить 10 000 000 потенциальных пользователей.
Автор: kos_fist