Лучшая конфигурация стека 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: connect время вышло

где ROCKET-21632 и zeus-10187 — два подписчика. Я ожидал, что подписчики не будут разговаривать друг с другом, потому что используется GossipRouter, но, похоже, это не так.

Есть ли способ построить кластер, в котором некоторые узлы никогда не будут общаться друг с другом?


person Azeq    schedule 18.11.2016    source источник


Ответы (1)


Вы используете TCPGOSSIP только как механизм обнаружения. Таким образом, если вы запустите GossipRouter на отдельном узле, запустите все узлы, а затем уничтожите GossipRouter, все будет работать (кроме слияния). Только открытие (и, следовательно, присоединение новых членов) не сработает.

Даже если вы используете TCPGOSSIP, участники общаются друг с другом напрямую. Если вы этого не хотите, замените TCP в качестве транспорта на TUNNEL. Все участники будут направлять все свои сообщения GossipRouter, который пересылает их другим участникам. Недостатком является то, что ведущий узел получает много трафика; напротив, участники, разговаривающие друг с другом напрямую, равномерно распределяют режим трафика по всему кластеру.

Если вы хотите использовать TUNNEL:TCPGOSSIP, я рекомендую использовать несколько GossipRouter для обеспечения отказоустойчивости.

person Bela Ban    schedule 19.11.2016
comment
Спасибо за быстрый ответ. Я попробую и дам вам знать, как это происходит. Спасибо! - person Azeq; 19.11.2016