【发布时间】:2017-09-06 01:15:46
【问题描述】:
所以我已将我的 Apache Ignite.NET 实例配置为作为服务器运行:
var cfg = new IgniteConfiguration
{
CommunicationSpi = new TcpCommunicationSpi
{
LocalPort = config.CommunicationPort,
LocalPortRange = config.CommunicationPortRange,
MaxConnectTimeout = TimeSpan.FromMilliseconds(10000),
ConnectTimeout = TimeSpan.FromMilliseconds(1000)
},
AutoGenerateIgniteInstanceName = true,
ClientMode = false,
IsActiveOnStart = true,
DiscoverySpi = new TcpDiscoverySpi
{
LocalPort = config.DiscoveryPort,
LocalPortRange = config.DiscoveryPortRange,
ForceServerMode = true,
LocalAddress = localAddress,
IpFinder = new TcpDiscoveryStaticIpFinder
{
Endpoints = config.ClusterEndPoints
}
},
Localhost = config.LocalAddress,
};
我使用 ForceServerMode = true 并且在 DiscoverySpi.Endpoints 中我有我的本地 IP 以及我的集群的 IP 列表。
我看到的是,出于某种原因,通过 ignite 超时加入的调用。这是我得到的异常日志:
Level: [Error], Message:[Exception on direct send: connect timed out] Native:[java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi.openSocket(TcpDiscoverySpi.java:1376)
at org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi.openSocket(TcpDiscoverySpi.java:1339)
at org.apache.ignite.spi.discovery.tcp.ServerImpl.sendMessageDirectly(ServerImpl.java:1159)
at org.apache.ignite.spi.discovery.tcp.ServerImpl.sendJoinRequestMessage(ServerImpl.java:1006)
at org.apache.ignite.spi.discovery.tcp.ServerImpl.joinTopology(ServerImpl.java:851)
at org.apache.ignite.spi.discovery.tcp.ServerImpl.spiStart(ServerImpl.java:358)
at org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi.spiStart(TcpDiscoverySpi.java:1834)
at org.apache.ignite.internal.managers.GridManagerAdapter.startSpi(GridManagerAdapter.java:297)
at org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.start(GridDiscoveryManager.java:837)
at org.apache.ignite.internal.IgniteKernal.startManager(IgniteKernal.java:1770)
at org.apache.ignite.internal.IgniteKernal.start(IgniteKernal.java:977)
at org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance.start0(IgnitionEx.java:1896)
at org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance.start(IgnitionEx.java:1648)
at org.apache.ignite.internal.IgnitionEx.start0(IgnitionEx.java:1076)
at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:574)
at org.apache.ignite.internal.processors.platform.PlatformAbstractBootstrap.start(PlatformAbstractBootstrap.java:48)
at org.apache.ignite.internal.processors.platform.PlatformIgnition.start(PlatformIgnition.java:76)
]
没关系,可能是网络问题、分区、防火墙等。我可以解决这个问题。
我不明白为什么启动 inite 节点的调用会挂起。我希望它尝试连接到这些端点,如果不能,它应该只启动本地节点。这是我启动节点的方式
Ignition.Start(cfg);
相反,我看到的是它一直在尝试加入那些写入的超时日志,并且它永远不会停止并且应用程序无限期挂起。
我缺少一些配置,使 Ignite 放弃尝试连接并启动本地模式,或者完全失败。
[编辑] 仅当我已经在集群中运行了其他具有 ignite 的应用程序并且这个新节点尝试通过静态 ips 加入现有集群时才会发生这种情况(并且它的 VM 的网络配置错误,这会阻止它与现有集群通信)。如果我尝试启动这个新节点并且没有 ignite 实例已经在运行,它不会挂起,它会继续并启动本地 ignite 节点。
【问题讨论】:
-
所以我更深入地研究了日志,我确实看到 Ignite 报告本地节点已初始化: 这是日志:
Local node initialized: TcpDiscoveryNode [id=1a55b46a-c270-4450-b902-eb5fd28906bc, addrs=[10.211.55.3], sockAddrs=[/10.211.55.3:49100], discPort=49100, order=0, intOrder=0, lastExchangeTime=1504661932964, loc=true, ver=2.1.0#20170720-sha1:bdaeecca, isClient=false但是我的 .NET 应用程序中对Ignitiion.Start(cfg)的调用从未出现返回 -
最后我也看到了这个日志:
[Warn], Message:[Node has not been connected to topology and will repeat join process. Check remote nodes logs for possible error messages. Note that large topology may require significant time to start. Increase 'TcpDiscoverySpi.networkTimeout' configuration property if getting this message on the starting nodes [networkTimeout=5000]] Native:[]所以我想问题是,如何让加入过程不阻止我的应用程序? -
我不确定问题出在您的特定配置上还是与 Ignite.NET 本身有关。您可以使用默认配置启动节点吗?运行示例?
-
@PavelTupitsyn 因此,当 VM 网络配置允许我的 ignite 实例的主机 VM 之间进行通信时,我能够很好地运行 ignite。但是,如果存在某种网络问题,则尝试启动的节点会挂起,而不是在不加入集群的情况下启动本地节点。我遇到的问题是,每当我的应用程序有可能挂起时,我都不是一个快乐的露营者。如果没有网络问题,则新节点加入集群并按预期工作。