java - Ignite Remote Cluster [无法映射缓存键(所有分区节点离开网格)]
问题描述
我在远程 Ignite 集群上创建缓存 K、V 对时遇到一些问题。我的 Ignite 节点建立在 Java8 中的 Maven 项目上,通过多播配置进行集群,具有分区缓存。这里面临的问题是,只有在集群中恰好有 1 个节点时,ignite 才能通过 SqlFieldQuery 或 NoSQL 成功创建和检索缓存。当我将它扩展到超过 1(在本例中为 2)时,我面临远程服务器抛出的这个错误。
Caused by: org.apache.ignite.internal.cluster.ClusterTopologyServerNotFoundException: Failed to map keys for cache (all partition nodes left the grid) [topVer=AffinityTopologyVersion [topVer=5, minorTopVer=3], cache=Transactions]
at org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedSingleGetFuture.serverNotFoundError(GridPartitionedSingleGetFuture.java:711) ~[ignite-core-2.6.0.jar:2.6.0]
at org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedSingleGetFuture.mapKeyToNode(GridPartitionedSingleGetFuture.java:332) ~[ignite-core-2.6.0.jar:2.6.0]
at org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedSingleGetFuture.map(GridPartitionedSingleGetFuture.java:216) ~[ignite-core-2.6.0.jar:2.6.0]
at org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedSingleGetFuture.init(GridPartitionedSingleGetFuture.java:208) ~[ignite-core-2.6.0.jar:2.6.0]
at org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache.getAsync(GridDhtColocatedCache.java:246) ~[ignite-core-2.6.0.jar:2.6.0]
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.get0(GridCacheAdapter.java:4556) ~[ignite-core-2.6.0.jar:2.6.0]
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:4537) ~[ignite-core-2.6.0.jar:2.6.0]
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:1350) ~[ignite-core-2.6.0.jar:2.6.0]
at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.get(IgniteCacheProxyImpl.java:907) ~[ignite-core-2.6.0.jar:2.6.0]
这是我的服务器设置:
public class App
{
protected static IgniteConfiguration config;
protected static String igniteID = UUID.randomUUID().toString();
public static void main( String[] args )
{
System.out.println( "Starting instance of Ignite..." );
config = new IgniteConfiguration();
config.setIgniteInstanceName("ignite-node-"+igniteID);
config.setClientMode(false);
setupDiscoveryConfig();
setupDataConfig();
//cacheConfig();
config.setPeerClassLoadingEnabled(false);
config.setDeploymentMode(DeploymentMode.CONTINUOUS);
config.setPeerClassLoadingMissedResourcesCacheSize(0);
config.setFailureDetectionTimeout(10000);
config.setClientFailureDetectionTimeout(10000);
config.setNetworkTimeout(10000);
Ignite ignite = Ignition.start(config);
loadAndRemove(ignite);
}
private static void loadAndRemove(Ignite ignite) {
ignite.cluster().active();
IgniteCache<String, TransactionRecord> cache = ignite.getOrCreateCache("Transactions");
}
private static void cacheConfig(){
CacheConfiguration cacheConfig = new CacheConfiguration("Transactions");
cacheConfig.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
cacheConfig.setCacheMode(CacheMode.PARTITIONED);
config.setCacheConfiguration(cacheConfig);
}
private static void setupDataConfig(){
DataStorageConfiguration storageConfiguration = new DataStorageConfiguration();
storageConfiguration.getDefaultDataRegionConfiguration()
.setPersistenceEnabled(true);
config.setDataStorageConfiguration(storageConfiguration);
}
private static void setupDiscoveryConfig(){
TcpDiscoverySpi spi = new TcpDiscoverySpi();
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
((TcpDiscoveryMulticastIpFinder) ipFinder).setMulticastGroup("228.10.10.157");
ipFinder.setAddresses(Arrays.asList("127.0.0.1"));
spi.setIpFinder(ipFinder);
config.setDiscoverySpi(spi);
}
}
客户端配置如下图:
@Bean
public Ignite igniteInstance(){
IgniteConfiguration config = new IgniteConfiguration();
config.setIgniteInstanceName("cluster-client");
config.setClientMode(true);
config.setPeerClassLoadingEnabled(false);
config.setDeploymentMode(DeploymentMode.CONTINUOUS);
config.setPeerClassLoadingMissedResourcesCacheSize(0);
config.setFailureDetectionTimeout(10000);
config.setClientFailureDetectionTimeout(10000);
config.setNetworkTimeout(10000);
TcpDiscoverySpi spi = new TcpDiscoverySpi();
TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
ipFinder.setMulticastGroup("228.10.10.157");
ipFinder.setAddresses(Arrays.asList("127.0.0.1"));
spi.setIpFinder(ipFinder);
config.setDiscoverySpi(spi);
return Ignition.getOrStart(config);
}
数据插入使用简单的 cache.put 命令。感谢是否有人可以帮助我解决这个问题。
解决方案
最有可能的是,您的集群只有一个基准节点,这意味着所有数据都仅存储在该节点上。当它离开集群时,所有的缓存操作都开始抛出这个异常,因为没有亲和节点了。
为避免这种情况,您应该仅在所有服务器节点都启动时才激活集群。如果拓扑发生变化,您应该恢复故障节点,或者重置为基线拓扑以触发分区重新分配和重新平衡。
以下是如何从代码设置基线拓扑:
Collection<ClusterNode> nodes = ignite.cluster().forServers().nodes();
ignite.cluster().setBaselineTopology(nodes);
关于基线拓扑特性的文档:https ://apacheignite.readme.io/docs/baseline-topology
推荐阅读
- reactjs - 将 Laravel Echo 与 React/Redux 应用程序集成
- projection - 光线追踪器相机 - 正交到透视投影
- python - pandas df.apply 意外更改数据框
- firebase - 将集合设置为子集合
- mysql - PHPMyadmin 导出数据库非常慢
- mysql - Spring Data JPA 中的内连接查询和基于接口的投影
- python-2.7 - 使用非 ascii 字符将重音字符替换为非重音字符的解决方法
- java - 向图形添加功能
- java - 共享相同模型的重复 TableView
- php - 使用php在csv文件中连续添加2列