Tomcat 使用 redisson 的非粘性会话
Tomcat non-sticky sessions with redisson
正在尝试使用 Redis 设置具有非粘性会话的 tomcat 集群。
尝试使用:
https://github.com/redisson/redisson/wiki/14.-Integration%20with%20frameworks#145-spring-session
添加了2个jar文件。使用 Tomcat 7.
context.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 仍然设置。我刷新了几次以返回到第一台服务器,但我仍然处于登录状态。
关于我遗漏的任何想法?
更新:
我的应用使用 HttpServletRequest.login() 方法进行用户登录。此方法使用户之前的会话无效,并在登录后出于安全原因创建新会话。
用户登录时会话的这种变化造成了用户永远无法登录的问题。当我删除 HttpServletRequest.login() 方法时,用户能够正常登录并在登录后保持会话。
简而言之,如果您使用 HttpServletRequest.login(),Redisson 无法正常工作。
我 fork 了 redisson 项目(你可以在下面找到 link)并做了一些我自己的修改。我不知道它们是否是最佳的,但对我来说效果很好。
我遇到了和你一样的情况。以下是我的设置
- 两个tomcat配置了3个redisson sentinel。
- 两个 tomcat 前面的一个 IIS 负载平衡器正在执行循环负载平衡。
问题:
当用户尝试登录 Web 应用程序时,第一个登录请求似乎首先到达 tomcat,并且在登录后页面刷新后,由于循环平衡,第二个请求似乎到达第二个 tomcat。 Redisson 不知何故无法从第一个 tomcat 拉取存储在 redis 中的会话,并在页面刷新和请求转到第二个 tomcat 时提供它。然而,redisson 创建了第二个空会话,用户永远无法登录。
解决方法:
如果 redisson 无法使用当前的 catalina managerBase 找到会话,则在 redis 本身中搜索会话,如果您能够找到它,则使其可用并从检索到的会话中填充所有会话属性。此外,如果 redis 中不存在会话,则 redisson 可以继续创建新会话。
RedissonSession.java 中的加载方法和 tomcat 8 文件夹中 RedissonSessionManager.java 文件中的 findSession 方法发生了变化。
P.S。未针对最佳性能和其他问题进行测试,但到目前为止,这似乎解决了我遇到的问题。任何意见和分叉表示赞赏。
正在尝试使用 Redis 设置具有非粘性会话的 tomcat 集群。
尝试使用: https://github.com/redisson/redisson/wiki/14.-Integration%20with%20frameworks#145-spring-session
添加了2个jar文件。使用 Tomcat 7.
context.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 仍然设置。我刷新了几次以返回到第一台服务器,但我仍然处于登录状态。
关于我遗漏的任何想法?
更新:
我的应用使用 HttpServletRequest.login() 方法进行用户登录。此方法使用户之前的会话无效,并在登录后出于安全原因创建新会话。 用户登录时会话的这种变化造成了用户永远无法登录的问题。当我删除 HttpServletRequest.login() 方法时,用户能够正常登录并在登录后保持会话。
简而言之,如果您使用 HttpServletRequest.login(),Redisson 无法正常工作。
我 fork 了 redisson 项目(你可以在下面找到 link)并做了一些我自己的修改。我不知道它们是否是最佳的,但对我来说效果很好。 我遇到了和你一样的情况。以下是我的设置
- 两个tomcat配置了3个redisson sentinel。
- 两个 tomcat 前面的一个 IIS 负载平衡器正在执行循环负载平衡。
问题: 当用户尝试登录 Web 应用程序时,第一个登录请求似乎首先到达 tomcat,并且在登录后页面刷新后,由于循环平衡,第二个请求似乎到达第二个 tomcat。 Redisson 不知何故无法从第一个 tomcat 拉取存储在 redis 中的会话,并在页面刷新和请求转到第二个 tomcat 时提供它。然而,redisson 创建了第二个空会话,用户永远无法登录。
解决方法: 如果 redisson 无法使用当前的 catalina managerBase 找到会话,则在 redis 本身中搜索会话,如果您能够找到它,则使其可用并从检索到的会话中填充所有会话属性。此外,如果 redis 中不存在会话,则 redisson 可以继续创建新会话。
RedissonSession.java 中的加载方法和 tomcat 8 文件夹中 RedissonSessionManager.java 文件中的 findSession 方法发生了变化。
P.S。未针对最佳性能和其他问题进行测试,但到目前为止,这似乎解决了我遇到的问题。任何意见和分叉表示赞赏。