0

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

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

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

我的应用程序日志中充斥着这些消息,并导致 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();
}

因此,在使节点重新联机后(现在运行 3 个节点中的 2 个节点),RequestHandler 继续报告未准备好的查询,因此在进行此调用时重试之前进行准备 -

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

1 回答 1

1

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

于 2017-09-26T11:50:35.103 回答