Infinispan复制缓存的多个客户端可以共享同一持久文件存储吗?

时间:2019-03-15 07:29:51

标签: docker infinispan jgroups distributed-cache infinispan-9

交叉发布于https://developer.jboss.org/thread/279735

假设我们有多个docker容器(每个容器都有java webapp,因此本质上是多个JVM),每个容器都在以下位置使用相同的复制Infinispan缓存:

  • 使用jgroups进行发现的嵌入式模式
  • 使用Docker Hub作为Infinispan服务器的服务器模式,客户端通过hotrod连接。

在任何一种情况下,所有缓存成员/客户端都有一个文件存储,它们在启动时从中预加载(示例用于服务器模式,类似于嵌入式模式的xml):

通过泊坞窗组成,每个容器的文件存储(例如/var/tmp/server/OUR_CACHE.dat)中的路径被绑定安装到泊坞窗主机上的同一文件。

<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

1 个答案:

答案 0 :(得分:1)

复制模式不是每个节点都有自己的独立数据副本吗?我不完全了解您要达到的目标。

问题的最后一点:

  

如果不建议共享同一文件存储.dat文件,那么该怎么办?   的最佳做法是在每个文件路径中都包含一个GUID   .xml文件中的容器路径。每个Docker容器的主机名   (即containerId)是唯一的,但在其之前不会被知道   部署,因此填充infinispan_server.xml并不容易   静态具有“路径”值的文件。

您可以在配置xml中放置一个占位符(例如:${myprop})并在启动时指定一个占位符(例如:-Dmyprop=hostname01)吗?