我们正在 Kubernetes 上运行 Keycloak 21.1.2,使用 DNS_PING 和无头服务来发现集群中的节点。在构建 Keycloak 映像时,我们将缓存配置文件位置设置为“cache-ispn.xml”,该位置相对于 /opt/keycloak/conf 目录,这是 Keycloak 的默认文件位置,但我们将所有者数量覆盖为1.
在部署过程中,根据集群中的节点数量,我们更新cache-config.xml文件中的所有者并将其挂载在同一位置。集群中的所有节点均已发现,并且一切似乎都工作正常。我不确定这是否允许以及如何确认复制是否按照指标和日志的配置工作?
我尝试为 infinispan 集群启用指标和日志,如此处定义的配置分布式缓存 - Keycloak,但没有一个指标表明复制是否像我在部署期间配置的那样工作。日志铺天盖地,我不知道要寻找什么。我还尝试将日志级别设置为 KC_LOG_LEVEL:info,org.keycloak.connections.infinispan:TRACE,org.keycloak.connections:TRACE。
以下是我经过一些测试后的观察结果。
TLDR:构建期间会考虑cache-ispn.xml 中的值,如果部署期间没有显式重建,则忽略部署期间的任何更新值。
最初我通过将 Keycloak 调试日志级别设置为启用 infinispan 日志
INFO,org.keycloak:DEBUG,org.keycloak.connections:TRACE,org.keycloak.connections.infinispan:TRACE
通过跟踪日志中的会话 ID 和跟踪 rpc 命令来了解复制是如何工作的。但这些日志令人难以承受,无法理解关于谁拥有对象以及对象被复制到哪里的具体情况。
我放弃了这种方法并启用了统计信息,如https://www.keycloak.org/server/caching所述。我在全局和每个缓存上启用了统计信息以获得完整的指标。相应的指标端点位于 /auth/metrics 端点。关于我的用例的感兴趣的指标具有以下命名约定
vendor_cache_manager_keycloak_cache_<cache-name>_cluster_cache_stats_required_minimum_number_of_nodes
例如我的 Keycloak 集群中有 2 个节点的部署配置
...
<distributed-cache name="sessions" owners="1" statistics="true">
<expiration lifespan="-1"/>
</distributed-cache>
...
...
<distributed-cache name="sessions" owners="2" statistics="true">
<expiration lifespan="-1"/>
</distributed-cache>
...
我有以下会话缓存指标
# HELP vendor_cache_manager_keycloak_cache_sessions_cluster_cache_stats_required_minimum_number_of_nodes Minimum number of nodes to avoid losing data
# TYPE vendor_cache_manager_keycloak_cache_sessions_cluster_cache_stats_required_minimum_number_of_nodes gauge
vendor_cache_manager_keycloak_cache_sessions_cluster_cache_stats_required_minimum_number_of_nodes{cache="sessions",node="keycloak-0-14766",} 2.0
此处的值表示应可用而不导致数据丢失的最小节点数。这里这意味着我的设置无法承受任何节点的故障,因为每个对象只有一个所有者的构建配置是有效的,而不是部署期间更新的cache-ispn.xml,它有两个副本,可以承受一个节点的故障而不会丢失任何数据。
我尝试使用不同的构建和部署配置来得出这个结论。如果能够更深入地了解复制和 Keycloak 文档以了解复制问题,那就太好了。