我正在运行一个由多个 Ignite 节点组成的集群。每个节点作为 Docker 容器在单独的服务器上运行。 在
IgniteConfiguration
中,我将localhost设置为非环回地址(这是docker设置的容器IP地址)+每个节点都放置在NAT后面,所以我还定义了AddressResolver
(只是为了在NAT<-->docker_container之间进行映射)。
每个节点都以类似的消息开头,例如
>>> VM name: 62@ignite01
>>> Ignite instance name: ignite-node-1
>>> Local node [ID=FEDF34FE-2AD7-4A92-BDF2-BEERF36AC79, order=28, clientMode=false]
>>> Local node addresses: [ignite01/192.168.1.18]
这里
ignite01
是etc/hosts中的别名,192.168.1.XX
是docker容器地址。
例如,当节点发现彼此时,我可以看到
NODE_JOINED
消息
[evt=NODE_JOINED, node=TcpDiscoveryNode [id=b283asde-7c68-6789-96cb-152bdaf0aadb, addrs=ArrayList [192.168.1.16], sockAddrs=HashSet [ignite02/10.10.1.5:47500, /192.168.1.16:47500],
这意味着节点将使用两个地址与远程节点通信:NAT(10.10.1.5)和内部容器地址(192.168.1.16,永远无法访问)。 因此,当节点无法通信时,我会出现启动延迟和长时间超时(因为两个地址都已尝试)
有什么方法可以在发现过程中删除无法访问的地址(通过某种方式配置
IgniteConfiguration
),以便节点仅使用 NAT 地址相互通信?
此时,我只找到了一种在发现过程开始时操作发现消息中的sockAddrs
列表(在TcpDiscoveryNode
类中)(通过java中的Reflection API)的方法。一切都很好,但我不确定这是否是安全的方法。
我多次尝试重新配置
IgniteConfiguration
,但我无法从发现消息中删除本地容器地址,同时使整个集群再次工作。