我正在使用Cassandra 1.2.11。我创建了以下列族:
CREATE TABLE subscribers_all (
subscriber text,
status int,
package text,
SW_ON timestamp,
S_NUMBER text,
USER_NAME text,
updated_date timestamp,
PRIMARY KEY (subscriber)
);
我创建了一个Java应用程序,用于删除update_date早于给定时间戳的所有条目。我在while循环中使用了以下select语句:
select * from subscribers_all where token(subscriber) > token(?) limit 100;
我开始了这个计划。它运作良好。然后我意识到我给了一个错误的时间戳,所以我杀了这个程序。我没有附加任何关闭挂钩,因此群集未正确关闭。 我用正确的时间戳再次启动程序。 Cassandra Driver抛出了以下错误(我尝试过几次):
com.datastax.driver.core.exceptions.ReadTimeoutException:在一致性ONE的读取查询期间出现Cassandra超时(需要1个响应但只响应0个副本)
所以,我决定在cqlsh中测试select。即使是以下简单的选择也不起作用:
select subscriber from subscribers_all limit 1;
它总是抛出这个错误:
请求未在rpc_timeout内完成。
当我在select中添加where子句时,它可以正常工作。
select * from subscribers_all where subscriber = 'xyz';
我得到了预期的结果。 我尝试重新启动整个cassandra集群。没有任何帮助。
在日志文件中,我只能看到一个异常,我认为这与我杀死我的应用程序的时间相对应:
错误[Native-Transport-Requests:973721] 2013-12-12 15:08:29,699 ErrorMessage.java(第210行)请求期间发生意外异常 java.io.IOException:通过对等方重置连接
我的cqlsh没有其他例外选择或尝试重新启动我的应用程序。 'nodetool tpstats'表示我没有丢弃,也没有阻止或挂起的消息。
有人建议它可能是'由于节点之间的时间同步'。我验证了并且服务器已同步。
我启用了跟踪,我再次执行了有效的选择和没有的选择。 这是跟踪显示的ok选项(希望我可以粘贴url)。
以下是跟踪显示的“LIMIT 1”查询的一小部分:
我几乎可以肯定这是一个错误,但它有什么解决方案吗? 我拒绝删除列族并重新创建它:) 上线时这不是一个可行的解决方案。
答案 0 :(得分:3)
检查GC检查员,当您查询Cassandra时,如果垃圾收集过程持续很长时间,Cassandra将不允许您执行任何其他操作,直到垃圾收集过程结束,因此您可能会遇到此异常。
com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read
query at consistency ONE (1 responses were required but only 0 replica responded).
如果这是问题,您必须调整垃圾收集过程。完成this
要可视化GC操作以及分代扫描和内存图,请打开随JDK提供的JVisualVM工具并使用它安装VisualGC插件。检查this。