本主题描述了高可用性多站点设置以及预期行为。它概述了高可用性体系结构的要求,并描述了其优点和权衡。
使用此设置提供能够容忍站点故障的 Keycloak 部署,从而降低停机时间的可能性。
两个独立的 Keycloak 部署运行在不同的站点,并通过低延迟网络连接连接。用户、领域、客户端、会话和其他实体存储在数据库中,该数据库在两个站点之间同步复制。数据还被缓存到 Keycloak Infinispan 缓存中,作为本地缓存。当数据在一个 Keycloak 实例中发生更改时,该数据将在数据库中更新,并使用 `work` 缓存将失效消息发送到另一个站点。
在以下段落和图表中,对部署 Infinispan 的引用适用于外部 Infinispan。
虽然此设置旨在实现高可用性,但以下情况仍然会导致服务或数据丢失
Keycloak 站点故障可能会导致请求在故障和负载均衡器检测到故障之间的时间段内失败,因为请求可能仍然被路由到失败的站点。
一旦站点之间的通信出现故障,则需要手动步骤来重新同步退化的设置。
如果其他组件发生故障,退化的设置会导致服务或数据丢失。需要监控来检测退化的设置。
故障 | 恢复 | RPO1 | RTO2 |
---|---|---|---|
数据库节点 |
如果写入实例发生故障,数据库可以在相同站点或其他站点中提升一个读取实例以成为新的写入实例。 |
无数据丢失 |
几秒到几分钟(取决于数据库) |
Keycloak 节点 |
每个站点运行多个 Keycloak 实例。如果一个实例发生故障,一些传入请求可能会收到错误消息或延迟几秒。 |
无数据丢失 |
不到 30 秒 |
Infinispan 节点 |
每个站点运行多个 Infinispan 实例。如果一个实例发生故障,其他节点需要几秒钟才能注意到更改。实体至少存储在两个 Infinispan 节点中,因此单个节点故障不会导致数据丢失。 |
无数据丢失 |
不到 30 秒 |
Infinispan 集群故障 |
如果其中一个站点的 Infinispan 集群发生故障,Keycloak 将无法与该站点的外部 Infinispan 通信,并且 Keycloak 服务将不可用。负载均衡器将检测到这种情况,因为 `/lb-check` 返回错误,并将所有流量定向到另一个站点。 在 Infinispan 集群恢复并数据重新同步之前,设置处于降级状态。 |
无数据丢失3 |
几秒到几分钟(取决于负载均衡器设置) |
Infinispan 连接性 |
如果两个站点之间的连接性丢失,数据将无法发送到另一个站点。传入请求可能会收到错误消息或延迟几秒。Infinispan 将标记另一个站点脱机,并将停止发送数据。在连接恢复并两个站点之间的数据重新同步之前,需要将其中一个站点在负载均衡器中脱机。在蓝图中,我们展示了如何自动化此过程。 |
无数据丢失3 |
几秒到几分钟(取决于负载均衡器设置) |
数据库连接性 |
如果两个站点之间的连接性丢失,同步复制将失败。一些请求可能会收到错误消息或延迟几秒。根据数据库的不同,可能需要手动操作。 |
无数据丢失3 |
几秒到几分钟(取决于数据库) |
站点故障 |
如果所有 Keycloak 节点都不可用,负载均衡器将检测到故障并将流量重定向到另一个站点。在负载均衡器检测到故障之前,一些请求可能会收到错误消息。 |
无数据丢失3 |
不到两分钟 |
1 恢复点目标,假设所有设置部分在此事件发生时都处于正常状态。
2 恢复时间目标。
3 需要手动操作来恢复退化的设置。
“无数据丢失”这一说法取决于设置未因先前故障而降级,包括完成任何待处理的手动操作以重新同步站点之间的状态。
成功的故障转移需要一个未因先前故障而降级的设置。所有手动操作(如先前故障后的重新同步)都必须完成,以防止数据丢失。使用监控来确保及时检测和处理降级。
当同步 Infinispan 请求失败时,站点可能变得不同步。这种情况目前难以监控,并且需要对 Infinispan 进行完全手动重新同步才能恢复。监控两个站点中的缓存条目数量和 Keycloak 日志文件可以显示何时需要重新同步。
重新同步站点之间 Infinispan 状态的手动操作将发出完全状态传输,这将给系统带来压力。
此设置仅在两个站点上经过测试和支持。每个额外的站点都会增加整体延迟,因为需要将数据同步写入到每个站点。此外,网络故障(因此停机)的概率也会增加。因此,我们不支持超过两个站点,因为我们认为这会导致部署稳定性和性能下降。
同步复制的数据库可确保在站点故障后,在一个站点中写入的数据始终在另一个站点中可用,并且不会丢失任何数据。它还确保下一个请求不会返回过时数据,而与它是在哪个站点上提供服务无关。
同步复制的 Infinispan 可确保在站点故障后,一个站点中的缓存数据始终在另一个站点中可用,并且不会丢失任何数据。它还确保下一个请求不会返回过时数据,而与它是在哪个站点上提供服务无关。
同步复制会将对调用者的响应延迟到数据在另一个站点接收之后。对于同步数据库复制和同步 Infinispan 复制,需要低延迟,因为每个请求在数据更新时都可能在站点之间进行多次交互,这会放大延迟。
异步设置将优雅地处理站点之间的网络故障,而同步设置将延迟请求并向调用者抛出错误,而异步设置将延迟将写入延迟到另一个站点的 Infinispan 或数据库。但是,由于两个站点永远不会完全最新,因此此设置会导致故障期间数据丢失。这将包括
丢失更改会导致用户能够使用旧密码登录,因为使用异步数据库时,在故障发生时,数据库更改不会复制到另一个站点。
无效缓存会导致用户能够使用旧密码登录,因为使用异步 Infinispan 复制时,在故障发生时,无效缓存不会传播到另一个站点。
因此,在高可用性和一致性之间存在权衡。本主题的重点是优先考虑 Keycloak 的一致性而不是可用性。
继续阅读 构建块多站点部署 指南,以查找不同构建块的蓝图。