Слушатель состояния Кассандры посылает дубликаты сигналов один с открытым 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 на любом из ваших хостов.