【问题标题】:Cassandra query results varyCassandra 查询结果各不相同
【发布时间】:2019-10-23 23:47:12
【问题描述】:

我有 4 节点 2-dc cassandra 集群,我遇到了无法解释的行为。

dc1 - 节点1、节点2、节点3。

dc2 - 节点 4。

在我的数据库中,我的 columnFamily1 具有复制因子 dc1:2 dc2:1。列族包含 28 列,其中 11 列是主键。我从 dc2 查询 node4,它包含 100% 的数据。所以,问题是:

'Select * from columnFamily' 返回 5103 条记录。

'Select (any column from primaryKey) from columnFamily' 返回 733 条记录。

如果我将 columnFamily 导出到 CSV,然后导入到截断表,问题就会消失。谁能解释一下,怎么会这样?有没有不截断 columnFamily 的解决方案?

【问题讨论】:

  • 您对插入和查询使用什么一致性级别?
  • 我使用一致性级别一,查询拥有100%数据的节点。
  • 除非您运行修复,否则无法知道使用 CL.ONE 插入后哪些节点有数据。来自状态的owns 只是描述了它对环的责任,而不是它是否真的获得了数据。如果您使用 CL.QUORUM(非本地)进行读写,它将按预期工作。

标签: cassandra centos


【解决方案1】:

所以从你上面的陈述来看,抛开你的评论(关于“拥有 100% 数据的节点”的部分),你一定有一些一致性问题。当您使用一致性一时,您将查询一个节点以获取详细信息。哪个节点可以是其中任何一个。您执行“*”或“主键中的任何列”这一事实并不重要,但每次运行查询时,您都可以获得不同的结果节点。如果您使用的是 CQLSH,您可以尝试一次登录每个节点,将一致性设置为 LOCAL_ONE 并运行“select ”或“select count()”并查看结果你得到。我猜它会有所不同。当您截断表并重新加载它时,这可以清除一致性问题。您可以做的另一种方法是在列族上运行修复,然后重新尝试您的实验。你做了什么来导出数据?您是否使用了 CQLSH COPY 命令?如果是这样,那将查询所有节点的数据。您是否计算了 CSV 中的行数?如果是,它是否与查询本身的任何计数相匹配?

【讨论】:

  • 让我澄清一下:1)选择结果不同(一致性之一)-> cqlsh COPY 到 csv -> 在 new_cluster 上创建表(相同的 conf)-> cqlsh COPY 从 csv -> 选择结果是正确(一致性一)。 2)选择结果不同(一致性一)-> cp data/table/sstables -> new_cluster nodetool refresh -> 选择结果不同(一致性一)。 3)选择结果变化(一致性一)-> nodetool修复->选择结果变化(一致性一)。将一致性设置为仲裁没有意义,因为问题出现在包含 2 个节点和 RF 2 的新集群上。
  • 那么当你第一次“cqlsh 复制到 csv”时,文件中有多少行?此外,您是否在每个节点上运行修复,而不仅仅是一个节点?你有TTLS吗?所有主机上的时钟是否同步?您是否尝试使用“local_one”而不是“one”来保持一致性并在每个节点上运行查询以获得结果?
  • 您好! 1)有5103行。 2)我确实在每个节点上运行了修复。 3) 是的,我们有 TTL,但大于 3 天,我们在数据导入后立即遇到问题。 4) 是的,昨天我尝试使用 local_one。同样的问题。
猜你喜欢
  • 2018-06-19
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
相关资源
最近更新 更多