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

我们有一个集群的应用程序,其核心是缓存.缓存基于从基础数据库(也被复制)构建的计算数据.它用于对流数据进行快速查找,以便即时做出路由决策.

由于可以在集群中的任何节点上更改用于计算缓存的数据,因此我们正在考虑使缓存也被复制,这样我们就不必侦听来自系统中其他节点的复制更改. ,以特定于数据库的方式.

我们已经确定ehcache(infinispan / hazelcast,nearcache是​​其他竞争者)是可能的缓存实现.到现在为止还挺好.

我需要知道的是,当单个节点或整个应用程序重新启动时,如何重新填充此缓存.节点所需的所有数据都存在于基础数据库中.那么,每个节点能否在重启后简单地从其数据库加载数据并填充缓存?然后,缓存如何将群集节点置于单一状态?

我知道有磁盘持久性缓存-ehcache是​​这样吗?我不想将其用作第一个选项,因为所有数据的单点是数据库,而这是决定哪个数据正确的中心权限.

应用程序是否可以通过一种方法在重新启动时用所有数据重新加载缓存,并使所有缓存执行相同操作并同步增量?我认为这是一件很难的事,可能并不可行,因为所有节点都不会来回发送所有密钥.但是想要确定并且想知道是否还有其他策略可以处理这种情况.

解决方法:

我将尝试从Infinispan的角度提出可能的解决方案.

在您的用例中,我建议使用带有已配置基础缓存存储的Infinispan独立节点集群(客户端-服务器访问,例如通过HotRod).

https://docs.jboss.org/author/display/ISPN/Infinispan+Server及以上
https://docs.jboss.org/author/display/ISPN/Using+Hot+Rod+Server

现在更具体地讲您的问题:

What I need to know is how this cache will be repopulated when the individual nodes or the entire application restarts.

这就是为什么我建议您使用具有远程客户端-服务器访问权限的“独立”群集的原因.您的缓存层不直接取决于您的应用程序.当应用程序重新启动,崩溃,重新部署…时,您仍然在Infinispan群集中缓存了数据,只要您的应用程序再次存在,就可以连接到它.

All the data that a node requires is present in the underlying database. So can each node simply load the data from its database and populate the cache after restarts?

在Infinispan中,是的.节点能够从缓存存储中加载数据.请参阅以下部分:https://docs.jboss.org/author/display/ISPN/Cache+Loaders+and+Stores,尤其是预加载配置元素,该元素用于在缓存启动后将数据从存储库预加载到缓存.

How will the cache then bring the cluster nodes to a single state?

Infinispan中有状态转移.这个新的实现(https://community.jboss.org/wiki/Non-BlockingStateTransferV2)甚至在新节点加入期间也不会再阻塞您的集群.在加入/离开更改之后,状态转移只需要关心您在整个群集中的数据分布.

Is there a way an app can reload the cache with all the data at restart and have all the caches do the same and sync up the deltas?

是的,根据上述所有内容.您可以简单地使用复制,以便将条目复制到所有节点,并且状态是一致的.但是,这种情况对于阅读量大的场景更好.我想在您的情况下,分别具有numberOfOwner的分发模式就足够了.

上一篇:Ehcache(03)——Ehcache中储存缓存的方式


下一篇:Ehcache(04)——设置缓存的大小