Apache Ignite 节点经常失败

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

我有两个 Apache Ignite 服务器,三个客户端已连接到它们,每个客户端都为其各自的缓存使用单独的数据区域配置。这三个客户端工作正常,但现在,当我连接第四个客户端时,节点偶尔会停止。

WARN 1 --- [vent-worker-#44] o.a.i.i.m.d.GridDiscoveryManager         : Node FAILED:
TcpDiscoveryNode [id=6ff310ca-dd51-4115-9fdf-fbf3d093b5b3, consistentId=6ff310ca-dd51-4115-9fdf-fbf3d093b5b3,
addrs=ArrayList [0:0:0:0:0:0:0:1%lo, x.y.z.a, 127.0.0.1], sockAddrs=null, discPort=0, order=967, 
intOrder=487, lastExchangeTime=1731680665767, loc=false, ver=2.15.0#20230425-sha1:f98f7f35, isClient=true]

每当我收到此错误时,我的整个 Spring boot 应用程序就会从头开始重新启动。为什么会发生这种情况以及如何避免这种情况。以下是我的配置


@Configuration
public class IgniteConfig {

    @Bean
    public Ignite igniteInstance() {
        IgniteConfiguration cfg = new IgniteConfiguration();

        cfg.setMetricsLogFrequency(0);


        // Set client mode
        cfg.setClientMode(true);

        // Configure discovery SPI
        TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
        TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
        ipFinder.setAddresses(Arrays.asList(
                "x.y.z.a:47500..47509"
    ));
        discoverySpi.setIpFinder(ipFinder);
        discoverySpi.setNetworkTimeout(10000); // Network timeout (5 seconds)
        discoverySpi.setJoinTimeout(10000);   // Join timeout (10 seconds)
        cfg.setDiscoverySpi(discoverySpi);

        // Set failure detection timeouts
        cfg.setFailureDetectionTimeout(120000); // 120 seconds
        cfg.setClientFailureDetectionTimeout(120000); // 120 seconds

        // Configure TCP communication SPI
        TcpCommunicationSpi spi = new TcpCommunicationSpi();
        spi.setConnectTimeout(30000); // Initial connection timeout (3 seconds)
        spi.setMaxConnectTimeout(10000); // Max connection timeout (6 seconds)
        spi.setReconnectCount(3); // Number of reconnection attempts
        spi.setIdleConnectionTimeout(3000); // Idle connection timeout (100 ms)
        cfg.setCommunicationSpi(spi);

        // Configure event logging to capture node failures and disconnections
        cfg.setIncludeEventTypes(
                EventType.EVT_NODE_FAILED,
                EventType.EVT_NODE_LEFT,
                EventType.EVT_NODE_JOINED,
                EventType.EVT_NODE_SEGMENTED
        );

        // Configure event storage for diagnostics
        MemoryEventStorageSpi eventStorageSpi = new MemoryEventStorageSpi();
        eventStorageSpi.setExpireCount(1000); // Store up to 1000 events in memory
        cfg.setEventStorageSpi(eventStorageSpi);

        // Set metrics log frequency to zero to reduce logging noise
        cfg.setMetricsLogFrequency(0);

        // Start the Ignite instance
        return Ignition.start(cfg);
    }
}
java spring-boot caching ignite apacheignite
1个回答
0
投票

首先,为什么要使用 3 个独立的数据区域。这样做可能很好,但它会预先划分您的内存空间,这本身并不是任何问题,除非您的应用程序之一需要使用的不仅仅是其所占的份额!如果所有三个都位于同一数据区域,那么您仅受总内存的限制,因为所有消费者都从唯一的 1 个饼中提取!就节点故障而言,您需要查看日志文件以尝试查看那里是否有故障迹象。我见过长时间的 GC 暂停最终导致节点崩溃。我不能说这是你的问题,但如果你的日志显示崩溃前长时间的 GC 暂停,那么你就是节点故障原因的一个例子。希望有帮助。

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