Apache Ignite Client 重启场景
Apache Ignite Client restart scenario
场景是这样
- 我启动了服务器节点。
- 我启动了 Client Ignite 节点,它将通过 Java 应用程序说 "X".
- 在给定命令 "node".
中,我可以看到两个节点,一个是客户端,一个是服务器
- 我通过 "kill -9 pid".
杀死了 Java 应用 "X"
- 现在,当我转到 visor 终端并输入 "node" 时,它仍然在列表中显示 "client" 和 "server" 节点。当被问及客户端节点详细信息时,它显然会抛出错误。
- 现在,当我重新启动 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][SEVERE][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 服务器的连接并继续工作?
当超时时间很长时,可能会出现这种情况。
您不应该期望在所有超时都用完之前节点被删除,一个新节点加入,例如网络超时、套接字写入超时、故障检测超时。那,除非你正常关机。
场景是这样
- 我启动了服务器节点。
- 我启动了 Client Ignite 节点,它将通过 Java 应用程序说 "X".
- 在给定命令 "node". 中,我可以看到两个节点,一个是客户端,一个是服务器
- 我通过 "kill -9 pid". 杀死了 Java 应用 "X"
- 现在,当我转到 visor 终端并输入 "node" 时,它仍然在列表中显示 "client" 和 "server" 节点。当被问及客户端节点详细信息时,它显然会抛出错误。
- 现在,当我重新启动 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][SEVERE][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 服务器的连接并继续工作?
当超时时间很长时,可能会出现这种情况。
您不应该期望在所有超时都用完之前节点被删除,一个新节点加入,例如网络超时、套接字写入超时、故障检测超时。那,除非你正常关机。