【发布时间】:2020-04-16 05:34:24
【问题描述】:
这是场景
- 我启动了服务器节点。
- 我启动了 Client Ignite 节点,这将通过 Java 应用程序“X”来完成。
- 在 visor 中,当给定命令“node”时,我可以看到两个节点,一个是客户端,一个是服务器。
- 我通过执行“kill -9 pid”杀死了 Java 应用“X”。
- 现在,当我进入 visor 终端并输入“节点”时,它仍然在列表中显示“客户端”和“服务器”节点。当被问及客户端节点详细信息时,它显然会引发错误。
- 现在,当我重新启动 Java 应用程序“X”时,该 Java 代码将再次尝试连接到 Ignite 服务器。但它没有连接,而是多次打印这些日志
"org.apache.ignite.logger.java.JavaLogger" "info" "INFO" "" "284" "Accepted incoming communication connection [locAddr=/0:0:0:0:0:0:0:1:47101, rmtAddr=/0:0:0:0:0:0:0:1:62856]" "" "" "" "" "" "" "1587013526124" "" "" "" "" "" "" "ROOT" "{""service"":"""",""logger_name"":""org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi""}"
- 它没有连接并继续执行 Java 中的代码。所以应用程序没有恢复。我发现这是 Ignite 服务器日志
[10:37:57] 根据配置的处理程序抑制可能的故障 [hnd=StopNodeOrHaltFailureHandler [tryStop=false, timeout=0, super=AbstractFailureHandler [ignoredFailureTypes=UnmodifiableSet [SYSTEM_WORKER_BLOCKED, SYSTEM_CRITICAL_OPERATION_TIMEOUT]]], failureCtx=FailureContext [ type=SYSTEM_CRITICAL_OPERATION_TIMEOUT, err=class o.a.i.IgniteException: 检查点读取锁获取已超时。]] [10:37:57,739][SEVERE][exchange-worker-#46][GridCacheDatabaseSharedManager] 检查点读取锁获取已超时。 class org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager$CheckpointReadLockTimeoutException:检查点读取锁获取已超时。 在 org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.failCheckpointReadLock(GridCacheDatabaseSharedManager.java:1708) 在 org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.checkpointReadLock(GridCacheDatabaseSharedManager.java:1640) 在 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.initTopologies(GridDhtPartitionsExchangeFuture.java:1078) 在 org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.init(GridDhtPartitionsExchangeFuture.java:944) 在 org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body0(GridCachePartitionExchangeManager.java:3258) 在 org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body(GridCachePartitionExchangeManager.java:3104) 在 org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:119) 在 java.lang.Thread.run(Thread.java:748) [10:39:21,547][严重][tcp-disco-msg-worker-[693d29cd 0:0:0:0:0:0:0:1%lo0:47501 crd]-#2][G] 被阻止已检测到系统关键线程。这可能导致集群范围的未定义行为 [workerName=db-checkpoint-thread, threadName=db-checkpoint-thread-#59, blockedFor=209s]
我在这里假设由于我强制关闭启动 Ignite Client 节点的 Java 应用程序,因此可能会发生一些拓扑不平衡。
有人可以建议,如果我强制终止客户端应用程序,是否有正确的方法重新启动客户端应用程序,以便它继续重新建立与 Ignite 服务器的连接并继续工作?
【问题讨论】:
-
您的配置中是否指定了任何自定义超时?当超时时间很长时,这种情况是可能的。
-
嗨阿拉马尔。在服务器和客户端 Ignite 配置中,我们设置了两个超时...一个是 ClientFailureDetectionTimeout,另一个是 FailureDetectionTimeout。两者都设置为 1 分钟。我们的应用程序处于开发阶段。在开发时,我们设置断点并通过执行每一行来检查。这样做时,缓存被关闭,导致我们无法调试。所以我们将它设置为高 1 分钟。但是在将其移至生产时认为它会缩短到 30 秒。你能告诉我这里有什么问题吗?
-
我了解 Alamar。这是因为被杀死的节点没有在拓扑中更新。当我们删除超时时,它工作正常。谢谢你。欣赏它。
-
是的,你不应该期望在超时时间结束之前节点被删除,并加入一个新节点。