我们使用Apache Ignite进行缓存,并且当其中一个客户端发生故障时,正在群集的所有客户端上看到某些意外行为。 Ignite群集本身具有三台服务器,大约有12台服务器作为客户端连接到该群集。群集已禁用持久性,并且许多缓存已启用快缓存。
我们看到的是,当其中一个客户端发生故障(内存不足,CPU高,网络连接等)时,所有其他客户端上的线程都会阻塞一段时间。在这段时间里,Ignite服务器本身看起来还不错,但是我在日志中看到以下内容:
Topology snapshot [ver=123, servers=3, clients=11, CPUs=XXX, offheap=XX.XGB, heap=XXX.GB]
Topology snapshot [ver=124, servers=3, clients=10, CPUs=XXX, offheap=XX.XGB, heap=XXX.GB]
当客户端连接/断开连接时,拓扑本身显然正在发生变化,但是群集内部是否发生任何可能导致其他客户端阻塞的事件?我希望在服务器断开连接但客户端断开连接时重新平衡数据。
从线程转储中,我看到许多线程处于以下状态:
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000078a86ff18> (a java.util.concurrent.CountDownLatch$Sync)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:277)
at org.apache.ignite.internal.util.IgniteUtils.await(IgniteUtils.java:7452)
at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.awaitAllReplies(GridReduceQueryExecutor.java:1056)
at org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor.query(GridReduceQueryExecutor.java:733)
at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$8.iterator(IgniteH2Indexing.java:1339)
at org.apache.ignite.internal.processors.cache.QueryCursorImpl.iterator(QueryCursorImpl.java:95)
at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing$9.iterator(IgniteH2Indexing.java:1403)
at org.apache.ignite.internal.processors.cache.QueryCursorImpl.iterator(QueryCursorImpl.java:95)
at java.lang.Iterable.forEach(Iterable.java:74)
...
任何想法,建议或进一步的调查途径将不胜感激。