我已经在单机(Ubantu)中设置了一个 3 节点的 cassandra 集群,我执行以下操作 -
- 所有三个节点都启动并且应用程序能够创建密钥空间。
- 关闭三分之一的正在运行的节点,应用程序仍然能够创建密钥空间。
关闭现在 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)));
....
....
}