【问题标题】:Cassandra: range select with incorrect resultCassandra:范围选择结果不正确
【发布时间】: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


【解决方案1】:

不知道为什么,但是在将集群升级到 cassandra 2.1.8 后问题得到了解决。

【讨论】:

    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多