在Cassandra集群中读取缓慢

时间:2015-06-23 06:39:55

标签: cassandra

我最近创建了一台带有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;

这是我的群集的历史记录和我遇到的错误。

  • 在西欧的Azure数据中心的虚拟网络中安装了3个节点。我开始服务将API登录到Cassandra。 (大约10 / s)。我开始使用添加数据来计算新数据的第二项服务(这是使用上面选择的地方)
  • 将旧数据(MSSQL中 5亿行)移至Cassandra。在大约3天内与我的服务并行。
  • [错误]硬盘已满。我犯了一个愚蠢的错误,忘记为数据添加一个单独的磁盘。我在每台机器上安装了4个磁盘,并将它们“合并”为一个(http://blog.metricshub.com/2012/12/27/running-cassandra-on-azure-step-by-step-gotcha-by-gotcha/)。我将日志和数据目录移动到所有三个节点上的新磁盘。其中两个节点工作正常,但第三个节点我必须完全清理(删除数据/日志)。我的复制因子为2,因此没有数据丢失。我在“新”节点上运行 nodetool repair
  • 当我再次开始查询群集时,我注意到我的选择不一致。如果我在Datastax Devcenter中运行查询,我可能无法获得查询结果,但经过3-5次尝试后,我得到了完整的回复。我改变了我的查询以使用Quorom而不是ONE来解决问题。
  • 我还在两个好的节点上运行了 nodetool cleanup
  • 最后,我在其中一个好节点上运行nodetool修复,并且现在正在最后一个节点上运行它(大约需要1天才能运行)。

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设置一些选项。给它一个通读,并确保默认值适合您,或根据需要进行调整。