如何配置嵌入式 Infinispan 以处理 K8s 滚动更新?

How do I configure Embedded Infinispan to handle K8s rolling updates?

我有一个简单的项目,允许您将密钥添加到应用程序中的分布式缓存中,该应用程序 运行ning Infinispan 版本 13 处于嵌入式模式。全部发表here.

我 运行 可以在 minikube 中 运行 的 kubernetes 设置。我观察到,当我 运行 我的例子有六个 pods 并执行滚动更新时,我的 infinispan 性能从推出开始下降,直到最后一个 pod 重新启动并创建其缓存后四分钟.这段时间之后,集群再次正常运行。降级是指获取缓存中项目计数的操作需要 2-3 秒才能执行,而正常模式下则需要 0.5 秒以下。在我的设置中,这种情况一直在发生,四分钟后又一直在工作。

当运行在没有 kubernetes 环境的情况下在我的本地机器上运行项目时,我没有遇到过同样的延迟。

我试过使用 TRACE 日志,但在这四分钟后看不到任何重要事件。

我的 Infinispan 配置(您可以在我的参考项目中看到)中是否明显遗漏了一些东西,或者需要执行一些额外的操作? (目前我是开机缓存,关机停止)

一位同事在 运行 Infinispan 处于非嵌入模式时发现了以下日志:

2022-01-09 14:56:45,378 DEBUG (jgroups-230,infinispan-server-2) [org.jgroups.protocols.UNICAST3] infinispan-server-2: removing expired connection for infinispan-server-0 (240058 ms old) from recv_table

在这些日志之后,服务性能再次恢复正常。这使我们怀疑 JGroups 以某种方式尝试使用已删除的 pods 的旧连接。通过将 Jgroups UNICAST3 上的 conn_close_timeout 设置更改为 10 秒而不是默认值 4 分钟,我们可以确认服务降级在 10 秒而不是 4 分钟内得到修复。

此外,此修复似乎仅在服务 运行 作为 StatefulSet 而不是作为 Deployment 运行时才有效。我没有解释为什么会这样,但总而言之,将服务设为有状态集并更改 JGroups 配置中 UNICAST3 上的 conn_close_timeout 解决了我们的问题。