具有具有以下详细信息的特定集群架构:
- 使用 Apache 的 mod_cluster 1.2.0 的负载均衡器 ( 10.10.0.1 ) 不使用多播进行广告
- 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 中(与从属和主机相同):
....
<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,它附加到 group=SG1,所以它会在以下之间进行负载均衡:
- jboss-instance-1 的 server-1
- jboss-instance-2 的 server-1
- www.vhost2.com -> SG2Balancer,它附加到 group=SG2,所以它会在以下之间进行负载均衡:
- jboss-instance-1 的 server-2
- jboss-instance-2 的 server-2
这是我的 httpd 配置集:
负载均衡器.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,问题全在于会话粘性,以下是症状:
- 我的浏览器正在接受 JSESSIONID cookie,但内容如下:KhH7gInyAFPsILN6mYDQ84Kf.jboss-instance-1:server-1不会让我的下一个请求粘在 jboss-instance-1 的 server-1 上,负载均衡器将在我的请求之间切换jboss-instance-1 的 server-1 和 jboss-instance-2 的 server-1 每次更改 JSESSIONID cookie 内容。
- 当我手动编辑 JSESSIONID cookie 的内容(使用 firecookie 插件)以删除服务器名称时,如下所示:KhH7gInyAFPsILN6mYDQ84Kf.jboss-instance-1,我的请求将停留在 jboss-instance-1 上,从而导致正确的行为
没有得到太多关于多虚拟主机和多服务器组集群和负载平衡配置的文档,实现这样的配置是我自己的猜测,我可能弄错了......有什么帮助吗?