如何为百万行配置ScyllaDB:运行简单查询计数(*)返回错误:一致性读取查询期间超时



我有一个带有简单表的表:

create table if not exists keyspace_test.table_test
(
id          int,
date          text,
val float,
primary key (id, date)
)
with caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
and compaction = {'class': 'SizeTieredCompactionStrategy'}
and compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
and dclocal_read_repair_chance = 0
and speculative_retry = '99.0PERCENTILE'
and read_repair_chance = 1;

之后,我导入了1200万行。我想运行简单的计算计数行&sum列值。使用此查询:

SELECT COUNT(*), SUM(val)
FROM keyspace_test.table_test

但显示错误:

Cassandra timeout during read query at consistency ONE (1 responses were required but only 0 replica responded)

我已经添加了USING TIMEOUT 180s;,但显示错误:

Timed out waiting for server response

我使用的配置服务器位于两个位置的数据中心。每个数据中心有4台服务器。

# docker exec -it scylla-120 nodetool status
Datacenter: dc2
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address          Load       Tokens       Owns    Host ID                               Rack
UN  10.3.192.25  79.04 GB   256          ?       5975a143fec6  Rack1
UN  10.3.192.24  74.2 GB    256          ?       61dc1cfd3e92  Rack1
UN  10.3.192.22  88.21 GB   256          ?       0d24d52d6b0a  Rack1
UN  10.3.192.23  63.41 GB   256          ?       962s266518ee  Rack1
Datacenter: dc3
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address          Load       Tokens       Owns    Host ID                               Rack
UN  34.77.78.21    83.5 GB    256          ?       5112f248dd38  Rack1
UN  34.77.78.20    59.87 GB   256          ?       e8db897ca33b  Rack1
UN  34.77.78.48    81.32 GB   256          ?       cb88bd9326db  Rack1
UN  34.77.78.47    79.8 GB    256          ?       562a721d4b77  Rack1
Note: Non-system keyspaces don't have the same replication settings, effective ownership information is meaningless

我用创建密钥空间

CREATE KEYSPACE keyspace_test WITH replication = { 'class' : 'NetworkTopologyStrategy', 'dc2' : 3, 'dc3' : 3};

如何用百万行数据配置"锡拉"?

不确定SUM,但可以使用DSBulk来计算表中的行数。

dsbulk count 
-k keyspace_test 
-t table_test 
-u username 
-p password 
-h 10.3.192.25

DSBulk考虑了代币范围所有权,因此对集群来说压力不大。

"锡拉"文件中的解释(https://docs.scylladb.com/stable/kb/count-all-rows.html)COUNT需要扫描整个数据库,这可能需要很长时间,所以像您那样使用USING TIMEOUT确实是正确的做法。

我不知道扫描表上1200万行的180秒是否足够长的超时时间——为了确保你可以尝试将其增加到3600秒,看看它是否能完成,或者尝试全表扫描(而不仅仅是计数(,看看它进展得有多快,以便能够估计计数((可能需要多长时间(计数((应该比实际扫描返回数据花费更少的时间,但不会少很多——它仍然执行相同的IO(。

此外,需要注意的是,直到最近,COUNT的实现效率还很低——它是按顺序进行的,而不是利用系统中的所有碎片。这是在中修复的https://github.com/scylladb/scylladb/commit/fe65122ccd40a2a3577121aebdb9a5b50deb4a90-但它只到达了"锡拉5.1"(或主分支(,你用的是旧版本的"锡拉"吗?提交中的示例表明,新的实现可能比旧的快30倍!

因此,希望在"锡拉5.1"上,一个低得多的超时时间就足以让你的COUNT操作完成。在旧版本中,您可以模拟Scylla 5.1手动执行的操作:将令牌范围划分为多个部分,并在每个令牌范围上并行调用部分COUNT,然后汇总所有不同范围的结果。

最新更新