Слушатель состояния Кассандры посылает дубликаты сигналов один с открытым IP и другой с частным IP

У меня есть кластер cassandra из 5 узлов, и адрес listen_address в каждом узле настроен со своим частным адресом в cassandra.yml.

Конфиг выглядит так:
ПРИМЕЧАНИЕ: 192.168.1.* Является частным IP-адресом

cassandra 1| listen_address:192.168.1.1  | publicip :kafka1/x.y.z.1  
cassandra 2| listen_address:192.168.1.2  | publicip :kafka2/x.y.z.2  
cassandra 3| listen_address:192.168.1.3  | publicip :kafka3/x.y.z.3  
cassandra 4| listen_address:192.168.1.4  | publicip :kafka4/x.y.z.4  
cassandra 5| listen_address:192.168.1.5  | publicip :kafka5/x.y.z.5

У меня также есть Java-программа, которая действует как слушатель состояния Cassandra, прослушивающий вызовы onAdd, onUp, onDown, onRemove.

ПРИМЕЧАНИЕ: программа Java общается с Кассандрой через публичное доменное имя
(EG) cassandra_hosts:kafka1,kafka2,kafka3,kafka4

    {
    private Set<Host> downHostList = Collections.synchronizedSet(new HashSet<Host>());
    //onup/onAdd Implemetation
    public void onAdd(Host host) {      
            if(downHostList.contains(host)){
                downHostList.remove(host);
            }
            LOG.info("Down host count {} and the list is[{}]",downHostList.size(),downHostList);        
        }
        //onDown/OnRemove Implentation
        public void onDown(Host host) {
            if(!host.isUp()){
                downHostList.add(host);
            }
            LOG.info("Down host count {} and the list is[{}]",downHostList.size(),downHostList);
        }  
}

Ниже приведено наблюдение из вывода:
Когда я отключаю узел 2, я вижу, что onDown вызывается дважды. Один раз я получил публичный IP-адрес, а в следующий раз я получил частный IP-адрес. Так что счетчик был

Обновление: 2 ноября
Хотя у меня нет ответа на этот вопрос. Мой обходной путь для этого заключается в использовании частного ip в моей java-программе для общения с Кассандрой. Я буду продолжать использовать это, так как я жду, пока кто-то из сообщества Кассандры ответит на это..

1 ответ

Java-драйвер datastax получает эти уведомления от C* по назначенному соединению с одним из ваших узлов C*, используя подписку на событие STATUS_CHANGE. В конечном итоге события UP & DOWN обнаруживаются с помощью информации, которую узел C* получает от сплетен, а C* отправляет событие для rpc_address или broadcast_rpc_address этого хоста (с приоритетом broadcast_rpc_address).

Я предполагаю, что вы настраиваете rpc_address в cassandra.yaml для этих адресов 192.168.1.x, верно?

Возможно, в C* есть ошибка (в каких версиях вы используете C* и драйвер?). Другая возможность заключается в том, что информация об одноранговых узлах может быть каким-то образом повреждена, поэтому драйвер может рассматривать xyz2 и 192.168.1.2 как отдельные узлы (я этого не ожидаю). Изначально вы использовали общедоступный ips в качестве адреса rpc_address, а затем изменили на приватный? Единственное, что было бы хорошо проверить, - это состояние таблицы system.peers на каждом узле C*, выполнив следующую команду в cqlsh на каждом узле:

select peer,rpc_address from system.peers;

чтобы увидеть, отображается ли xyz2 как rpc_address на любом из ваших хостов.

Другие вопросы по тегам