【发布时间】:2015-08-23 04:35:02
【问题描述】:
我在 cassandra 中的范围选择存在问题:它有时不会返回所有数据。 它是一个 2.1.0 集群。 Apache 提供的二进制文件。
这是我的桌子:
CREATE TABLE metrics.main_cnt (
gran ascii,
ctx ascii,
io ascii,
eid uuid,
dt bigint,
apdex_s counter,
apdex_t counter,
"count" counter,
error counter,
time counter,
PRIMARY KEY ((gran, ctx, io, eid), dt))
我在那个表中有很多行,如果我执行这个查询:
SELECT * from main_cnt WHERE gran = 'min' AND ctx ='A' AND io = 'i' AND eid =4379eec6-ba09-4f70-8862-1c864595c371 and dt in (1420644000000, 1420640400000);
我得到了这个结果:
gran | ctx | io | eid | dt | apdex_s | apdex_t | count | error | time
------+-----+----+--------------------------------------+---------------+---------+---------+-------+-------+--------
min | A | i | 4379eec6-ba09-4f70-8862-1c864595c371 | 1420640400000 | 671 | 4 | 677 | 0 | 168253
min | A | i | 4379eec6-ba09-4f70-8862-1c864595c371 | 1420644000000 | 554 | 10 | 566 | 0 | 192666
但是如果我像这样使用范围选择:
SELECT * from main_cnt WHERE gran = 'min' AND ctx ='A' AND io = 'i' AND eid =4379eec6-ba09-4f70-8862-1c864595c371 and dt >= 1420640400000 and dt <= 1420644000000;
我只得到一行:
gran | ctx | io | eid | dt | apdex_s | apdex_t | count | error | time
------+-----+----+--------------------------------------+---------------+---------+---------+-------+-------+--------
min | A | i | 4379eec6-ba09-4f70-8862-1c864595c371 | 1420640400000 | 671 | 4 | 677 | 0 | 168253
我也尝试增加范围,但没有更好的结果。 这不是唯一的情况,但如果我更改 dt 参数,有时我会得到多行的正确结果。
nodetool repair 不能解决问题。
我在 Jira 中没有找到任何关于此类问题的票证。 有谁知道这个问题? 感谢您的帮助。
编辑:更多信息:
复制因子 = 3
集群大部分时间有 8 或 9 个节点
使用 java 驱动程序 2.1.5 完成增量,并使用以下命令准备语句:UPDATE main_cnt SET time = time + ?, \"count\" = \"count\" + ?, error = error + ?, apdex_s = apdex_s + ?, apdex_t = apdex_t + ? WHERE gran = ? AND dt = ? AND ctx = ? AND eid = ? AND io = ?
正常选择的跟踪: trace1.log 跟踪不正确的范围选择: trace2.log
【问题讨论】:
-
您能发布您的 IN/UPSERT 语句吗?当我重新创建您的表并在上面插入相同的值时,您的范围查询对我有用(2 行)。因此,接下来要做的合乎逻辑的事情是确保我以与您相同的方式插入数据。
-
感谢@BryceAtNetwork23 的快速回答。此表中的数据由每秒递增计数器数千次的批处理作业插入。我将尝试找到为这些确切键启动的确切增量命令。
-
我忘了说复制因子是 3 并且集群中的节点数大多数时候是 8 或 9。
-
具体来说,我很好奇您是如何生成
dt列值的。 -
使用 Java 驱动程序 (2.1.5) 完成增量。使用这个准备好的语句:
private final static String incrMainCql = "UPDATE main_cnt SET time = time + ?, \"count\" = \"count\" + ?, error = error + ?, apdex_s = apdex_s + ?, apdex_t = apdex_t + ? WHERE gran = ? AND dt = ? AND ctx = ? AND eid = ? AND io = ?";dt列被限定为长值。
标签: cassandra