【发布时间】: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)。
以下是跟踪显示的带有“LIMIT 1”的查询的一小部分:
我几乎可以肯定这是一个错误,但有什么解决办法吗? 我拒绝删除列族并重新创建它:) 上线时,这不是一个可行的解决方案。
【问题讨论】:
-
跟踪在有效的查询上显示什么
select * from subscribers_all where subscriber = 'xyz'; -
我已经更新了我的问题。
标签: cassandra