WSO2 API Manager 2.1.0集群:发布者与商店登录异常问题
嘿,看起来你碰到了WSO2 APIM 2.1.0集群里Key Manager节点的会话同步坑——登录请求被NGINX转发到KM1时成功了,但后续请求落到KM2时,因为两个节点之间没同步登录会话,KM2认不出这个已登录的会话,所以抛出警告。我来给你梳理下具体的排查和解决步骤:
1. 先搞定KM节点的会话复制配置
WSO2集群里所有节点得启用HTTP会话复制才能共享用户登录会话,你得检查两个KM节点的repository/conf/tomcat/catalina-server.xml文件:
- 找到
<Cluster>标签,确保两个节点的集群组配置一致,并且启用了DeltaManager(增量会话复制,效率更高),示例配置如下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" <!-- KM1用4000的话,KM2改成4001,避免端口冲突 --> autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.css;.*\.txt;"/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="${carbon.home}/tmp/war-temp/" deployDir="${carbon.home}/tmp/war-deploy/" watchDir="${carbon.home}/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
- 重点注意:两个KM节点的Receiver端口不能重复,其他集群核心配置(比如组播地址、端口)必须完全一样。
2. 给NGINX加会话粘性(可选但推荐)
虽然会话复制能解决跨节点会话问题,但配合会话粘性能减少不必要的复制流量。你可以在NGINX的upstream配置里加粘性规则,让同一个用户的请求始终落到同一个KM节点:
upstream km_cluster { server km1.yourdomain.com:9443; server km2.yourdomain.com:9443; sticky cookie JSESSIONID expires=1h path=/; }
这里用JSESSIONID作为粘性标识,有效期设为1小时,用户登录后后续请求都会被转发到同一个KM节点,直到会话过期。
3. 验证KM节点间的集群通信
会话复制依赖节点间的组播或TCP通信,得确保:
- 两个KM节点之间的45564(组播端口)和各自的Receiver端口(比如4000、4001)没被防火墙/安全组挡住。
- 可以用
tcpdump命令检查组播通信是否正常:
tcpdump -i any port 45564
如果组播有问题(比如云环境不支持组播),可以改成静态TCP集群:把<Membership>节点换成org.apache.catalina.tribes.membership.StaticMembershipService,手动指定两个KM节点的IP和端口。
4. 检查Carbon控制台的集群状态
登录任意一个KM节点的Carbon控制台(https://<km-host>:9443/carbon),进入Main > Cluster > Cluster Management,看看两个节点是不是都已经加入集群,状态是不是Active。如果有节点没加入,说明集群配置还有问题,得回去重新检查catalina-server.xml。
5. 清缓存重启节点
有时候旧的会话缓存会搞事情,你可以:
- 先停掉两个KM节点。
- 删除每个节点的
repository/tmp和repository/work目录。 - 先启动KM1,等它完全起来后再启动KM2,观察启动日志里有没有“Cluster member added”之类的成功加入集群的日志。
做完这些步骤后,再去测试登录Publisher和Store,应该就能解决跨KM节点的登录会话问题了。
内容的提问来源于stack exchange,提问作者FrancescoAzzola

