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