【发布时间】:2016-07-03 16:47:41
【问题描述】:
当我尝试执行以下查询时,我总是收到 QueryTimeOutException,
Exception is,
com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency QUORUM (2 responses were required but only 0 replica responded)
Query is,
SELECT * FROM my_test.my_table WHERE key_1 = 101 ORDER BY key_2 ASC LIMIT 25;
我正在使用具有 3 个节点的 cassandra 版本 2.1.0,具有 3 个复制的单个 DC,cassandra.yaml 具有所有默认值,并且我具有以下键空间和表作为架构,
CREATE KEYSPACE my_test
WITH REPLICATION = {
'class' : 'SimpleStrategy',
'replication_factor' : 3
};
CREATE TABLE my_test.my_table (
key_1 bigint,
key_2 bigint,
key_3 text,
key_4 text,
key_5 text,
key_6 text,
key_7 text,
key_8 text,
key_9 text,
key_10 text,
key_11 timestamp,
PRIMARY KEY (key_1, key_2)
);
目前该表有大约 39000 条记录,但最初它有 50000 条记录,11000 条记录已因某些业务逻辑而被删除。
解决方案之一to avoid such exception is to increase query read time out,但是我的架构和查询是more direct why should I increase my read time out?
由于在我的查询中我已经给出了分区键(key_1)所以它应该准确地到达目的地,之后我指定了分区键的起始范围,
所以它应该以 2 秒的最大时间检索,但事实并非如此。但下面的查询工作正常,不到 1 秒就检索到了结果 (Difference is, ASC is not working and DESC is working)
SELECT * FROM my_test.my_table WHERE key_1 = 101 ORDER BY key_2 DESC LIMIT 25;
再次根据架构,集群键默认顺序是 ASC,因此根据 cassandra 文档,在 ASC 中检索数据应该比 DESC 顺序更快。 但在我的情况下是相反的。
再次提供一些线索,以下是通过 CQLSH 尝试过的查询。
以下查询正在运行,不到 1 秒就检索到了结果
SELECT * FROM my_test.my_table WHERE key_1 = 101 AND key_2 > 1 AND key_2 < 132645 LIMIT 1;
但是,以下查询不起作用并引发超时异常,
SELECT * FROM my_test.my_table WHERE key_1 = 101 AND key_2 > 1 AND key_2 < 132646 LIMIT 1;
但是,以下查询正在运行,检索结果不到 1 秒
SELECT * FROM my_test.my_table WHERE key_1 = 101 AND key_2 = 132644;
SELECT * FROM my_test.my_table WHERE key_1 = 101 AND key_2 = 132645;
SELECT * FROM my_test.my_table WHERE key_1 = 101 AND key_2 = 132646;
SELECT * FROM my_test.my_table WHERE key_1 = 101 AND key_2 = 132647;
如有任何帮助,我们将不胜感激。
【问题讨论】:
-
尝试打开 CQLSH 跟踪,看看它告诉你什么:docs.datastax.com/en/cql/3.3/cql/cql_reference/tracing_r.html
-
cqlsh> SELECT * FROM my_test.my_table WHERE key_1 = 101 ORDER BY key_2 ASC LIMIT 500; code=1200 [协调节点等待副本节点响应超时] message="操作超时 - 仅收到 0 个响应。" info={'received_responses': 0, 'data_retrieved': False, 'required_responses': 1, 'consistency': 1} 语句跟踪未在 10 秒内完成
-
@bechbd 我猜如果查询成功,查询跟踪将给出结果。
-
可能不相关,但请避免使用新刻度线模型之前的 .0 版本。 2.1.0 是 2.1 中最不稳定的版本,升级到 2.1.13 将是一个巨大的改进(大量错误修复)。
-
顺便说一句- +1 并收藏。从学术的角度来看,这个问题是纯金的。我不记得有其他人做过这样的事情,这是一个很棒的示例,可以在未来进行链接。尽管这是一个不该做的例子,但拥有这些同样重要(如果不是更重要的话)。
标签: cassandra cql datastax-java-driver cqlsh