0

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

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

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

警告:thread=TransferQueueBundler、myCluster、ROCKET-21632 Fri Nov 18 10:22:11 CET 2016 org.jgroups.protocols.BaseBundler sendSingleMessage JGRP000029:ROCKET-21632:向 zeus-10187(102 字节)发送消息失败:java.net .SocketTimeoutException:连接超时,标头:VERIFY_SUSPECT:[VERIFY_SUSPECT:ARE_YOU_DEAD],TP:[cluster_name=myCluster]

警告:thread=TransferQueueBundler,myCluster,ROCKET-21632 Fri Nov 18 10:21:19 CET 2016 org.jgroups.protocols.TP sendToMembers JGRP000034:ROCKET-21632:向 zeus-10187 发送消息失败:java.net.SocketTimeoutException:connect时间到

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

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

4

1 回答 1

0

您只使用 TCPGOSSIP 作为发现机制。因此,如果您在一个单独的节点上运行 GossipRouter,启动所有节点,然后终止 GossipRouter,一切仍然有效(但合并除外)。只有发现(并因此加入新成员)是行不通的。

即使您使用 TCPGOSSIP,成员之间也可以直接交谈。如果您不想这样,请将 TCP 作为传输替换为 TUNNEL。所有成员都会将他们的所有消息定向到 GossipRouter,后者将它们转发给其他成员。缺点是领导节点获得了大量流量。相反,成员相互交谈直接将流量模式均匀地分布在集群中。

如果你想使用 TUNNEL:TCPGOSSIP,我建议使用多个 GossipRouter 来容错。

于 2016-11-19T08:46:14.837 回答