为了监视某些分布式软件,我将其监视数据插入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数据模型是什么?
答案 0 :(得分:0)
在我看来,使用time_stamp
作为分区键并不是最佳选择,因为这样会创建很多分区。
我会提出2种解决方案:
1)使用“ week_first_day”作为分区键。您必须在应用程序端计算正确的week_first_day键,然后发出多个选择查询。
2)您可以在cassandra上使用ElasticSearch。 Cassandra仍然是主要数据源,但是您可以自由选择复杂的数据。如果您有兴趣,我建议您看看Elassandra。