WAS集群请求分发和负载均衡问题
立信最重要 2016-03-24 01:31:09 楼主有个生产环境,有3台服务器,以下简称为A/B/C,上面建了A/B/C三个node节点,IHS和DM也部署在A上,只有1个IHS,简单的1拖3架构。
建了1个水平集群,3个SERVER分布在3个node上。SERVER配置只改动了JVM大小、webcontainer大小、JVM日志、cookie名(每个server不一样),其他均未改动。
IHS只改动了maxclients,其他未改动。
IHS PLUGIN 均为默认配置,未改动。
楼主碰到的问题:
有个应用,登录的时候会把一些信息存储到SESSION中,紧接着的后一个请求再取出来用。但是生产环境出现了下一个请求有时候会取不到上一个请求保存的SESSION的情况,概率较小。
进一步测试,如果把a server关掉,只留b/c server,取不到SESSION的情况概率大大增加,可以达到50%。
而如果a server是开着的,貌似请求大部分都发给了a server处理。
把IHS PLUGIN的日志调整为DEBUG级别,跟踪后发现了以下规律:
1)如果上一个请求是b/c server响应的,下一个请求却发给了a,于是就出现了取不到SESSION的情况。
PLUGIN-IN日志记录:DEBUG: ws_server_group: NewserverGroupNextRoundRobinServer: Round Robin load balancing ;(采用RR)
2)如果上一个请求是a server响应的,下一个请求基本上都还是交给a处理。
PLUGIN-IN日志记录:DEBUG: ws_common: websphereParseCloneID: Parsing clone ids from 0000HYWoVdhHX4hteSmeTGkOCCz:1a854qhjl;(session Affinity)
3)PLUGIN里面记录的统计信息如下,可以看到只有a1有affinityRequest,并且a1响应了绝大部分请求。
STATS: ws_server: serverSetFailoverStatus: Server Node134_cluster2_server_a1 : pendingRequests 0 failedRequests 0 affinityRequests 997 totalRequests 1026.
STATS: ws_server: serverSetFailoverStatus: Server hrac1Node01_cluster2_server_b1 : pendingRequests 0 failedRequests 0 affinityRequests 0 totalRequests 5.
STATS: ws_server: serverSetFailoverStatus: Server hrac2Node01_cluster2_server_c1 : pendingRequests 0 failedRequests 0 affinityRequests 0 totalRequests 35.
从以上测试结果来看,a server有session affinity效果,只要一开起来,会把压力都集中到这台上面。
b/c server没有session affinity效果,请求分发采用随机轮询,就可能会出现下一个请求取不到上个请求保存的SESSION的问题。
查看plugin-cfg.xml ,看到它配置了AffinityCookie="cluster2_a1",不过并没有其它两个session:cluster2_b1/cluster2_c1的配置。
也就是说,只有cluster2_a1朿 session Affinity,而其它cluster2_b1/cluster2_c1却没有。
<UriGroup Name="default_host_cluster2_URIs">
<Uri AffinityCookie="cluster2_a1" AffinityURLIdentifier="jsessionid" Name="/cm/*"/>
</UriGroup>
如果我把cluster2_b1/cluster2_c1两个cookie也都添加到上面的affinityCookie配置里面,仍然只有cluster_a1有affinity 效果。
总结问题:WAS 为什么只给a1 赋予了AffinityCookie,而其它两个没有?这样子不是会负载失衡吗?
有没有什么办法可以使皿3个server都有Affinity效果。