Со времени запуска проекта прошло некоторое время и настало время наращивать вычислительные мощности для работы приложения. Было принято решение построить для этого кластер, который в дальнейшем можно будет легко масштабировать. Таким образом нам надо настроить кластер для распределения запросов между серверами.
Для этого мы будем использовать 4 сервера на Linux CentOS 5.5, а так же Apache, Tomcat6, mod_jk, Heartbeat.
web1, web2 сервера — для распределения запросов средствами Apache и отказоустойчивости средствами Heartbeat. tomcat1, tomcat2 сервера — Tomcat сервера для Java-приложения.
Установка софта:
Ставим Apache и Heartbeat
Так как в репозитории нет последней стабильной версии Tomcat, то я предпочитаю его скачивать с зеркала
Для того чтобы Apache на сервеах web1 и web2 научить распределять нагрузку между серверами tomcat1 и tomcat2, нужно к Apache подключить модуль mod_jk.
Скачиваем mod_jk для своей версии Apache, переименовываем и перемещаем его в директорию /etc/httpd/modules.
Делаем теже действия для app2 сервера.
Настройка Heartbeat:
Выставим параметр на чтение только для пользователя root на файл /etc/ha.d/authkeys, иначе heartbeat не запустится.
И добавим в его 2 строки. Файл должен быть идентичным на обоих узлах.
Делаем теже действия для web2 сервера.
Отредактируем файл /etc/ha.d/ha.cf. Файл должен быть идентичным на обоих узлах.
Делаем теже действия для web2 сервера.
Отредактируем файл /etc/ha.d/haresources. Файл должен быть идентичным на обоих узлах.
Делаем теже действия для web2 сервера.
Настройка балансировки:
В файл /etc/httpd/conf/httpd.conf обоих web-серверов добавляем строки:
В секции DocumentRoot добавляем следующие две строки
В папке /etc/httpd/conf обоих web-серверов создаем файл workers.properties.
Добавляем в них следующие строки:
В /opt/tomcat/conf/server.xml обоих Tomcat'ов настраиваем порты( все порты должны быть разными):
Настройка репликации сессий
Для того, чтобы при падении одного из Tomcat серверов не была уничтожена сессия пользователя, имеет смысл настроить репликацию сессий между Tomcat серверами. Для этого добавляем в /opt/tomcat/conf/server.xml в секции "<Еngine name=«Catalina» defaultHost=«localhost»>" всех Tomcat'ов следующие строки:
На этом настройка отказоустойчивого и производительного кластера для Java-сервлетов закончена. Мы добились отказоустойчивости и масштабируемой производительности, что позволит нам с легкостью добавлять новые узлы в кластер в случае нехватки производительности.
Для этого мы будем использовать 4 сервера на Linux CentOS 5.5, а так же Apache, Tomcat6, mod_jk, Heartbeat.
web1, web2 сервера — для распределения запросов средствами Apache и отказоустойчивости средствами Heartbeat. tomcat1, tomcat2 сервера — Tomcat сервера для Java-приложения.
Установка софта:
Ставим Apache и Heartbeat
[root@web1 opt]$ yum -y install httpd heartbeat
[root@web2 opt]$ yum -y install httpd heartbeat
Так как в репозитории нет последней стабильной версии Tomcat, то я предпочитаю его скачивать с зеркала
[root@tomcat1 opt]$ wget apache.vc.ukrtel.net/tomcat/tomcat-7/v7.0.21/bin/apache-tomcat-7.0.21.tar.gz
[root@tomcat1 opt]$ tar xvfz apache-tomcat-7.0.21.tar.gz
[root@tomcat1 opt]$ mkdir tomcat $$ mv apache-tomcat-7.0.21 tomcat
[root@tomcat1 opt]$ rmdir apache-tomcat-7.0.21
[root@tomcat1 opt]$ ln -s /opt/tomcat/bin/catalina.sh /etc/init.d/tomcat
[root@tomcat2 opt]$ wget apache.vc.ukrtel.net/tomcat/tomcat-7/v7.0.21/bin/apache-tomcat-7.0.21.tar.gz
[root@tomcat2 opt]$ tar xvfz apache-tomcat-7.0.21.tar.gz
[root@tomcat2 opt]$ mkdir tomcat $$ move apache-tomcat-7.0.21 tomcat
[root@tomcat2 opt]$ rmdir apache-tomcat-7.0.21
[root@tomcat2 opt]$ ln -s /opt/tomcat/bin/catalina.sh /etc/init.d/tomcat
Для того чтобы Apache на сервеах web1 и web2 научить распределять нагрузку между серверами tomcat1 и tomcat2, нужно к Apache подключить модуль mod_jk.
Скачиваем mod_jk для своей версии Apache, переименовываем и перемещаем его в директорию /etc/httpd/modules.
[root@web1 opt]$ wget archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.31/i386/mod_jk-1.2.31-httpd-2.2.x.so
[root@web1 opt]$ move mod_jk-1.2.31-httpd-2.2.x.so /etc/httpd/modules/mod_jk.so
[root@web2 opt]$ wget archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.31/i386/mod_jk-1.2.31-httpd-2.2.x.so
[root@web2 opt]$ move mod_jk-1.2.31-httpd-2.2.x.so /etc/httpd/modules/mod_jk.so
Делаем теже действия для app2 сервера.
Настройка Heartbeat:
[root@web1 opt]$ touch /etc/ha.d/authkeys
[root@web1 opt]$ touch /etc/ha.d/ha.cf
[root@web1 opt]$ touch /etc/ha.d/haresources
Выставим параметр на чтение только для пользователя root на файл /etc/ha.d/authkeys, иначе heartbeat не запустится.
[root@web1 ha.d]$ chmod 600 /etc/ha.d/authkeys
И добавим в его 2 строки. Файл должен быть идентичным на обоих узлах.
[root@web1 ha.d]$ nano authkeys
auth 2
2 sha1 your-password
Делаем теже действия для web2 сервера.
Отредактируем файл /etc/ha.d/ha.cf. Файл должен быть идентичным на обоих узлах.
[root@web1 ha.d]$ nano ha.cf
logfacility local0
keepalive 2
deadtime 10
initdead 120
bcast eth0
udpport 694
auto_failback on
node web1
node web2
respawn hacluster /usr/lib/heartbeat/ipfail
use_logd yes
logfile /var/log/ha.log
debugfile /var/log/ha-debug.log
Делаем теже действия для web2 сервера.
Отредактируем файл /etc/ha.d/haresources. Файл должен быть идентичным на обоих узлах.
[root@web1 ha.d]$ nano haresources
web1 192.168.0.1 httpd # общий ip для обращения из браузера.
Делаем теже действия для web2 сервера.
Настройка балансировки:
В файл /etc/httpd/conf/httpd.conf обоих web-серверов добавляем строки:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
В секции DocumentRoot добавляем следующие две строки
JkMount /*.jsp loadbalancer
JkMount /servlet/* loadbalancer
В папке /etc/httpd/conf обоих web-серверов создаем файл workers.properties.
[root@web1 conf]$ touch workers.properties
[root@web2 conf]$ touch workers.properties
Добавляем в них следующие строки:
worker.list=tomcat1, tomcat2, loadbalancer
worker.tomcat1.port=10010
worker.tomcat1.host=192.168.1.1
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
worker.tomcat2.port=10020
worker.tomcat2.host=192.168.1.2
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1, tomcat2
В /opt/tomcat/conf/server.xml обоих Tomcat'ов настраиваем порты( все порты должны быть разными):
[root@tomcat1 conf]$ nano server.xml
<server port="8005" ...>
<! -- Комментируется HTTP коннектор, т.к. нам нужен только AJP коннектор
<connector port="8080" protocol="HTTP/1.1" ... />
-->
<connector port="10010" protocol="AJP/1.3" ... />
[root@tomcat2 conf]$ nano server.xml
<server port="8006" ...>
<! -- Комментируется HTTP коннектор, т.к. нам нужен только AJP коннектор
<connector port="8080" protocol="HTTP/1.1" ... />
-->
<connector port="10020" protocol="AJP/1.3" ... />
Настройка репликации сессий
Для того, чтобы при падении одного из Tomcat серверов не была уничтожена сессия пользователя, имеет смысл настроить репликацию сессий между Tomcat серверами. Для этого добавляем в /opt/tomcat/conf/server.xml в секции "<Еngine name=«Catalina» defaultHost=«localhost»>" всех Tomcat'ов следующие строки:
[root@tomcat1 conf]$ nano server.xml
<еngine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="tomcat1">
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
<membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastBindAddress="127.0.0.1"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
/>
[root@tomcat2 conf]$ nano server.xml
<еngine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="tomcat2">
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
<membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastBindAddress="127.0.0.1"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4002"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
/>
На этом настройка отказоустойчивого и производительного кластера для Java-сервлетов закончена. Мы добились отказоустойчивости и масштабируемой производительности, что позволит нам с легкостью добавлять новые узлы в кластер в случае нехватки производительности.