我们有一个集群的应用程序,其核心是一个缓存。缓存基于计算数据,从底层数据库(也被复制)构建。它用于快速查找流数据,以便即时做出路由决策。
由于可以从群集中的任何节点更改计算缓存的数据,因此我们正在考虑复制缓存,以便我们不必监听来自其他节点的复制更改在系统中,以数据库特定的方式。
我们已经确定ehcache(infinispan / hazelcast with nearcache是其他竞争者)作为可能的缓存实现。到现在为止还挺好。
我需要知道的是,当各个节点或整个应用程序重新启动时,如何重新填充此缓存。节点所需的所有数据都存在于底层数据库中。那么每个节点是否可以简单地从其数据库加载数据并在重新启动后填充缓存?然后缓存如何将群集节点置于单个状态?
我知道有磁盘持久化缓存 - 这是与ehcache一起使用的方法吗?我不想将其用作第一选项,因为所有数据的单点都是数据库,而且是决定哪个是正确数据的中心权威。
应用程序是否可以在重新启动时使用所有数据重新加载缓存并让所有缓存执行相同操作并同步增量?我认为这是一件很难的事情,并且可能不可行,因为所有节点都不会来回发送所有密钥。但是想确定并想知道是否有其他策略来处理这种情况。
答案 0 :(得分:3)
我将尝试从Infinispan的角度介绍这里可能的解决方案。
在您的使用案例中,我建议使用Infinispan独立节点集群(客户端 - 服务器访问,例如通过HotRod)和已配置的底层缓存存储。
https://docs.jboss.org/author/display/ISPN/Infinispan+Server& https://docs.jboss.org/author/display/ISPN/Using+Hot+Rod+Server
现在更具体地说到你的问题:
我需要知道的是,当各个节点或整个应用程序重新启动时,如何重新填充此缓存。
这就是为什么我建议你使用让我们说具有远程客户端 - 服务器访问权限的“独立”集群。您的缓存层不直接依赖于您的应用程序。当应用程序重新启动,崩溃,重新部署时...您仍然在Infinispan集群中缓存数据,并在应用程序再次存在后立即连接到它。
节点所需的所有数据都存在于基础数据库中。那么每个节点是否可以简单地从其数据库加载数据并在重新启动后填充缓存?
在Infinispan中,是的。节点能够从缓存存储中加载数据。请参阅此部分:https://docs.jboss.org/author/display/ISPN/Cache+Loaders+and+Stores,尤其是 preload 配置元素,用于在缓存启动后将数据从存储区预加载到缓存中。
然后缓存如何将群集节点置于单个状态?
Infinispan中有状态转移。在新节点加入期间,此新实现(https://community.jboss.org/wiki/Non-BlockingStateTransferV2)甚至不会阻止您的群集。在加入/离开更改后,状态转移只需关注群集中的数据分布。
应用程序是否可以在重新启动时使用所有数据重新加载缓存并让所有缓存执行相同操作并同步增量?
是的,根据上面提到的所有。您可以简单地使用复制,以便将条目复制到所有节点,并且状态是一致的。但是,这种情况对于重读方案更好。在你的情况下,我想,分配模式和相应的numberOfOwner应该足够了。