Липкий сеанс не работает с несколькими Apache Vhosts и несколькими группами серверов JBoss 7.2

Наличие определенной кластерной архитектуры со следующими деталями:

  • Балансировщик нагрузки (10.10.0.1) с использованием Apache mod_cluster 1.2.0 без рекламы с использованием многоадресной рассылки
  • 2 сервера JBoss AS 7.2 (jboss-instance-1, jboss-instance-1) в доменном режиме (хост и ведомый), вместо многоадресной рассылки я использую список прокси

В domain.xml у меня есть следующие настройки (только важные фрагменты):

    ...
        <subsystem xmlns="urn:jboss:domain:modcluster:1.1">
            <mod-cluster-config advertise-socket="modcluster" connector="ajp" balancer="${mycluster.modcluster.balancer:DefaultBalancer}" proxy-list="10.10.0.1:6677">
                <dynamic-load-provider>
                    <load-metric type="busyness"/>
                </dynamic-load-provider>
            </mod-cluster-config>
        </subsystem>
    ...
    ...
    <server-group name="SG1" profile="ha">
        <system-properties>
            <property name="mycluster.modcluster.balancer" value="SG1Balancer"/>
        </system-properties>
        <jvm name="default"/>
        <socket-binding-group ref="ha-sockets"/>
    </server-group>
    <server-group name="SG2" profile="ha">
        <system-properties>
            <property name="mycluster.modcluster.balancer" value="SG2Balancer"/>
        </system-properties>
        <jvm name="default"/>
        <socket-binding-group ref="ha-sockets"/>
    </server-group>
    ....

И в host.xml (так же, как в slave и host):

    ....
    <servers>
        <server name="server-1" group="SG1" auto-start="true">
            <socket-bindings port-offset="1"/>
        </server>
        <server name="server-2" group="SG2" auto-start="true">
            <socket-bindings port-offset="2"/>
        </server>
    ....

Мне нужно указать каждый виртуальный хост на определенную группу серверов, так что это мое решение для этого:

  • www.vhost1.com -> SG1Balancer, который присоединен к группе =SG1, поэтому он будет загружать баланс между:
    • jboss-instance-1 server-1
    • Сервер-экземпляр jboss-instance-2
  • www.vhost2.com -> SG2Balancer, который присоединен к группе =SG2, поэтому он будет загружать баланс между:
    • сервер-2 jboss-instance-1
    • Сервер-2 jboss-instance-2

Вот мои наборы конфигурации httpd:

loadbalancer.conf:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

LoadModule slotmem_module modules/mod_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so

<IfModule manager_module>
  Listen 0.0.0.0:6677
  ManagerBalancerName ddrct-cluster

  <VirtualHost *:6677>
    ServerName RecetteDtvLb1
    <Location />
      Order deny,allow
      Allow from 0.0.0.0
    </Location>

    # No server advertising
    # we're using proxy-list
    ServerAdvertise Off

    KeepAliveTimeout 300
    MaxKeepAliveRequests 0
    EnableMCPMReceive

    <Location /mcm>
      SetHandler mod_cluster-manager
      Order deny,allow
      Allow from 0.0.0.0
    </Location>
  </VirtualHost>
</IfModule>

vhosts.conf:

ProxyRequests Off
NameVirtualHost *:80

<VirtualHost *:80>
  ServerName www.vhost1.com

  ProxyPass / balancer://SG1Balancer stickysession=JSESSIONID
  ProxyPassReverse / balancer://SG1Balancer
  ProxyPreserveHost On

  ErrorLog "logs/vhost1_error.log"
  CustomLog "logs/vhost1_access.log" common
</VirtualHost>

<VirtualHost *:80>
  ServerName www.vhost2.com

  ProxyPass / balancer://SG2Balancer stickysession=JSESSIONID
  ProxyPassReverse / balancer://SG2Balancer
  ProxyPreserveHost On

  ErrorLog "logs/vhost2_error.log"
  CustomLog "logs/vhost2_access.log" common
</VirtualHost>

Все работает нормально, развернутые приложения в G1 можно использовать через www.vhost1.com и наоборот для G2, проблема все в липкости сеанса, вот признаки:

  • Мой браузер принимает cookie-файл JSESSIONID, но с таким содержимым: KhH7gInyAFPsILN6mYDQ84Kf.jboss-instance-1: server-1 не будет привязывать мой следующий запрос к server-1 jboss-instance-1, балансировщик нагрузки переключит мои запросы между jboss-instance-1 server-1 и jboss-instance-2 server-1 и каждый раз, когда он изменяет содержимое файла cookie JSESSIONID.
  • Когда я вручную изменяю содержимое файла cookie JSESSIONID (используя плагин firecookie), чтобы удалить имя сервера, например: KhH7gInyAFPsILN6mYDQ84Kf.jboss-instance-1, мои запросы будут зависать от jboss-instance-1, что приведет к правильному поведению

Не было получено слишком много документации о кластерах с несколькими виртуальными хостами и несколькими группами серверов и конфигурациями балансировки нагрузки, я сам догадывался о реализации такой конфигурации, я могу ошибаться... любая помощь?

2 ответа

Решение

Проблема устранена, начиная с KB182813:

  • Не вставляйте символ "-" в имя вашего балансировщика, так как это, как известно, создает проблемы слипания сеанса.
  • Не используйте заглавные буквы в имени вашего балансировщика

Что касается имен узлов
Соответствующая проблема MODCLUSTER-435 была решена в ноябре 2014 года. Безопасно использовать символы верхнего регистра и тире в любой приличной версии mod_cluster, то есть 1.3.x.

Что касается ProxyPass
Не нужно устанавливать что-либо связанное с ProxyPass, если только вы не хотите делать что-то особенное. Вышеупомянутая настройка является избыточной и странной. Mod_cluster использует mod_proxy в качестве своего бэкэнда, поэтому он на самом деле динамически настраивает членов балансировщика прокси-проходов для вас. Имеет смысл иметь собственные дополнительные настройки ProxyPass, если вы хотите изменить поведение балансировщика нестандартным способом, например

  • Нужно, чтобы статический контент подавался с HTTP-сервера Apache, а динамический передавался работникам Wildfly: ProxyPassMatch ^/app/static/ ! ProxyPass /app balancer://qacluster stickysession=JSESSIONID|jsessionid nofailover=on ProxyPass / ! ProxyPassReverse /app balancer://qacluster ProxyPassReverseCookieDomain / /app/ ProxyPassReverseCookiePath / /app/ ProxyPreserveHost on
Другие вопросы по тегам