我构建了一个分布式系统,其中不同的节点可以是领导者或追随者。在大多数用例中,我只有一个领导者和几个粉丝。领导者通常在其服务器上是单一的,而关注者在其他服务器上运行(其中一些服务器位于同一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:connect timed out,headers: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 timed out
其中ROCKET-21632
和zeus-10187
是两个关注者。我被期望跟随者不会互相交谈,因为使用了GossipRouter,但似乎并非如此。
有没有办法构建一个集群,其中某些节点永远不会相互通信?
答案 0 :(得分:0)
您仅将TCPGOSSIP用作发现机制。因此,如果您在一个单独的节点上运行GossipRouter,启动所有节点然后杀死GossipRouter,事情仍然有效(除了合并)。只有发现(以及加入新成员)才行不通。
即使您使用TCPGOSSIP,成员也会直接相互交谈。如果您不想这样,请将TTRNEL替换为TCP作为传输。所有成员都会将他们的所有消息发送给GossipRouter,后者将其转发给其他成员。但缺点是领导者节点获得了大量流量;相反,成员彼此交谈直接将流量模式均匀地分布在群集中。
如果你想使用TUNNEL:TCPGOSSIP,我建议使用多个GossipRouters进行容错。