在 cassandra 中设置 TTL 后无法 运行 select 查询

Not able to run select query after setting TTL in cassandra

我在 cassandra DB 中已有记录,使用 Java Class 我正在检索每一行,使用 TTL 更新并将它们存储回 Cassandra DB。之后如果我运行 select 查询它的执行和显示记录。但是当 TTL 时间完成时,如果我 运行 select 查询它必须显示零记录但它不是 运行ning select 查询显示 Cassandra Failure during read query at consistency ONE 错误。对于其他 tables select 查询正常工作但对于那个 table(我应用了 TTL 的行)不工作。

您正在使用常见的反模式。

1) 您正在使用 batches 分别将数据加载到两个单独的表中。我不知道你是否已经拥有一个集群或者你在你的本地机器上,但这不是你将数据加载到 C* 集群的方式,你将承受很大的压力 你的 C* 集群。只有在需要保持两个或多个表同步时才应该使用批处理,而不是一次加载一堆记录。我建议您阅读以下有关该主题的阅读材料:

2) 您正在使用 同步 写入将相当独立的记录插入到集群中。您应该使用 异步 写入来加速数据处理。

3) 您在表格中使用了 TTL 功能,这些功能本身并没有那么糟糕。然而,一个 expired TTL 一个墓碑,这意味着当你 SELECT 你的查询 C* 将不得不读取所有这些墓碑.

4) 您多次绑定准备好的语句:

BoundStatement bound = phonePrepared.bind(macAddress, ...

那应该是

BoundStatement bound = new BoundStatement(phonePrepared).bind(macAddress, ...

为了使用不同的绑定语句。这不是反模式,这是您的代码的问题。

现在,如果您 运行 您的程序多次,由于 TTL 功能,您的表有很多墓碑,这意味着 C* 正在努力读取所有这些以便找到您想要的东西写 "the last time" 你成功了 运行,它花费了很长时间以至于查询超时。

只是为了好玩,你可以尝试增加你的超时时间,比如 2 分钟,在 SELECT 喝杯咖啡,同时 C* 会找回你的记录。

我不知道你想要达到什么目的,但是快速的 TTL 是你的敌人。如果您只是想 刷新 您的记录,请尝试将 TTL 时间保持得足够长,以免影响您的表现。或者,一个可能更好的解决方案是添加一个新列 EXPIRED,"manually" 只在您需要删除记录时写入。这取决于您的要求。