我建立了一个分布式系统,不同的节点可以是领导者也可以是追随者。在大多数用例中,我将只有一个领导和几个追随者。leader通常在其服务器上是单一的,而follower在其他服务器上运行(其中一些在同一个JVM中)。
Follower节点永远不需要相互发送消息,它们只会与leader节点通信。目前,我使用tcpgossip协议来发现集群的成员。我的gossip proouter运行在与领导节点相同的JVM中。它实际上工作得很好,我的集群似乎足够稳定。
就我对tcpgossip协议的理解而言,每个节点都会伸出gossip proouter并从中获取信息。因此,在我的例子中,所有跟随节点都与运行领导节点的服务器联系。但是,当我关闭其中一个关注节点时,我可以看到来自其他关注节点的警告消息,其状态为:
警告:线程=TransferQueueBundler,myCluster,ROCKET-21632星期五11月18日10:22:11 CET 2016 org.jgroups.protocols.BaseBundler sendSingleMessageJGRP000029:火箭-21632:failed sending message to zeus-10187 (102 bytes): java.net.SocketTimeoutException: connect timed out, headers: verify_嫌疑犯:[verify_嫌疑犯:ARE_YOU_DEAD], TP: [cluster_name=myCluster]
警告:线程=TransferQueueBundler,myCluster,ROCKET-21632星期五11月18日10:21:19 CET 2016 org.jgroups.protocols.TP sendtommembersJGRP000034: ROCKET-21632: failed sending message to zeus-10187: java.net.SocketTimeoutException: connect timed out
,其中ROCKET-21632
和zeus-10187
是两个从者。我原以为粉丝们不会互相交谈,因为使用了八卦工具,但事实似乎并非如此。
是否有一种方法可以构建一个集群,其中一些节点永远不会相互通信?
只能将TCPGOSSIP用作发现机制。因此,如果您在一个单独的节点上运行八卦,启动所有节点,然后杀死八卦,事情仍然会工作(除了合并)。只有发现(并因此加入新成员)是行不通的。
即使使用TCPGOSSIP,成员之间也可以直接通信。如果您不希望这样做,可以将TCP替换为TUNNEL传输。所有成员都将把他们的所有信息直接发送给一个"八卦制造者",这个"八卦制造者"再将这些信息转发给其他成员。但缺点是领导节点会获得大量流量;相比之下,相互通信的成员直接在集群中均匀地传播流量模式。
如果您想要使用TUNNEL:TCPGOSSIP,我建议使用多个gossip来实现容错。