Cassandra慢了get_indexed_slices的速度

时间:2012-08-08 05:59:02

标签: performance indexing cassandra

我们正在使用Cassandra进行日志收集。 每小时约150,000 - 250,000条新记录。 我们的列系列有几个列,如'host','errorlevel','message'等,以及特殊的索引列'indexTimestamp'。 此列包含四舍五入到小时的时间。

所以,当我们想得到一些记录时,我们使用get_indexed_slices()和indexTime表示的第一个IndexExpression(带有EQ运算符),然后使用其他一些IndexExpressions - by host,errorlevel等。

仅通过indexTimestamp获取记录时一切正常。 但是,当通过indexTimestamp获取记录时,例如,host-cassandra可以工作很长时间(超过15-20秒)并抛出超时异常。

据我了解,当通过索引列和非索引列获取记录时,Cassandra首先通过索引列获取所有记录,然后通过非索引列过滤它们。

那么,为什么Cassandra这么慢呢?通过indexTimestamp,记录不超过250,000条。是不是可以在10秒内过滤它们?

我们的Cassandra集群在一台机器(Windows 7)上运行,具有4个CPU和4 GB内存。

1 个答案:

答案 0 :(得分:1)

你必须记住,Cassandra对这种疑问非常糟糕。索引列查询不适用于大表。如果您想围绕此类查询搜索数据,则必须围绕它定制数据模型。

事实上,Cassandra不是您可以查询的数据库。它是一个键值存储系统。要理解这一点,请快速浏览一下:http://howfuckedismydatabase.com/

帮助您的最基本模式是存储桶行和范围范围切片查询。

假设你有对象

user : {
  name : "XXXXX"
  country : "UK"
  city : "London"
  postal_code :"N1 2AC"
  age : "24"
}

当然您要查询by cityby ageand& or是另一种数据模型)。​​

然后你必须像这样保存你的数据,假设名字是一个唯一的id:

write(row = "UK", column_name = "city_XXXX", value = {...})

write(row = "bucket_20_to_25", column_name = "24_XXXX", value = {...})

请注意,我按国家/地区搜索城市搜索,按年龄段搜索年龄段。

年龄EQ 24的范围查询将是

get_range_slice(row= "bucket_20_to_25", from = "24-", to = "24=")

作为备注"minus" == "under_score" - 1"equals" == "under_score" + 1,有效地为您提供以“24 _”开头的所有列

这也允许您查询21到24岁之间的年龄。

希望它有用