Прикрепленные сеансы не поддерживаются в балансировщике нагрузки Mod_cluster для JBoss EAP 7

Я сертифицирую свое приложение на JBoss EAP 7. Мое приложение работает в автономном режиме, но в кластерном режиме мое приложение развертывается, но я не могу войти в систему. Я снова перенаправлен на URL-адрес входа. Я настроил кластер с помощью mod_cluster.

В журналах Load Balancer Server нет журнала ошибок ни на отдельных узлах кластера. В моей тестовой среде мой балансировщик нагрузки и 2 серверных узла находятся на одном компьютере. Я дал узлам JBoss разные порты и идентификаторы экземпляров, чтобы различать узлы. Я делюсь своими извлечениями из mod_cluster.conf и JBoss standalone-ha.xml с одного из узлов кластера. Заранее спасибо.. Пожалуйста, не ставьте вопрос против, присылайте любые предложения в комментариях, чтобы перефразировать вопрос.

Ниже приведены фрагменты в файле standalone-ha.xml:

Настройки Modcluster:

 <subsystem xmlns="urn:jboss:domain:modcluster:2.0">
    <mod-cluster-config advertise-socket="modcluster" proxies="proxy1" balancer="testcluster" advertise="true" connector="ajp">
        <dynamic-load-provider>
            <load-metric type="busyness"/>
        </dynamic-load-provider>
    </mod-cluster-config>  
</subsystem>   

Настройки Undertow:

  <subsystem xmlns="urn:jboss:domain:undertow:3.1" instance-id="node1">
    <buffer-cache name="default"/>
    <server name="default-server">
        <ajp-listener name="ajp" socket-binding="ajp"/>
        <http-listener name="default" socket-binding="http" redirect-socket="https"/>
         <host name="default-host" alias="localhost">
            <location name="/" handler="welcome-content"/>
            <filter-ref name="server-header"/>
            <filter-ref name="x-powered-by-header"/>
        </host>
    </server>
   <servlet-container name="default">
        <jsp-config/>
        <websockets/>
    </servlet-container>
    <handlers>
        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    </handlers>
    <filters>
        <response-header name="server-header" header-name="Server" header-value="JBoss-EAP/7"/>
        <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
    </filters>
</subsystem>  

Содержимое группы привязки сокета:

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
    <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
    <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
    <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
    <socket-binding name="http" port="${jboss.http.port:8080}"/>
    <socket-binding name="https" port="${jboss.https.port:8443}"/>
    <socket-binding name="jgroups-mping" interface="private" port="0" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45700"/>
    <socket-binding name="jgroups-tcp" interface="private" port="7600"/>
    <socket-binding name="jgroups-tcp-fd" interface="private" port="57600"/>
    <socket-binding name="jgroups-udp" interface="private" port="55200" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45688"/>
    <socket-binding name="jgroups-udp-fd" interface="private" port="54200"/>
    <socket-binding name="modcluster" port="0" multicast-address="224.0.1.105" multicast-port="23364"/>
    <socket-binding name="txn-recovery-environment" port="4712"/>
    <socket-binding name="txn-status-manager" port="4713"/>
    <outbound-socket-binding name="mail-smtp">
        <remote-destination host="localhost" port="25"/>
    </outbound-socket-binding>
    <outbound-socket-binding name="proxy1"> 
    <!-- host and port number of the load-balancer.  -->
        <remote-destination host="x.x.x.x" port="81"/>
    </outbound-socket-binding>
 </socket-binding-group>  

Содержимое mod_cluster.conf следующее :

LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule cluster_slotmem_module modules/mod_cluster_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule advertise_module modules/mod_advertise.so

MemManagerFile "//httpd2.4.6Home/var/cache/mod_cluster"

