You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 API Manager 2.1.0集群:发布者与商店登录异常问题

嘿,看起来你碰到了WSO2 APIM 2.1.0集群里Key Manager节点的会话同步坑——登录请求被NGINX转发到KM1时成功了,但后续请求落到KM2时,因为两个节点之间没同步登录会话,KM2认不出这个已登录的会话,所以抛出警告。我来给你梳理下具体的排查和解决步骤:

解决WSO2 APIM 2.1.0 KM集群登录会话同步问题

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:13:23