在同一台计算机上具有两个节点的本地(测试)设置中(使用端口范围为 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 logs(context.Channels
.First(ch => ch.Channel_ID == id)
.ChannelValues
.Where(cv => start < cv.ValueTime && cv.ValueTime <= stop);
)中的相关部分。
答案 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