Cassandra键空间创建与cassandra驱动程序2.2.0-rc3无限循环

时间:2017-09-25 17:01:32

标签: cassandra datastax datastax-java-driver cassandra-2.2 cassandra-driver

我在单机(Ubantu)中设置了3个节点的cassandra集群,并且我执行以下操作 -

  1. 所有三个节点和应用程序都能够创建密钥空间。
  2. 关闭3个正在运行的节点中的一个,应用程序仍然可以 创建密钥空间。
  3. 关闭另外一个节点,现在2个正在运行 节点并立即启动它,现在应用程序无法启动它 创建密钥空间,它继续报告(如无限循环) -

    2017-09-25 14:42:40 INFO RequestHandler:561 - 查询CREATE KEYSPACE IF NOT NOT EXISTS MYKEYSPACE WITH replication = {'class':'NetworkTopologyStrategy','datacenter1':'2'}; 未在/127.0.0.1:9042上准备,在重试执行前做好准备。看到这个 消息几次是好的,但看到很多可能是性能的来源 问题

  4. 我的应用程序日志充斥着这些消息,导致java heap out错误。

    注意 - 我的复制因子为2,cassandra使用的版本为2.2.6,cassandra驱动程序为2.2.0-rc3。当我恢复到cassandra驱动程序2.1.3时一切正常,所以只是想知道驱动程序级别是否存在一些问题

    进一步补充一点,我甚至在cassandra驱动程序级别调试了代码,发现这是因为下面给出的com.datastax.driver.core.Connection类的方法 -

      private void flush(FlushItem item) {
        EventLoop loop = item.channel.eventLoop();
        Flusher flusher = flusherLookup.get(loop);
        if (flusher == null) {
            Flusher alt = flusherLookup.putIfAbsent(loop, flusher = new Flusher(loop));
            if (alt != null)
                flusher = alt;
        }
    
        flusher.queued.add(item);
        flusher.start();
    }
    

    因此,在恢复节点在线(2个节点现在从3个节点运行)之后,RequestHandler继续报告未准备好的查询,因此在进行此调用之前重试之前做准备 -

    public ResponseHandler write(ResponseCallback callback, boolean startTimeout)
    {
     ....
     ....
     ....
    flush(new FlushItem(channel, request, writeHandler(request, handler)));
     ....
     ....
    }
    

1 个答案:

答案 0 :(得分:1)

将cassandra驱动程序版本升级到3.3.0后,没有遇到问题。我相信2.2.0-rc3中有一些错误,这是发布候选版本。