为了监视某些分布式软件,我将其监视数据插入到Cassandra表中 . 列是 metric_type
, metric_value
, host_name
, component_type
和 time_stamp
. 方案是我每秒收集所有节点的所有指标 . 所有节点及其指标的统一时间 . 键(区分行)是 host_name
, component_type
, metric_type
和 time_stamp
. 我设计我的表如下:
CREATE TABLE metrics (
component_type text,
host_name text,
metric_type text,
time_stamp bigint,
metric_value text,
PRIMARY KEY ((component_type, host_name, metric_type), general_timestamp)
) WITH CLUSTERING ORDER BY (time_stamp DESC)
其中 component_type
, host_name
和 metric_type
是分区键, time_stamp
是群集键 . metrics
表适用于根据时间戳为 host_name
或 metric_type
或 component_type
获取某些数据的查询,因为使用分区键Cassandra将找到存储数据的分区,并使用群集密钥从该分区获取数据这是Cassandra查询的最佳案例 .
除此之外,我需要一个只使用 time_stamp
获取所有数据的查询 . 例如 :
SELECT * from metrics WHERE time_stamp >= 1529632009872 and time_stamp < 1539632009872 ;
我知道 metric
表不适合上述查询,因为它应搜索每个分区以获取数据 . 我想在这种情况下我们应该使用 time_stamp
作为分区键设计另一个表,因此将从一个或一些有限数量的分区中提取数据 . 但我不确定某些方面:
-
将
time_stamp
设置为分区键是否最佳?因为我每秒都会将数据插入数据库,而且分区键号也会很多! -
我需要查询
time_stamp
上的间隔,我知道分区键中不允许间隔条件,只允许在群集键上使用!
那么这种时间序列数据和查询的最佳Cassandra数据模型是什么?
1 回答
在我看来,使用
time_stamp
作为分区键并不是最佳选择,因为它会创建大量分区 .我建议2个解决方案:
1)以“week_first_day”作为分区键 . 您必须在应用程序端计算正确的week_first_day键,然后发出多个选择查询 .
2)你可以在cassandra上使用ElasticSearch . Cassandra仍然是主要的数据源,但您可以自由地进行复杂的选择 . 如果您有兴趣,我建议您去看看Elassandra .