Glassfish и mod_jk — Балансировка нагрузки и репликация сеансов

Я настраиваю среду с помощью Glassfish и mod_jk, чтобы обеспечить балансировку нагрузки и репликацию сеансов.

Мой worker.properties выглядит следующим образом:

worker.list=i1,i2,loadbalancer

# default properties for workers
worker.template.type=ajp13
worker.template.port=28080
worker.template.lbfactor=1
worker.template.socket_timeout=300

# properties for node1
worker.i1.reference=worker.template
worker.i1.host=10.0.0.93
#worker.worker1.host=node1

# properties for worker2
worker.i2.reference=worker.template
worker.i2.host=10.0.0.38
#worker.worker2.host=node2

# properties for loadbalancer
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=i1,i2

worker.loadbalancer.sticky_session=true

Шаги, которые я сделал: Создал два узла, n1 и n2, управляемые централизованно (через SSH) с моего сервера:

create-node-ssh --sshuser ubuntu --sshkeyfile /home/ubuntu/acme-auction.pem --nodehost 10.0.0.93 --installdir /home/ubuntu/glassfish3 n1
create-node-ssh --sshuser ubuntu --sshkeyfile /home/ubuntu/acme-auction.pem --nodehost 10.0.0.38 --installdir /home/ubuntu/glassfish3 n2

Создал кластер c1:

create-cluster --properties 'GMS_DISCOVERY_URI_LIST=generate:GMS_LISTENER_PORT=9090' c1

Создал два экземпляра:

create-instance --cluster  c1 --node n1 i1
create-instance --cluster  c1 --node n2 i2

начальный экземпляр i1 начальный экземпляр i2

Создал http-прослушиватель и сетевой прослушиватель

create-http-listener --listenerport 28080 --listeneraddress 0.0.0.0 --defaultvs server jk-connector
create-network-listener --protocol http-listener-1 --listenerport 28080 --jkenabled true --target c1-config jk-connector

Затем я создал параметр JVM маршрутов:

create-jvm-options --target c1 "-DjvmRoute=\${AJP_INSTANCE_NAME}"

... и свойства системы согласно jvmRoute:

create-system-properties --target i1 AJP_INSTANCE_NAME=i1
create-system-properties --target i2 AJP_INSTANCE_NAME=i2

Я ожидал, что смогу использовать свое приложение, посещая server_ip/app_name.

Если я посмотрю на куки, я увижу:

  • JSESSIONIDVERSION, формат: значение: число_операций
  • JSESSIONID, формат: value.i1
  • РЕПЛИКА, формат: i2

(или то же самое с обменом i2 и i1). Это позволяет мне предположить, что репликация настроена правильно, но когда я останавливаю i1, я получаю пустую страницу и никаких изменений в файлах cookie (я полагаю, что JSESSIONID должен изменить последнюю часть, ".i1" в ".i2", чтобы сделать запрос будет перенаправлен на i2, я ошибаюсь?). Спасибо, Андреа


person andreaxi    schedule 10.09.2012    source источник


Ответы (1)


На самом деле, это была проблема сериализации, которая не позволяла сериализовать сессию и (как следствие) переключиться на другой экземпляр. Чтобы сделать его сериализуемым, просто нужно было

  • сделать все объекты, управляемые в сеансе, реализуемыми Serializable
  • для тех, кто не может быть сериализован (например, EntityManager, Transactions...), добавьте модификатор "transient" при объявлении свойства

Надеюсь, это поможет, Андреа

person andreaxi    schedule 17.10.2012