Cassandra rpc_timeout

时间:2013-12-13 09:02:06

标签: cassandra

我正在使用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)。

http://pastebin.com/7D6gYRms

以下是跟踪显示的“LIMIT 1”查询的一小部分:

http://pastebin.com/50ksph3k

我几乎可以肯定这是一个错误,但它有什么解决方案吗? 我拒绝删除列族并重新创建它:) 上线时这不是一个可行的解决方案。

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