Apache Ignite REPLICATED SYNC IgniteCache 在创建时未填充

问题描述 投票:0回答:2

我有一个 Apache Ignite Server 节点集群并定义了一些

IgniteCache
。集群中的第一个节点已使用一些值填充缓存。当新节点加入时,它会获取该缓存的一个实例,但是当我尝试迭代现有值时,
iterator
没有下一个元素。如果我尝试通过
.get(String key)
访问特定条目,则会获取该条目。

这让我认为,即使复制模式是

REPLICATED
并且重新平衡模式是
SYNC
,值也不会立即提供给新节点。
SYNC
模式javadoc表示,在从其他网格节点加载所有必要的数据之前,缓存不会启动,但情况似乎并非如此。我已经尝试了一切,从监听
CACHE_STARTED
事件到尝试强制加载,但没有任何效果。

我只是想在IgniteCache实例创建并填充网格数据之后运行一些逻辑。

    

java ignite
2个回答
0
投票

1) 您正在进行重新平衡。在重新平衡过程中,您将不会在 LOCAL 节点上看到某些条目(例如通过 localPeek)。但它们应该可以通过正常的 get/sql 获得(因为亲和函数将始终显示键值的实际位置。重新平衡后可以更改)

您能分享一下您的迭代器代码吗?

2)新节点可能会超出基线(在持久化的情况下)。在这种情况下,应该将这样的节点添加到基线中:

https://ignite.apache.org/docs/latest/clustering/baseline-topology

请更新您的初始问题并添加缓存配置和代码示例。还提供输出:

control.sh --baseline



0
投票
EventType.EVT_CACHE_REBALANCE_STOPPED

添加一个侦听器并执行内部的任何逻辑,因为在缓存填充了各自的数据(在本例中是所有条目,因为我们有

REPLICATED
模式)后会触发此事件。
ignite.events().enableLocal(EventType.EVT_CACHE_REBALANCE_STOPPED);
ignite.events().localListen(event -> {
  if(event instanceof CacheRebalancingEvent && ((CacheRebalancingEvent) event).cacheName().equals("myCacheName")) {
    for (Cache.Entry<String, Object> entry : myCache) {
      logic(null, entry.getValue());
    }
    ignite.events().disableLocal(EventType.EVT_CACHE_REBALANCE_STOPPED);
    return false;
  }
  return true;
}, EventType.EVT_CACHE_REBALANCE_STOPPED);
// ...
IgniteCache myCache = ignite.getOrCreateCache(cacheConfiguration("myCacheName"));

© www.soinside.com 2019 - 2024. All rights reserved.