首页 > 解决方案 > 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 命令。感谢是否有人可以帮助我解决这个问题。

标签: javaignite

解决方案


最有可能的是,您的集群只有一个基准节点,这意味着所有数据都仅存储在该节点上。当它离开集群时,所有的缓存操作都开始抛出这个异常,因为没有亲和节点了。

为避免这种情况,您应该仅在所有服务器节点都启动时才激活集群。如果拓扑发生变化,您应该恢复故障节点,或者重置为基线拓扑以触发分区重新分配和重新平衡。

以下是如何从代码设置基线拓扑:

Collection<ClusterNode> nodes = ignite.cluster().forServers().nodes();
ignite.cluster().setBaselineTopology(nodes);

关于基线拓扑特性的文档:https ://apacheignite.readme.io/docs/baseline-topology


推荐阅读