Кластеризация и балансировка нагрузки Tomcat
Введение
Tomcat — является продвинутым и мощным контейнером сервлетов Java, способным выступать в роли сервера
приложений. В силу своей реализации Tomcat потребляет достаточно много ресурсов, поэтому не способен эффективно обслуживать большое количество пользователей.
Постановка задачи
Создать систему отвечающую следующим требованиям:
- Эффективная обработка большого количества запросов (производительность)
- Возможность увеличения производительности системы (масшабирование)
- Минимальное время простоя системы при сбоях (отказоустойчивость)
Решение
Высокодоступный кластер, умеющий распределять нагрузку между вычислительными узлами обеспечивает выполнение требований производительности и отказоустойчивости.
Масштабирование реализуется дополнительными средствами которые выходят за рамки данной статьи.
Компоненты системы
Сервера приложений — представляют собой экземпляры контейнеров сервлетов Tomcat.
Балансер — служба занимающаяся распределением нагрузки между серверами приложений.
Используемые технологии
В качестве балансера используется сервер приложений Apache с установленным модулем mod_jk.
Это так называемый «коннектор» для экземпляра Tomcat, позволяющий взаимодействовать по протоколу AJPv13 (Apache JServ Protocol). Для обеспечения функции балансинга необходимо исправить конфигурационный файл Apache.
Для серверов приложений (Tomcat)требуется обычная правка конфигурационных файлов.
Step by step
Для запуска репликации сессий в контейнере Tomcat 6.0 необходимо выполнение следующих шагов:
- Все атрибуты сессии должны выполняться java.io.Serializable
- Раcкоментировать элемент Cluster в server.xml
- Если определены клапаны кластера (cluster valves), необходимо убедиться, что ReplicationValve определена в секции Cluster файла конфигурации server.xml
- Если экземпляры Tomcat запущены на одной машине, необходимо убедиться в уникальности атрибута tcpListenPort для каждого экземпляра. В большестве случаев Tomcat-у решает эту проблему самостоятельно обнаружением доступных портов в диапазоне 4000-4100
- Файл web.xml должен иметь элемент <distributable/> или <Context distributable=»true» /> должен быть установлен.
- Если используется mod_jk, необходимо удебиться что атрибут jvmRoute установлен в движке <Engine name=»Catalina» jvmRoute=»node01″ > и значение jvmRoute совпадает с именеь worker в файле workers.properties
- Время на всех узлах должно быть синхронизировано через сервис NTP
- Балансировщик настроен для работы в режиме sticky session
О версиях системы и пакетов
В качестве операционной системы на всех узлах кластера используется AltLinux 5.9.9 с подключенным репозитарием Sisyphus.
Tomcat имеет следующие характеристики:
Server version: Apache Tomcat/6.0.26 Server built: March 9 2010 1805 Server number: 6.0.26.0 OS Name: Linux OS Version: 2.6.32-el-smp-alt9 Architecture: amd64 JVM Version: 1.6.0_18-b07 JVM Vendor: Sun Microsystems Inc.
Apache с модулем mod_jk:
Server version: Apache/2.2.16 (Unix) Server built: Sep 17 2010 02:16:15
Loaded Modules: core_module (static) mpm_worker_module (static) http_module (static) so_module (static) alias_module (shared) authz_host_module (shared) autoindex_module (shared) dir_module (shared) include_module (shared) jk_module (shared) log_config_module (shared) logio_module (shared) mime_module (shared) negotiation_module (shared)
Конфигурационные файлы
/etc/httpd2/conf/httpd2.conf
########################## jk settings ###################3 ## Load mod_jk module # Update this path to match your modules location ##LoadModule jk_module libexec/mod_jk.so # Declare the module for <IfModule directive> (remove this line on Apache 2.x) ##AddModule mod_jk.c # Where to find workers.properties # Update this path to match your conf directory location (put workers.properties next to httpd.conf) JkWorkersFile /etc/httpd2/conf/workers.properties # Where to put jk shared memory # Update this path to match your local state directory or logs directory JkShmFile /var/log/httpd2/mod_jk.shm # Where to put jk logs # Update this path to match your logs directory location (put mod_jk.log next to access_log) JkLogFile /var/log/httpd2/mod_jk.log # Set the jk log level [debug/error/info] JkLogLevel debug # Select the timestamp log format JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " ## Send everything for context /examples to worker named worker1 (ajp13) JkMountCopy On JkMount /share/* loadbalancer JkMount /share loadbalancer JkMount /alfresco/* loadbalancer JkMount /alfresco loadbalancer JkMountCopy All
/etc/httpd2/conf/workers.properties
# Worker list worker.list=loadbalancer # Define Node1 worker.node1.port=8009 worker.node1.host=10.32.0.176 worker.node1.type=ajp13 worker.node1.lbfactor=1 #worker.node1.local_worker=1 (1) worker.node1.cachesize=10 # Define Node2 worker.node2.port=8009 worker.node2.host=10.32.0.177 worker.node2.type=ajp13 worker.node2.lbfactor=1 #worker.node2.local_worker=1 (1) worker.node2.cachesize=10 ## Load-balancer worker.loadbalancer.type=lb worker.loadbalancer.balanced_workers=node1, node2 worker.loadbalancer.sticky_session=1 worker.loadbalancer.local_worker_only=1
В файле context.xml необходимо изменить строку
<Context distributable="true">
Файл server.xml:
Модифицируем тэг Engine следующим образом:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
Секция Cluster:
<!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <!-- <Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" mapSendOptions="6"/> --> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="5000" selectorTimeout="100" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> <!-- <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> --> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <!-- <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/> --> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
Ссылки
The Apache Tomcat Connector — Generic HowTo
LoadBalancer HowTo
http://tomcat.apache.org/connectors-doc/generic_howto/loadbalancers.html
Load Balancing with Apache mod_jk (httpd/Tomcat)
http://www.wellho.net/mouth/1377_Load-Balancing-with-Apache-mod-jk-httpd-Tomcat-.html
Apache, Tomcat cluster, load balancing using mod_jk
http://www.kandysoftwareinc.com/tech-articles/apache-tomcat-cluster-load-balancing-using-mod_jk
Вы можете отслеживать комментарии к этой записи с помощью RSS 2.0. Вы можете оставить комментарий, или использовать trackback с вашего сайта.
Доброго времени суток!
Админ. Хотелось бы поговорить насчёт рекламы в вашем блоге. Если вы согласны, отпишите ваши условия на e-mail. Благодарю.