Java cassandra状态侦听器发送重复信号,一个使用公共ip,另一个使用私有ip

Java cassandra状态侦听器发送重复信号,一个使用公共ip,另一个使用私有ip,java,cassandra-2.0,datastax,datastax-java-driver,cassandra-cli,Java,Cassandra 2.0,Datastax,Datastax Java Driver,Cassandra Cli,我有一个5节点的cassandra集群,每个节点中的listen_地址都配置为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

我有一个5节点的cassandra集群,每个节点中的listen_地址都配置为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调用

注意:通过公共域名与cassandra进行Java程序对话
(例如)卡桑德拉•阿杜主持人:卡夫卡1、卡夫卡2、卡夫卡3、卡夫卡4

    {
    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);
        }  
}
{
private Set downHostList=Collections.synchronizedSet(新HashSet());
//onup/onAdd实施
公用无效onAdd(主机){
if(downHostList.contains(主机)){
downHostList.remove(主机);
}
LOG.info(“向下主机计数{},列表为[{}]”,downHostList.size(),downHostList);
}
//onDown/OnRemove安装
公共void onDown(主机){
如果(!host.isUp()){
downHostList.add(主机);
}
LOG.info(“向下主机计数{},列表为[{}]”,downHostList.size(),downHostList);
}  
}
以下是输出的观察结果:
当我放下节点2时,我看到onDown被调用了两次。一次我得到了公共ip地址,下一次我得到了私有ip地址。所以计数是

更新:11月2日
我的解决办法是在java程序中使用私有ip与Cassandra对话。。在等待Cassandra社区的回答时,我将继续使用此选项。

datastax java驱动程序通过使用事件订阅的C*节点的指定连接从C*接收这些通知。最终,通过C*节点从八卦中接收到的信息检测上行和下行事件,C*发送该主机的rpc_地址或广播_rpc_地址的事件(广播_rpc_地址优先)

我假设您正在将cassandra.yaml中的rpc_地址配置为这些192.168.1.x地址,对吗

可能是C*中有一个bug(您使用的是什么版本的C*和驱动程序?)。另一种可能性是,对等点信息可能以某种方式被破坏,因此驱动程序可能会将x.y.z.2和192.168.1.2视为单独的主机(我不这么认为)。您最初是否使用公共IP作为rpc_地址,后来又改为专用IP?检查system.peers表在每个C*节点上的状态很好,方法是在每个节点上的cqlsh中执行以下命令:

select peer,rpc_address from system.peers;

查看x.y.z.2是否在任何主机上显示为rpc_地址。

您正在为此程序使用DataStax Java驱动程序?是的。感谢您的回复。。下面是详细信息..Java Datastax驱动程序版本:cassandra-driver-core-2.1.4.jar。。Cassandra版本:2.1.5..rpc_地址位于所有Cassandra节点中的私有ip。作为解决方法,我刚刚更新了java应用程序,以使用私有ip地址与Cassandra进行通信。这个虫子似乎有用。。