2012-08-08 57 views
2

我们使用Cassandra进行日志收集。 每小时约150,000 - 250,000条新纪录。 我们的列家族有几个列,比如'host','errorlevel','message'等,以及特殊索引列'indexTimestamp'。 此列包含四舍五入至几小时的时间。Cassandra slow get_indexed_slices速度

所以,当我们希望得到一些记录,我们使用的是第一IndexExpression get_indexed_slices()由indexTimestamp(含EQ运营商),然后其他一些IndexExpressions - 由主机,错误级别等

获得当记录只通过indexTimestamp一切工作正常。 但是,当通过indexTimestamp获取记录时,例如host - cassandra长时间工作(超过15-20秒)并引发超时异常。

据我所知,当通过索引列和非索引列获取记录时,Cassandra首先通过索引列获取所有记录,然后通过非索引列对其进行过滤。

那么,为什么卡桑德拉这么慢呢?通过indexTimestamp,不超过250,000条记录。不可能在10秒时过滤它们吗?

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

回答

1

你必须记住卡桑德拉对于这种查询非常不好。索引列查询不适用于大型表格。如果你想围绕这种类型的查询搜索你的数据,你必须定制你的数据模型。

实际上Cassandra不是您可以查询的数据库。这是一个关键值存储系统。要了解该信息,请转到此处并快速浏览:http://howfuckedismydatabase.com/

帮助您的最基本模式是桶行和范围分段查询。

比方说,你有对象

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

,当然你要查询by city OR by 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岁之间。

希望它有用