系统重启后如何处理复制缓存的重新填充?

3
我们有一个应用程序,它是集群化的,并且在其核心有一个缓存。该缓存基于计算出的数据,从底层数据库中构建(该数据库也会被复制)。它用于快速查找流式数据,以便实时进行路由决策。
由于缓存计算所依据的数据可能来自集群中的任何节点,我们考虑将缓存也进行复制,这样我们就不必以特定于数据库的方式监听来自系统中其他节点的复制更改。
我们已经确定ehcache(infinispan / hazelcast,其中nearcache是另一种选择)作为可能的缓存实现。到目前为止还不错。
我需要知道的是,在单个节点或整个应用程序重新启动时,如何重新填充此缓存。每个节点所需的所有数据都存在于底层数据库中。因此,每个节点是否只需从其数据库加载数据并在重新启动后填充缓存?然后缓存将如何使集群节点达到单一状态?
我了解到有磁盘持久缓存 - 这是使用ehcache的方法吗?我不想将其作为首选项,因为所有数据的单一点是数据库,那是决定哪些是正确数据的中央机构。
是否有一种方法可以在应用程序重新启动时使用所有数据重新加载缓存,并使所有缓存执行相同的操作并同步增量?我想这可能是一件难事,并且可能不可行,因为所有节点都不会将它们的密钥来回发送。但是我想确认一下,并想知道是否有其他处理此情况的策略。

一个可能避免完整应用程序重启的方式是只重启一小部分节点,以便节点有时间重新填充。但这将创建相当于并行数据库的效果。 - computinglife
1个回答

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的分发模式就足够了。


谢谢您的回复。我对该提案有以下四个关注点:1)它是否适用于快速查找(请参见我所做的有关缓存使用方式的编辑)? 2)它是否支持锁定访问/事务? 3)独立集群是否需要自定义服务器和许可证? 4)这种模型在广域网部署中的适用性如何? - computinglife
抱歉回复晚了。很遗憾我无法对您的更具体的问题作出适当的回答。希望开发人员中的某个人会尽快在此做出反应。 - tsykora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接