0

[org.jgroups.protocols.pbcast.NAKACK] (requester=, local_addr=) message ::port not found in retransmission table of :port: (size=xxxx, missing=x,最高稳定性=xxxxx)]

4

1 回答 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_ALLFD)完成。

另一种可能性是您的线程池被阻塞并且故障检测心跳消息被丢弃,从而导致错误的怀疑。

此外,长时间的 GC 暂停也会导致这种情况。

修复:

  • 增加FD_ALL或中的超时FD。超时时间应该比最长的 GC 周期长。请注意,现在检测挂起的成员需要更长的时间。
  • 调整线程池的大小,例如确保最大线程数很大并且队列被禁用。

请注意,可能会发生错误的怀疑MERGE3应该稍后再纠正分裂的集群。

于 2016-03-10T06:24:33.397 回答