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

时间:2015-10-30 03:18:56

标签: java cassandra-2.0 datastax datastax-java-driver cassandra-cli

我有一个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地址。所以计数是 enter image description here

更新:NOV 2
  虽然我没有这方面的答案。我的解决方法是在我的java程序中使用私有ip与Cassandra交谈..我将继续使用这个,因为我等待一些来自Cassandra社区的答案。

1 个答案:

答案 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。