Apache Ignite:节点尚未连接到拓扑

时间:2018-08-23 13:14:58

标签: java ignite

在同一台计算机上具有两个节点的本地(测试)设置中(使用端口范围为 47500..47501 的静态IP配置),“第二个”节点将不会加入群集;它发出似乎由“第一个”节点回答的TcpDiscoverySpi,但是在发生网络超时(20秒)之后,它显示“节点尚未连接到拓扑”消息,并继续发送发现加入消息,随后被第一个节点忽略(“由于节点已经在拓扑中,因此忽略了加入请求消息”)。

这同样适用于(虚拟机都是VM的)docker计算机上的(“真实”)集群设置。

这是一个已知问题吗?关于寻找/寻找什么的任何建议? Ignite发出大量日志(grid: discovery: network-timeout: 20000 join-timeout: 20000 static: enabled: true addresses: 127.0.0.1:47500..47501 ),但是我看不到任何可能解释此行为的错误或警告。静态IP配置和自定义网络超时生效。

配置以yml形式提供,以构建配置Bean(Spring Boot应用程序),该配置Bean进而构建实际的Ignite配置。

TcpDiscoveryVmIpFinder

TcpDiscoverySpi有效(如日志中所示)。

另请参阅node logscontext.Channels .First(ch => ch.Channel_ID == id) .ChannelValues .Where(cv => start < cv.ValueTime && cv.ValueTime <= stop); )中的相关部分。

1 个答案:

答案 0 :(得分:0)

据我所知,您使用Ignite messaging,并且您的某些remoteListener包含IgniteSemaphore作为其字段或封闭的一部分。连接时,有关此侦听器的信息将发送到发现消息中的所有节点。

反序列化remoteListener时,会从DataStructuresProcessor请求信号量。但它尚未初始化,因为节点联接尚未完成。这是一个僵局,因为在初始化DataStructuresProcessor之前,节点无法加入,反之亦然。

可以通过延迟初始化信号灯来避免此问题:

public static class ListenerHandler implements IgniteBiPredicate<UUID, Object> {
    @IgniteInstanceResource
    private Ignite ignite;

    private transient IgniteSemaphore sem;

    private IgniteSemaphore semaphore() {
        if (sem != null)
            return sem;

        sem = ignite.semaphore("sem", 1, true, true);
        return sem;
    }

    @Override public boolean apply(UUID uuid, Object o) {
        // ...
    }
}

有关错误跟踪器的相关问题:IGNITE-3089