假设我正在使用名为“国家”的缓存的分布式缓存模式。我有三个节点。我在缓存中放了一些数据。我想知道这个缓存的每个节点上存在的数据。请让我知道是否有工具或我们如何以编程方式知道它
1 回答
您可能会问几件事:
- 如果您想知道出于可用性目的数据具有冗余副本,您可以在 JMX 中轻松找到它。“ServiceMBean”mbean 有一个“StatusHA”属性,其描述为:
此服务的高可用性 (HA) 状态。MACHINE-SAFE 的值意味着在任何给定计算机上运行的所有集群成员都可以停止而不会丢失数据。NODE-SAFE 的值意味着可以停止任何集群成员而不会丢失数据。ENDANGERED 的值表示任何运行该服务的集群成员异常终止都可能导致数据丢失。
如果你想知道一个key属于哪个分区,可以获取缓存的服务(CacheService service = cache.getCacheService())并从中获取KeyPartitioningStrategy(KeyPartitioningStrategy strategy = ((PartitionedService) service).getKeyPartitioningStrategy()),然后询问key去哪里的策略(int partition = strategy.getKeyPartition(key))。
如果您使用键亲和性来控制缓存数据位置,它显然比这更复杂一些;-) .. 有关更多信息,请参阅 JavaDoc 中的 KeyPartitioningStrategy.getKeyPartition。
要确定分区属于哪个集群成员,您只需调用 PartitionedService.getKeyOwner(Object oKey)
与以上所有内容等效的服务器端是 BackingMapManagerContext.getKeyPartition(),还有一个方便的方法 BackingMapManagerContext.isKeyOwned()。
现在 Coherence 中真正酷的事情是您通常不必担心数据在哪里,因为所有操作都保证是一次且仅一次的操作,并且只有在操作完成后结果才可见达到了他们的 HA 要求。
为了全面披露,我在 Oracle 工作。这篇文章中表达的观点和观点是我自己的,并不一定反映我雇主的观点或观点。