Apache, Tomcat: балансировка нагрузки без использования общих идентификаторов сеанса

Я работаю над приложением Spring-MVC, которое развернуто на двух экземплярах Tomcat. Балансировка нагрузки и аварийное переключение выполняются экземпляром Apache впереди с использованием mod_jk. Сейчас все работает хорошо, кроме нашей технологии PUSH.

Используемая нами технология PUSH основана на Cometd (спецификации API Bayeux), и если я вхожу в систему, то я вхожу на один сервер, но я не вижу пользователей, которые вошли на второй сервер онлайн. Я уже использую sticky sessions. Я думал, что они несут ответственность за управление этим.

Конфигурация апача:

рабочие.свойства:

worker.list=loadbalancer
worker.list=jk-status
worker.jk-status.type=status
worker.jk-status.read_only=true

worker.list=jk-manager
worker.jk-manager.type=status

worker.server1.port=8010
worker.server1.host=localhost
worker.server1.lbfactor=1
worker.server1.type=ajp13


worker.server2.port=8011
worker.server2.host=localhost
worker.server2.type=ajp13
worker.server2.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=server1,server2

worker.loadbalancer.sticky_session=true
worker.myworker.sticky_session_force=True

сайты включены/000-по умолчанию

Listen 443
<VirtualHost _default_:443>
ServerName www.domain.com
ServerAlias *.domain.com domain.com
JkMount /* loadbalancer
SSLEngine on
SSLCertificateFile /home/path/to/.crt
SSLCertificateKeyFile /home//path/to/.key
SSLCertificateChainFile /home/path/to/.ca-bundle
</VirtualHost>

apache2.conf:

LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/apache2/workers.properties
JkLogFile   /etc/apache2/mod_jk.log
JkMount /* loadbalancer

Tomcat имеет только одно изменение, то есть jvmRoute. Если надо, могу добавить. Пожалуйста, дайте мне знать, почему это может происходить и как это исправить. Большое спасибо. :-)

Сервер TomcatFirst.xml:

<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8443" enableLookups="true" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="200" 
compression="off" sslProtocols="TLS" sslEnabledProtocols="TLSv1+TLSv1.1+TLSv1.2" 
ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA" 
compressionMinSize="1024" scheme="https" secure="true" clientAuth="false" 
keystoreFile="/path/to/.keystore" keystorePass="PASSWORD" URIEncoding="utf-8"/>
 <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
/>
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="server1">
<Host name="www.domain.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Alias>domain.com</Alias>
</Engine>

Сервер TomcatSecond.xml:

 <Server port="8006" shutdown="SHUTDOWN">
    <Connector port="8444" enableLookups="true" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="200" 
    compression="off" sslProtocols="TLS" sslEnabledProtocols="TLSv1+TLSv1.1+TLSv1.2" 
    ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256,
    TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA" 
    compressionMinSize="1024" scheme="https" secure="true" clientAuth="false" 
    keystoreFile="/path/to/.keystore" keystorePass="PASSWORD" URIEncoding="utf-8"/>
     <Connector port="8011" protocol="AJP/1.3" redirectPort="8444" URIEncoding="utf-8"
     compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
    />
        <Engine name="Catalina" defaultHost="localhost" jvmRoute="server2">
    <Host name="www.domain.com"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">

            <Alias>domain.com</Alias>
    </Engine>

Изменить

Только что обнаружил новый элемент для добавления в web.xml как распространяемый. Поможет ли это? Для опробования требуется 2 развертывания, поэтому я подумал, что могу спросить.


person We are Borg    schedule 19.01.2016    source источник
comment
@stefan: добавлен server.xml. Пожалуйста, посмотрите.. :-)   -  person We are Borg    schedule 19.01.2016
comment
Да, вам нужен распространяемый флаг в web.xml, а также элемент кластера в server.xml.   -  person Stefan    schedule 21.01.2016


Ответы (1)


Можете ли вы изменить рабочий файл следующим образом?

worker.list=loadbalancer,jk-status

worker.jk-status.type=status
worker.jk-status.read_only=true

worker.server1.port=8010
worker.server1.host=localhost
worker.server1.lbfactor=1
worker.server1.type=ajp13

worker.server2.port=8011
worker.server2.host=localhost
worker.server2.type=ajp13
worker.server2.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.sticky_session=true
worker.loadbalancer.balance_workers=server1,server2

JvmRoute настроен правильно, но я не могу найти элемент кластера в ваших файлах server.xml (уровень движка или хоста)?

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

Возможно, вы захотите отключить ssl-коннекторы в Tomcats и включить их на своем веб-сервере?

Отображение должно выглядеть так:

JkMount /appName     loadbalancer
JkMount /appName/*   loadbalancer

JkMount /jkStatus    jk-status

Проверьте http://example.com/jkstatus, чтобы убедиться, что узлы нашли друг друга.

Как только кластер настроен и DeltaManager (распространяющий ваши сеансы) работает, идентификаторы сеансов будут иметь имя узла в виде суффикса: ANYSESSIONID.server1.

person Stefan    schedule 19.01.2016
comment
Что такое параметр appName здесь? У меня есть jkmount /* балансировщик нагрузки. Это не режет? - person We are Borg; 19.01.2016
comment
Обновление: после того, как я снова перезапустил их все, теперь это работает. Я тестировал с 4 коллегами. Сегодня я снова посмотрю, если возникнут какие-то проблемы, если нет, я приму ваш ответ. Спасибо.. :-) - person We are Borg; 19.01.2016
comment
Привет, Стефан, мне жаль сообщать, но решение, которое вы дали, не сработало. Вечером протестировали еще раз, с коллегами в разных локациях, часть из них скопилась на 2-м сервере, а часть на 1-м. Оба не могли видеть друг друга. Какие-либо предложения? - person We are Borg; 20.01.2016
comment
Есть идеи или предложения, Стефан? Большое спасибо. :-) - person We are Borg; 20.01.2016
comment
Что вы имеете в виду под словом видеться? - person Stefan; 22.01.2016
comment
Имея в виду. Если пользователей 5, user1,2,3,4,5. Когда u1, u2 входят в систему на первом сервере, они могут видеть в чате только противоположного человека, даже если u3, u4, u5 вошли в систему на 3-м сервере. Их не видят онлайн в чате u1 или u2 и наоборот. - person We are Borg; 22.01.2016