我有一个带有简单表的表:
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考虑了代币范围所有权,因此对集群来说压力不大。
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
,然后汇总所有不同范围的结果。