I built a distributed system where different nodes can either be leader or follower. In most of use cases, I'll have only one leader and several followers. The leader is generally single on its server while the followers are running on other servers (some of them in the same JVM).
Follower nodes will never have to send messages to each other, they will only communicate with leader nodes. Currently, I use the tcpgossip protocol to discover the members of a cluster. My GossipRouter runs in the same JVM than the leader node. It works pretty well actually, my cluster seems sufficiently stable.
As far as I understand the tcpgossip protocol, each node reaches out the GossipRouter and fetches information from it. So in my case, all follower nodes contact the server on which the leader node is running. However when I turn off one of the follower node, I can see warning messages from other follower nodes that state:
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
where ROCKET-21632
and zeus-10187
are two followers. I was expected that the followers would not talk to each other because a GossipRouter is used but it seems not to be the case.
Is there a way to build a cluster where some nodes will never talk to each other?