【问题标题】:Cassandra rpc_timeoutCassandra rpc_timeout
【发布时间】:2013-12-31 23:47:33
【问题描述】:

我使用的是 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 应用程序来删除所有更新日期早于给定时间戳的条目。我在 while 循环中使用了以下 select 语句:

select * from subscribers_all where token(subscriber) > token(?) limit 100;

我启动了程序。它运作良好。然后我意识到我给了一个错误的时间戳,所以我终止了这个程序。我没有附加任何关闭挂钩,因此集群没有正确关闭。 我使用正确的时间戳再次启动程序。 Cassandra 驱动程序抛出以下错误(我尝试了几次):

com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra 在一致性 ONE 读取查询期间超时(需要 1 个响应,但只有 0 个副本响应)

所以,我决定在 cqlsh 中测试 select。即使是以下简单的选择也不起作用:

select subscriber from subscribers_all limit 1;

它总是抛出这个错误:

请求未在 rpc_timeout 内完成。

当我在我的选择中添加 where 子句时,它可以正常工作。

select * from subscribers_all where subscriber = 'xyz';

我得到了预期的结果。 我尝试重新启动整个 cassandra 集群。它没有任何帮助。

在日志文件中,我只能看到一个异常,我认为对应于我杀死我的应用程序的时间:

ERROR [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

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

【问题讨论】:

  • 跟踪在有效的查询上显示什么select * from subscribers_all where subscriber = 'xyz';
  • 我已经更新了我的问题。

标签: cassandra


【解决方案1】:

检查您的 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

【讨论】:

  • 不幸的是,我们在这个问题之后停止使用 Cassandra,所以我无法验证这是否是原因。但是,我认为情况并非如此,因为如果这是 GC 的问题,我会期望我的所有查询都有相同的结果(超时)。相反,这只发生在我没有放置 WHERE 子句时。希望其他遇到此问题的人能进一步发表评论,因为我不再安装 Cassandra。
  • 我遇到了同样的问题,我发现这与在我的桌子上启用了 Solr 有关。原来我试图在非索引字段上使用WHERE 子句,但由于某种原因我没有得到通知。我在 Solr 日志中找到了相关的痕迹。创建遗漏索引后,问题就消失了。
  • 这里有有用的信息support.datastax.com/entries/… 当由于许多墓碑(删除)而发生错误时。建议是减少表的 gc_grace_seconds。
猜你喜欢
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2012-11-27
  • 2014-01-20
  • 1970-01-01
  • 2014-08-25
  • 2016-06-27
  • 1970-01-01
相关资源
最近更新 更多