交叉发布在https://developer.jboss.org/thread/279735
假设我们有多个 docker 容器(每个都有 java webapps,所以本质上是多个 JVM),每个容器都使用相同的复制 Infinispan 缓存:
- 使用 jgroups 进行发现的嵌入式模式
- 服务器模式使用 Docker Hub 作为 Infinispan 服务器,客户端通过 hotrod 连接。
在任何一种情况下,所有缓存成员/客户端都有一个文件存储,它们在启动时从中预加载(示例适用于服务器模式,类似于嵌入式模式的 xml):
通过 docker compose,每个容器的文件存储中的路径(比如说 /var/tmp/server/OUR_CACHE.dat)绑定安装到 docker 主机上的同一个文件。
<paths>
<path name="cachestore.root" path="/var/tmp"/>
</paths>
...
<local-cache name="OUR_CACHE">
<expiration lifespan="-1"/>
<locking isolation="SERIALIZABLE" acquire-timeout="30000" concurrency-level="1000" striping="false"/>
<file-store relative-to="cachestore.root" path="server" max-entries="-1" purge="false" passivation="false" preload="true" fetch-state="true"/>
<memory>
<binary size="100000000" eviction="MEMORY"/>
</memory>
</local-cache>
我的问题是 - 是否设计了持久性机制,以便多个复制的缓存客户端可以读取/写入同一个文件存储/从同一个文件存储中读取/写入而不会出现任何错误?
我的理解是,在复制模式下,键值最终将在所有节点的内存中变得一致。但我的目标是确保多个客户端容器使用相同的文件存储进行持久性和预加载不会对这种复制产生不利影响。
如果不建议共享相同的文件存储 .dat 文件,那么在 .xml 文件中的每个容器路径的文件路径中具有 GUID 的最佳做法是什么。每个 docker 容器的主机名(即 containerId)都是唯一的,但在部署之前不会知道它,因此使用“path”的值静态填充 infinispan_server.xml 文件并不容易。
谢谢,
_Prateek