2

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

因此,当我们想要获取一些记录时,我们使用 get_indexed_slices() 和第一个 IndexExpression by indexTimestamp(使用 EQ 运算符),然后是其他一些 IndexExpressions - by host、errorlevel 等。

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

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

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

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

4

1 回答 1

1

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

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

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

假设你有对象

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

当然你想查询by cityOR 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 之间的年龄。

希望它有用

于 2012-08-09T15:30:46.390 回答