扩展

Keycloak 扩展和调优入门

启动 Keycloak 后,请考虑使用这些扩展和调优指南来调整您的实例以适应所需的负载

  • 最小化资源利用率

  • 达到目标响应时间

  • 最小化数据库连接池争用

  • 解决内存溢出错误或过度的垃圾回收开销

  • 通过水平扩展提供更高的可用性

垂直扩展

当您监控 Keycloak 工作负载时,请检查 CPU 或内存是否利用不足或过度利用。请参阅 CPU 和内存资源大小调整概念,以更好地调整 Java 虚拟机 (JVM) 可用的资源。

在增加 JVM 可用的内存量之前,尤其是在遇到内存溢出错误时,最好使用堆转储来确定是什么导致了占用空间的增加。过长的响应时间也可能表明 HTTP 工作队列过大,并且针对负载脱落进行调优可能比简单地提供更多内存更好。请参阅以下部分。

常用调优选项

Keycloak 会根据您提供的核心数自动调整使用的线程数。手动更改线程数可以提高整体吞吐量。有关更多详细信息,请参阅 配置线程池概念。但是,更改线程数必须与其他 JVM 资源(例如数据库连接)结合使用;否则,您可能会将瓶颈转移到其他地方。有关更多详细信息,请参阅 数据库连接池概念

要限制排队工作的内存利用率并提供负载脱落,请参阅 配置线程池概念

如果您在获取数据库连接时遇到超时,则应考虑增加可用连接数。有关更多详细信息,请参阅 数据库连接池概念

垂直自动扩展

某些平台(例如 Kubernetes)提供了垂直自动扩展机制。如果垂直自动扩展需要重启服务器实例(目前 Kubernetes 上的 Java 就是这种情况),则不建议将其用于 Keycloak。您可以考虑改为提供更高的 CPU 和/或内存限制,以允许您的 JVM 在这些限制内根据需要进行调整。

水平扩展

单个 Keycloak 实例容易出现可用性问题。如果实例宕机,您将遇到完全中断,直到另一个实例启动。通过在不同的机器上运行两个或多个集群成员,您可以大大提高 Keycloak 的可用性。

单个 JVM 对它可以处理的并发请求数有限制。额外的服务器实例可以提供大致线性的吞吐量扩展,直到相关资源(例如数据库或分布式缓存)限制了该扩展。

通常,请考虑允许 Keycloak Operator 处理水平扩展问题。使用 Operator 时,根据需要设置 Keycloak 自定义资源 spec.instances 以进行水平扩展。有关更多详细信息,请参阅 使用 Keycloak Operator 部署 Keycloak 以实现高可用性

如果您未使用 Operator,请查看以下内容

  • 如果您的实例位于不同的机器上,则可以实现更高的可用性。在 Kubernetes 上,使用 Pod 反亲和性来强制执行此操作。

  • 使用分布式缓存;对于多站点集群,请使用外部缓存以供集群成员共享相同的状态。有关相关配置的详细信息,请参阅 配置分布式缓存。嵌入式 Infinispan 缓存具有水平扩展方面的考虑,包括

    • 您的实例需要一种相互发现的方式。有关更多信息,请参阅 配置分布式缓存 中的发现。

    • 此缓存对于跨多个可用区(也称为拉伸集群)的集群不是最佳的。对于嵌入式 Infinispan 缓存,请努力将所有实例放在一个可用区中。目标是避免通信中不必要的往返,这会在响应时间中放大。在 Kubernetes 上,使用 Pod 亲和性来强制执行 Pod 的这种分组。

    • 此缓存无法优雅地处理多个成员同时加入或离开。特别是,成员同时离开可能会导致数据丢失。在 Kubernetes 上,您可以使用带有默认串行处理的 StatefulSet,以确保 Pod 顺序启动和停止。

为避免在整个站点不可用时丢失服务可用性,请参阅高可用性指南,以获取有关多站点部署的更多信息。请参阅 多站点部署

水平自动扩展

水平自动扩展允许按需添加或删除 Keycloak 实例。请记住,启动时间不会是瞬间的,并且应使用优化的镜像来最大程度地缩短启动时间。

当使用嵌入式 Infinispan 缓存集群时,动态添加或删除集群成员需要 Infinispan 对 Infinispan 缓存执行重新平衡,如果这些缓存中存在许多条目,则这可能会变得非常昂贵。为了最大程度地缩短此时间,默认情况下,我们将会话相关缓存中的条目数限制为 10000。请注意,只有在您的配置中未显式禁用 persistent-user-sessions 功能时,此优化才有可能。

在 Kubernetes 上,Keycloak 自定义资源是可扩展的,这意味着它可以作为 内置自动扩展器 的目标。例如,根据平均 CPU 利用率进行扩展

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: keycloak-hpa
  namespace: keycloak-cluster
spec:
  scaleTargetRef:
    apiVersion: k8s.keycloak.org/v2alpha1
    kind: Keycloak
    name: keycloak
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 80
启用持久会话后,通常不需要基于内存进行扩展,并且在使用远程 Infinispan 时根本不需要。如果您正在使用持久会话或远程 Infinispan 并且遇到内存问题,则最好充分诊断问题并重新访问 CPU 和内存资源大小调整概念 指南。调整内存请求和限制比水平扩展更可取。

有关更多信息,包括 自定义指标 的用法,请查阅 Kubernetes 文档

在此页