我们正在使用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内存。
答案 0 :(得分:1)
你必须记住,Cassandra对这种疑问非常糟糕。索引列查询不适用于大表。如果您想围绕此类查询搜索数据,则必须围绕它定制数据模型。
事实上,Cassandra不是您可以查询的数据库。它是一个键值存储系统。要理解这一点,请快速浏览一下:http://howfuckedismydatabase.com/
帮助您的最基本模式是存储桶行和范围范围切片查询。
假设你有对象
user : {
name : "XXXXX"
country : "UK"
city : "London"
postal_code :"N1 2AC"
age : "24"
}
当然您要查询by city
或by age
(and
& 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岁之间的年龄。
希望它有用