Лучшая конфигурация стека JGroups для отношений лидер / последователь
Я построил распределенную систему, в которой разные узлы могут быть либо лидерами, либо последователями. В большинстве случаев у меня будет только один лидер и несколько подписчиков. Лидер обычно один на своем сервере, в то время как подписчики работают на других серверах (некоторые из них в той же JVM).
Узлам-последователям никогда не придется отправлять сообщения друг другу, они будут общаться только с узлами-лидерами. В настоящее время я использую протокол tcpgossip для обнаружения членов кластера. Мой GossipRouter работает в той же JVM, что и узел-лидер. На самом деле это работает довольно хорошо, мой кластер кажется достаточно стабильным.
Насколько я понимаю протокол tcpgossip, каждый узел обращается к GossipRouter и извлекает из него информацию. Так что в моем случае все узлы-последователи связываются с сервером, на котором работает узел-лидер. Однако, когда я отключаю один из подчиненных узлов, я вижу предупреждающие сообщения от других подчиненных узлов, которые заявляют:
ПРЕДУПРЕЖДЕНИЕ: thread=TransferQueueBundler,myCluster,ROCKET-21632 Пт 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 Пт 18 ноября 10:21:19 CET 2016 org.jgroups.protocols.TP sendToMembers JGRP000034: ROCKET-21632: сбой при отправке сообщения zeus-10187: java.net.SocketTimeoutException: подключиться время вышло
где ROCKET-21632
а также zeus-10187
два последователя. Я ожидал, что подписчики не будут разговаривать друг с другом, потому что используется GossipRouter, но, похоже, это не так.
Есть ли способ построить кластер, где некоторые узлы никогда не будут общаться друг с другом?
1 ответ
Вы используете TCPGOSSIP только в качестве механизма обнаружения. Поэтому, если вы запустите GossipRouter на отдельном узле, запустите все узлы, а затем убьете GossipRouter, все будет работать (за исключением объединения). Только открытие (и, следовательно, присоединение новых членов) не будет работать.
Даже если вы используете TCPGOSSIP, участники общаются друг с другом напрямую. Если вы не хотите этого, замените TCP в качестве транспорта на TUNNEL. Все участники перенаправляют все свои сообщения на GossipRouter, который пересылает их другим участникам. Недостатком является то, что узел-лидер получает много трафика; напротив, участники, разговаривающие друг с другом, напрямую распределяют режим трафика по кластеру.
Если вы хотите использовать TUNNEL:TCPGOSSIP, я рекомендую использовать несколько GossipRouters для отказоустойчивости.