Кластеризация и балансировка нагрузки 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 с вашего сайта.

1 комментарий »

 
  • Доброго времени суток!
    Админ. Хотелось бы поговорить насчёт рекламы в вашем блоге. Если вы согласны, отпишите ваши условия на e-mail. Благодарю.

 

Добавить комментарий

XHTML: Можно использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

 
Яндекс.Метрика