2

尝试使用 redis 设置具有非粘性会话的 tomcat 集群。

尝试使用: https ://github.com/redisson/redisson/wiki/14.-Integration%20with%20frameworks#145-spring-session

添加了 2 个 jar 文件。使用 Tomcat 7。

上下文.xml:

   <Manager className="org.redisson.tomcat.RedissonSessionManager"
                 configPath="${catalina.base}/conf/redisson.yml"
                 readMode="REDIS"

redisson.yml:

---
sentinelServersConfig:
  idleConnectionTimeout: 10000
  pingTimeout: 1000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  reconnectionTimeout: 3000
  failedAttempts: 3
  password: null
  subscriptionsPerConnection: 5
  clientName: null
  loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
  subscriptionConnectionMinimumIdleSize: 1
  subscriptionConnectionPoolSize: 50
  slaveConnectionMinimumIdleSize: 10
  slaveConnectionPoolSize: 64
  masterConnectionMinimumIdleSize: 10
  masterConnectionPoolSize: 64
  readMode: "SLAVE"
  subscriptionMode: "SLAVE"
  sentinelAddresses:
  - "redis://redis-sentinel:26379"
  masterName: "redismaster"
  database: 0
threads: 0
nettyThreads: 0
codec: !<org.redisson.codec.JsonJacksonCodec> {}
useLinuxNativeEpoll: false

Redis 起来了。它找到服务器。我没有看到任何错误。

现在当我去说经理测试。它将执行循环负载平衡。我登录到第一台服务器并获得了一个会话。我刷新,它似乎没有拉出正确的会话并且表现得好像我从未登录过。cookie 仍然设置。我刷新了几次以回到第一台服务器,但我仍然登录。

关于我所缺少的任何想法?

4

1 回答 1

1

更新:

我的应用程序使用 HttpServletRequest.login() 方法进行用户登录。此方法使之前的会话用户无效,并在登录后出于安全原因创建新会话。用户登录时会话的这种更改造成了用户无法登录的问题。当我删除 HttpServletRequest.login() 方法时,即使在登录后用户也能够正常登录并保持会话。

简而言之,如果您使用 HttpServletRequest.login(),Redisson 将无法正常工作。


我分叉了 redisson 项目(你可以在下面找到链接)并自己做了一些更改。我不知道它们是否是最佳的,但对我来说效果很好。我面临着和你一样的情况。以下是我的设置

  1. 两个tomcat配置了3个redisson sentinel。
  2. 两个 Tomcat 前面的一个 IIS 负载平衡器正在执行循环负载平衡。

问题:当用户尝试登录 Web 应用程序时,第一个登录请求似乎到达第一个 tomcat,并且一旦登录后页面刷新,第二个请求似乎由于循环平衡而到达第二个 tomcat。Redisson 无法通过第一个 tomcat 提取存储在 redis 中的会话,并在页面刷新和请求转到第二个 tomcat 时提供它。但是,redisson 创建了第二个空会话,并且用户永远不会登录。

解决方案:如果 redisson 无法使用当前的 catalina managerBase 找到会话,则在 redis 本身中搜索会话,如果您能够找到它,则使其可用并从检索到的会话中填充所有会话属性。此外,如果 redis 中不存在会话,则 redisson 可以继续创建新会话。

更改在 RedissonSession.java 中的 load 方法和 tomcat 8 文件夹中 RedissonSessionManager.java 文件中的 findSession 方法中。

PS 未针对最佳性能和其他问题进行测试,但到目前为止,这似乎解决了我遇到的问题。任何意见和分叉表示赞赏。

redisson 分叉库

于 2018-08-31T14:01:18.517 回答