leader/follower 关系的最佳 JGroups 堆栈配置

Best JGroups stack configuration for leader/follower relationship

我构建了一个分布式系统,其中不同的节点可以是领导者或追随者。在大多数用例中,我只有一个领导者和几个追随者。领导者通常在其服务器上是单一的,而追随者 运行 在其他服务器上(其中一些在同一 JVM 中)。

跟随者节点永远不必相互发送消息,它们只会与领导者节点通信。目前,我使用 tcpgossip 协议来发现集群的成员。我的 GossipRouter 运行在与领导节点相同的 JVM 中。它实际上工作得很好,我的集群看起来足够稳定。

据我了解 tcpgossip 协议,每个节点都伸出 GossipRouter 并从中获取信息。因此,在我的例子中,所有跟随者节点都联系领导者节点所在的服务器 运行。但是,当我关闭其中一个跟随者节点时,我可以看到来自其他跟随者节点的警告消息:

WARNING: thread=TransferQueueBundler,myCluster,ROCKET-21632 Fri Nov 18 10:22:11 CET 2016 org.jgroups.protocols.BaseBundler sendSingleMessage JGRP000029: ROCKET-21632: failed sending message to zeus-10187 (102 bytes): java.net.SocketTimeoutException: connect timed out, headers: VERIFY_SUSPECT: [VERIFY_SUSPECT: ARE_YOU_DEAD], TP: [cluster_name=myCluster]

WARNING: thread=TransferQueueBundler,myCluster,ROCKET-21632 Fri Nov 18 10:21:19 CET 2016 org.jgroups.protocols.TP sendToMembers JGRP000034: ROCKET-21632: failure sending message to zeus-10187: java.net.SocketTimeoutException: connect timed out

其中 ROCKET-21632zeus-10187 是两个关注者。我预计追随者不会互相交谈,因为使用了 GossipRouter,但事实似乎并非如此。

有没有办法构建一个集群,其中一些节点永远不会相互通信?

您仅将 TCPGOSSIP 用作发现机制。所以如果你在一个单独的节点上 运行 GossipRouter,启动所有节点然后杀死 GossipRouter,事情仍然有效(除了合并)。只有发现(并因此加入新成员)是行不通的。

即使您使用 TCPGOSSIP,成员之间也会直接交谈。如果您不想这样,请将 TCP 替换为 t运行sport 和 TUNNEL。所有成员都会将他们所有的消息定向到 GossipRouter,然后再转发给其他成员。缺点是领导节点会获得大量流量;相比之下,成员直接相互交谈将流量模式均匀地分布在集群中。

如果你想使用TUNNEL:TCPGOSSIP,我建议使用多个GossipRouter来解决故障运行ce。