ScyllaDB count(*) return 差异结果

ScyllaDB count(*) return difference result

我对 scylladb 中的查询有疑问。我想计算 table 中的行数:

SELECT COUNT(*) 
FROM tabledata;

总是不同的结果。

关于如何在 scylla 中计算行数有什么建议吗?

您 运行 遇到的问题是任何分布式行存储(Cassandra 或 Scylla)中固有的。为了使其工作,协调器节点需要联系所有其他节点,查询它们,并 assemble 结果集。这会引起很多争用,可能会阻止某些副本正确报告。

我建议(下载)使用 DSBulk 进行此类操作。它具有专为此目的而设计的 count 功能。

dsbulk count -k ks1 -t table1 -h '10.200.1.3,10.200.1.4'

一致性水平?

(你可以在网上找到一张关于最终一致性的非常有趣的图片)

如果你有 RF=3

如果您用 LOCAL_QUORUM

编写所有行

然后我会设置 CONSISTENCY LOCAL_QUORUM

并重新运行计数

如果您不确定所有写入是否正确完成,请使用 CL ALL

另一种选择是运行全面修复并重新运行计数

此外,您的 table 可能有 TTL,在这种情况下,每次都有不同的计数(如果您写的可能更大,如果您只是阅读,那么它会更小)

为了有效计数,请查看 https://github.com/scylladb/scylla-code-samples/tree/master/efficient_full_table_scan_example_code - 但同样适用于一致性级别(当然,此脚本会通过超时错误告诉您令牌范围无法查询,这意味着 node/shard 因其他流量过载,默认情况下不会重试,这是一个简单的脚本)