【问题标题】:Can multiple clients of Infinispan replicated cache share the same persistent file store?Infinispan 复制缓存的多个客户端可以共享同一个持久文件存储吗?
【发布时间】:2019-08-06 05:43:13
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    到你问题的最后一点:

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

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

    【讨论】:

    • 我希望开始工作的是多个容器(每个容器都是一个缓存客户端),从磁盘上的文件存储中预加载相同的数据。目前,每个容器获取文件存储的路径是固定的,因此它们都将正确地预加载相同的数据。但是我无法确定在正常操作期间是否所有容器都可以将数据保存到其独立文件存储中,其文件路径映射到所有容器的同一 docker 主机的文件路径。现在,如果我以某种方式使这条路径独一无二,比如让文件路径包含 /$HOSTNAME/.. 那么在初始部署时
    • (续)我将使用占位符作为主机名(它是 docker 中的 containerId)来存储我的文件:/path/on/dockerhost/containerId1/filestore/cache.dat 和 /path/ on/dockerhost/containerId2/filestore/cache.dat 但是在重新部署 swarm 堆栈后,唯一的名称可能是 containerId3 和 4,需要通过 compose 映射以从 container1 或 2 上方拾取 cache.dat。所以,我的客户可能在内存中复制了数据的独立副本,但我需要文件存储是通用的,因此所有容器的预加载最初会在启动时找到相同的数据。谢谢
    • 对不起...docker...swarm stack...我不知道这些。我仍然不明白你想要做什么。您是否希望容器预加载一组数据,但拥有自己的存储并允许它们独立运行?
    • 在这种情况下(从逻辑上讲)可以将每个容器视为单独的客户端计算机,并且我希望所有容器在启动时都预加载相同的数据 - 所以它们都使用的文件存储的文件路径是一样的(比如说,一个 NFS 挂载的存储)。因此,虽然他们似乎都可以预加载数据,但我不确定他们是否正在同一共享文件存储路径上写入该 .dat 文件,没有复杂性。本质上,文件存储文件可以单独由多个 infinispan hotrod 客户端同时使用(读/写)。
    • 如果一个客户端写入其中一个缓存怎么办?更改应该随处可见,还是应该对那个客户隔离?
    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2017-03-31
    相关资源
    最近更新 更多