【发布时间】:2022-01-06 05:07:06
【问题描述】:
我有一个关于 scylladb 查询的问题。我想计算表中的行数:
SELECT COUNT(*)
FROM tabledata;
- 第一次运行返回 5732 行的结果
- 第二次运行返回 5432 行的结果
总是不同的结果。
关于如何在 scylla 中计算行数有什么建议吗?
【问题讨论】:
我有一个关于 scylladb 查询的问题。我想计算表中的行数:
SELECT COUNT(*)
FROM tabledata;
总是不同的结果。
关于如何在 scylla 中计算行数有什么建议吗?
【问题讨论】:
一致性级别?
(你可以在网上找到一张关于最终一致性的非常有趣的图片)
如果您的 RF=3
如果您使用 LOCAL_QUORUM 编写所有行
然后我会设置 CONSISTENCY LOCAL_QUORUM
然后重新计算
如果您不确定所有写入是否正确完成,请使用 CL ALL
另一种选择是运行完整修复并重新运行计数
此外,您的表可能有 TTL,在这种情况下,每次都需要不同的计数(如果您编写它可能会更大,如果您只是阅读,那么它会更小)
为了有效计数,请查看https://github.com/scylladb/scylla-code-samples/tree/master/efficient_full_table_scan_example_code - 但同样适用于重新一致性级别(当然,此脚本会告诉您无法查询令牌范围的超时错误,这意味着节点/分片已超载其他流量,默认不重试,是一个简单的脚本)
【讨论】:
您遇到的问题是任何分布式行存储(Cassandra 或 Scylla)中固有的。为了使其工作,协调节点需要联系所有其他节点,查询它们并组装结果集。这会导致很多争用,可能会阻止某些副本正确报告。
我建议(下载)使用DSBulk 进行此类操作。它有一个专门为此目的设计的count 功能。
dsbulk count -k ks1 -t table1 -h '10.200.1.3,10.200.1.4'
【讨论】: