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