我最近创建了一台带有3台机器的Cassandra集群。我得到了一切工作正常,但在我不得不重置其中一个节点后(在这篇文章的底部解释),我从一个最大的表中读取时遇到了问题(见下面的跟踪)。
我认为我有一个非常明显的设置,包括分区和群集密钥,我在崩溃之前没有遇到这个问题,所以我不认为这是问题。
' Set the destination range.
Set destrange = BaseWks.Range("B" & rnum)
' Copy the values from the source range
' to the destination range.
With sourceRange
Set destrange = destrange. _
Resize(.Rows.Count, .Columns.Count)
End With
destrange.Value = sourceRange.Value
rnum = rnum + SourceRcount
查询是使用复合键的单行选择。
CREATE TABLE datachannel_6min (
channel_id int,
time_start timestamp,
power_avg float,
power_min float,
power_max float,
energy float,
temperature_in float,
PRIMARY KEY (channel_id, time_start)
);
这里有4个跟踪示例......你可以看到它并不是一直都是一样的。
select * from datachannel_6min where channel_id = 1028 order by time_start desc limit 1;
这是我的群集的历史记录和我遇到的错误。
答案 0 :(得分:0)
我有两点建议:
如果您总是要查询最近的行(order by time_start desc limit 1;
),那么您应该考虑在CLUSTERING ORDER中指定DESC
结束排序方向。这比以ASC
结尾的聚类更快,但以DESC
结尾查询。
我在这里看到的最大问题可能是您的分区(channel_id = 1028
)分布在多个SSTABLE文件中。由于您的数据似乎是时间序列,因此您可以尝试使用DateTieredCompactionStrategy。 DateTieredCompactionStrategy按时间戳将您的数据分组到磁盘上。从理论上讲,这应该使您的查询仅限于少量(或者甚至是单个)SSTABLE文件。特别是如果你只需要最近的一行。
我会DROP
(您无法ALTER
CLUSTERING ORDER),重新加载并重新创建您的表格,如下所示:
CREATE TABLE datachannel_6min (
channel_id int,
time_start timestamp,
power_avg float,
power_min float,
power_max float,
energy float,
temperature_in float,
PRIMARY KEY (channel_id, time_start)
) WITH CLUSTERING ORDER BY (time_start DESC)
AND COMPACTION = {'class': 'DateTieredCompactionStrategy'};
您可以使用我在上面链接的文章中概述的DateTieredCompactionStrategy设置一些选项。给它一个通读,并确保默认值适合您,或根据需要进行调整。