我有一个5节点的cassandra集群,每个节点中的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程序通过公共域名与cassandra交谈 (E.G)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地址。所以计数是
更新:NOV 2
虽然我没有这方面的答案。我的解决方法是在我的java程序中使用私有ip与Cassandra交谈..我将继续使用这个,因为我等待一些来自Cassandra社区的答案。
答案 0 :(得分:2)
datastax java驱动程序通过使用'STATUS_CHANGE'事件订阅的指定连接从一个C *节点接收来自C *的这些通知。最终UP&amp;通过C *节点从八卦接收的信息检测到DOWN事件,C *发送该主机的rpc_address或broadcast_rpc_address的事件(优先使用broadcast_rpc_address)。
我假设您正在将cassandra.yaml中的rpc_address配置为这些192.168.1.x地址吗?
C *中可能存在一个错误(C *和驱动程序的版本是什么?)。另一种可能性是对等体信息可能以某种方式被破坏,因此驱动程序可能将x.y.z.2和192.168.1.2视为单独的主机(我不期望这样)。您最初使用公共ips作为rpc_address,然后稍后更改为私有吗?通过在每个节点上的cqlsh中执行以下命令,可以检查每个C *节点上的system.peers表的状态:
select peer,rpc_address from system.peers;
查看x.y.z.2是否在您的任何主机上显示为rpc_address。