<IfModule manager_module>
    Listen 81
    <VirtualHost *:81>
    <Directory />
        Require all granted
    </Directory>
    <Location />
        Require all granted
    </Location>
    <Location /mod_cluster_manager>
        SetHandler mod_cluster-manager
        Require all granted
    </Location>
        KeepAliveTimeout 60
        MaxKeepAliveRequests 0
        ManagerBalancerName testcluster
        AdvertiseFrequency 5
        ServerAdvertise on
        EnableMCPMReceive
    </VirtualHost>
</IfModule>  
0
задан 28 April 2017 в 14:53
1 ответ

Это действительно похоже на проблему с закреплением сеанса.

IMHO ваша конфигурация кажется нормальной. Можете ли вы выполнить вызов curl в своем приложении? Или просто страницу JSP для проверки вашей конфигурации.

curl -b cookie.txt -c cookie.txt YOUR_BALANCER_ADDRESS/YOURAPP -v

Можете ли вы выполнить вызов curl в своем приложении? Или просто какую-нибудь JSP-страницу для проверки вашей конфигурации.

curl -b cookie.txt -c cookie.txt YOUR_BALANCER_ADDRESS/YOURAPP -v

Или используйте этот отличный сценарий

final char CR = '\r'
final char LF = '\n'
String host = (args.size() >= 1) ? args[0] : '127.0.0.1'
int port = (args.size() >= 2) ? Integer.parseInt(args[1]) : 8080
String path = (args.size() >= 3) ? args[2] : "/clusterbench/jvmroute"
Socket socket
OutputStreamWriter out
InputStream ins
BufferedReader reader
try {
    socket = new Socket(host, port)
    def req = "GET ${path} HTTP/1.1" + CR + LF +
          "Host: ${host}:${port}" + CR + LF +
          'Accept: */*' + CR + LF +
          'Connection: close' + CR + LF + CR + LF
    println "Sending request \n" + req
    socket = new Socket(host, port)
    out = new OutputStreamWriter(socket.getOutputStream(), "UTF-8")
    out.write(req)
    out.flush()
    ins = socket.getInputStream()
    reader = new BufferedReader(new InputStreamReader(ins))
    reader.readLines().each { line ->
            println line
    }
} catch (Exception ex) {
    println "Exception: " + ex
} finally {
    socket?.close()
    out?.close()
    reader?.close()
}

Использование:

groovy test.groovy IP_ADDRESS PORT PATH_TO_APP

Пример:

groovy test.groovy 127.0.0.1 2080 "/clusterbench/jvmroute"

Вывод: Отправка запроса GET / clusterbench / jvmroute HTTP / 1.1 Хост: 192.168.122.206:2080 Принять: / Connection: close

HTTP/1.1 200 OK
Date: Wed, 07 Jun 2017 08:18:03 GMT
Server: JBoss-EAP/7
X-Powered-By: Undertow/1
Set-Cookie: JSESSIONID=TK454oHgFFX05Duw7LxTS3bO4JyyMLcqrqv5IWm_.jboss-eap-7.1-2; path=/clusterbench
Content-Type: text/plain;charset=UTF-8
Content-Length: 15
Connection: close

Мы ищем заголовок "Set-Cookie:", чтобы убедиться, что рабочий узел правильно установите sessionId и это маршрут jvm.

Если он это сделает, то проблема будет где-то еще.

Вывод консоли диспетчера мод-кластеров тоже может помочь.

Ничего особенного мне в голову не приходит.

  • Вы запускаете 2 EAP без указания имен на одном компьютере, и они не сгруппированы. Это будет показано в выводе консоли диспетчера мод-кластеров. Вывод журнала EAP тоже может помочь

  • Узел EAP не устанавливает jvmRoute и они не кластеризованы (curl, журнал EAP может помочь)

  • Ваше приложение не устанавливает идентификатор сеанса (может помочь случайный запрос на загибание страницы JSP)

Извините, я ничем не могу помочь

2
ответ дан 4 December 2019 в 13:33

Теги

Похожие вопросы