【发布时间】:2017-06-23 16:23:14
【问题描述】:
我正在尝试设计一个基于 Cassandra 的时间序列服务,它将跟踪一些日志信息。 数据库将看到相对较高的写入量(预计约 5 亿次插入/天)和不太频繁但大容量的读取(想想一天的数据或一个月的数据)。
一个日志条目的简化数据模型如下所示(实际上它有 50 列左右):
log_datetime date
log_some_field text
log_some_other_field text
大多数读取查询将围绕从特定日期范围内选择数据展开,始终按日期降序排列。 (例如SELECT * FROM logs WHERE log_datetime >= 2012-01-01 and log_datetime <= 2012-02-01 ORDER BY log_datetime DESC)。这通常需要相当长的时间,所以我想尽可能地对其进行优化。
只要写入不是太糟糕,按日期排序和过滤是最重要的功能,第一个想法是定义这样的东西(其中 log_day 是一年中的哪一天):
CREATE TABLE logs(
log_day tinyint
log_datetime timeuuid
log_some_field text
log_some_other_field text
PRIMARY KEY (log_day, log_datetime)
WITH CLUSTERING ORDER BY (log_datetime DESC)
)
据我了解,这将使检索尽可能好,因为数据是有序的,并且需要一个分区来检索一天(我可以在客户端处理选择几天的情况)。 但是,这会使写入转到单个服务器,这会极大地影响写入性能。另一种选择是选择一些随机集作为分区键,并以循环方式从客户端分发给每个分区键,这将使写入更快且可扩展,但会导致更差的读取性能,尤其是在我们必须重新排序的情况下数据。我见过的大多数示例通常在数据集中都有自然分区键,例如 user_id 或 post_id,但我的情况并非如此。
这里有人有类似的用例吗?如果是这样,你做了哪些权衡以获得良好的性能?您知道在此类用例中表现更好的数据库吗?
【问题讨论】:
标签: database cassandra time-series scalability data-modeling