[org.jgroups.protocols.pbcast.NAKACK] (requester=, local_addr=) message ::port not found in retransmission table of :port: (size=xxxx, missing=x,最高稳定性=xxxxx)]
问问题
2029 次
1 回答
0
NAKACK
(或其较新的表亲NAKACK2
)向集群提供可靠的消息传输。为此,每条消息都会获得一个序列号 (seqno),并且接收者按 seqno 顺序将消息传递给应用程序。
每个集群成员都有一个包含所有其他成员及其消息的表(概念上是一个列表)。当成员 P 发送消息 P21、P22 和 P23 时,接收者 R 首先在消息列表中查找 R,然后将 P21-P23 添加到列表中。
但是,在您的情况下,未找到 R 的列表。这意味着 R 不再是集群成员。
例如,如果我们有集群 {P,Q,R,T},并且成员 R 因为被怀疑而离开或被排除在外(例如我们有一段时间没有收到心跳),那么消息 P21-23 将被任何接收器丢弃。
这是因为 JGroups 只允许集群成员发送和接收消息。
会员如何被排除在外?
这很可能由故障检测协议中的一个(例如FD_ALL
或FD
)完成。
另一种可能性是您的线程池被阻塞并且故障检测心跳消息被丢弃,从而导致错误的怀疑。
此外,长时间的 GC 暂停也会导致这种情况。
修复:
- 增加
FD_ALL
或中的超时FD
。超时时间应该比最长的 GC 周期长。请注意,现在检测挂起的成员需要更长的时间。 - 调整线程池的大小,例如确保最大线程数很大并且队列被禁用。
请注意,可能会发生错误的怀疑,但MERGE3
应该稍后再纠正分裂的集群。
于 2016-03-10T06:24:33.397 回答