docker - Keycloak docker重启后如何保持infinispan Session
问题描述
我有一个正在运行的 keycloak 8 的 docker,但每当我重新启动它时,所有非离线会话都会消失。结果,每当我来更新 keycloak 时,所有用户都会断开连接。
原因:
- 我在这里阅读了这个线程并理解了为什么不保留访问令牌(主要是性能问题)。
作为解决方案,我想使用集群(如这里推荐的那样),并且我理解,核心部分只是很好地管理 Infinispan。
想法:
我首先想将那个 infinispan 存储在 docker 容器之外(在一个卷中),然后搜索 JBoss 在 docker 中将 Infinispan 保存在哪里,但我什么也没找到。
其次,我考虑了一个 SPI 来管理外部用户会话,但这似乎不是正确的解决方案,因为 infinispan 已经做得很好了。
然后设置一个集群,在这篇关于 Keycloak 中的跨数据中心支持的文章和关于 AWS 中的 Keycloak 跨数据中心设置的另一篇文章的帮助下,这似乎是一个很好的起点,但我实际上仍在使用 docker,我不确定是否从这些教程中构建 docker 图像对我来说是一个更好的主意。
欢迎任何更多想法:)
解决方案
到目前为止,我已经尝试过第二次使用 docker cluster,但现在使用 docker swarm 和来自这里的信息:
PING 发现协议在 udp 堆栈中默认使用(在standalone-ha.xml 中默认使用)。由于 Keycloak 镜像默认运行在集群模式下,所以你需要做的就是运行它:
docker run jboss/keycloak
如果您在本地运行它的两个实例,您会注意到它们形成了一个集群。
我已经使用 docker stack 在集群模式下部署了非常简单的 3 个 keycloak 实例,并带有一个外部数据库(postgres),并且运行良好。
更简单地说,keycloak docker 在使用集群时已经处理了这个用例。
有关集群用例的更多信息,请参阅有关如何设置 Keycloak 集群的教程
推荐阅读
- java - 使用 sharedpreferences 的前 5 名高分列表 java
- vue.js - Vue路由器并从商店接收数据
- javascript - 如何使用数组对象填充jstree子项并在单击时将其取回
- objective-c - 测试选项集中位子集的切换案例替代方案?
- python - 子程序后打印字符串
- c - c程序循环程序时重复的游戏尝试
- python - 解析 XML 以获取节点的子名称
- c# - 无法将 System.Collections.Generic.IEnumerable' 转换为 'System.Collections.Generic.List
- c# - 从 nuget update 命令获取返回码
- terraform - 为什么我的 Terraform 输出在模块中不起作用?