2.2. 横向扩展
单个红帽构建的 Keycloak 实例容易受到可用性问题的影响。如果实例停机,您将遇到完全中断,直到另一个实例启动为止。通过在不同的机器上运行两个或多个群集成员,您可以大大增加红帽构建的 Keycloak 的可用性。
单个 JVM 对它可以处理的并发请求数量有限制。其他服务器实例可提供大致线性的吞吐量扩展,直到相关的资源(如数据库或分布式缓存)限制该扩展。
通常,请考虑允许红帽构建 Keycloak Operator 来处理横向扩展问题。使用 Operator 时,根据需要设置 Keycloak 自定义资源 spec.instances
,以水平扩展。如需了解更多详细信息,请参阅使用 Red Hat build of Keycloak Operator 部署红帽构建的 Keycloak for HA。
如果没有使用 Operator,请查看以下内容:
- 您的实例可能更高的可用性位于独立的机器上。在 Kubernetes 上,使用 Pod anti-affinitity 来强制执行这一点。
使用分布式缓存;对于多站点集群,将外部缓存用于群集成员来共享同一状态。有关相关配置的详情,请参阅配置分布式缓存。嵌入的 Infinispan 缓存具有横向扩展的注意事项,包括:
- 您的实例需要一种方式来互相发现。如需更多信息,请参阅配置分布式缓存中的发现。
- 此缓存不适用于跨越多个可用区(也称扩展集群)的集群。对于嵌入式 Infinispan 缓存,可处理一个可用区中的所有实例。目标是避免在响应时间内扩大通信不必要的往返。在 Kubernetes 上,使用 Pod 关联性来强制实施这种 Pod 分组。
- 这个缓存不会正常处理多个成员加入或同时保留。特别是,同时离开的成员可能会导致数据丢失。在 Kubernetes 中,您可以使用带有默认串行处理的 StatefulSet 来确保 Pod 按顺序启动和停止。
为了避免整个站点不可用时丢失服务可用性,请参阅高可用性指南以了解有关多站点部署的更多信息。请参阅多站点部署。
2.2.1. 横向自动扩展
水平自动扩展允许根据需要添加或删除红帽构建的 Keycloak 实例。请记住,启动时间不是即时的,应该使用优化的镜像来最大程度减少开始时间。
在使用嵌入的 Infinispan 缓存集群时,动态添加或删除群集成员需要 Infinispan 来执行 Infinispan 缓存重新平衡,如果这些缓存中有很多条目,这可能会变得昂贵。要最大程度减少此时间,我们默认将会话相关缓存中的条目数限制为 10000。请注意,只有在配置中没有显式禁用 persistent-user-sessions
功能时,才能进行这个优化。
在 Kubernetes 中,Keycloak 自定义资源是可扩展的,这意味着它可以被内置的自动扩展器 作为目标。