造型卡桑德拉表

问题描述:

我设计下表来存储服务器警报:造型卡桑德拉表

create table IF NOT EXISTS host_alerts(
    unique_key text, 
    host_id text, 
    occur_time timestamp, 
    clear_time timestamp, 
    last_occur timestamp, 
    alarm_name text, 
    primary key (unique_key,host_id,clear_time) 
); 

让我们输入一些数据:

truncate host_alerts; 

insert into host_alerts(unique_key,host_id,alarm_name, 
    clear_time,occur_time,last_occur 
) 
values('1','server-1','disk failure', 
'1970-01-01 00:00:00+0530','2015-07-01 00:00:00+0530','2015-07-01 00:01:00+0530'); 

insert into host_alerts(unique_key,host_id,alarm_name, 
    clear_time,occur_time,last_occur 
) 
values('1','server-1','disk failure', 
'1970-01-01 00:00:00+0530','2015-07-01 00:00:00+0530','2015-07-01 00:02:00+0530'); 

insert into host_alerts(unique_key,host_id,alarm_name, 
    clear_time,occur_time,last_occur 
) 
values('1','server-1','disk failure', 
'2015-07-01 00:02:00+0530','2015-07-01 00:00:00+0530','2015-07-01 00:02:00+0530'); 

查询我的应用程序将运行是:

//All alarms which are **not cleared** for host_id 
select * from host_alerts where host_id = 'server-1' and clear_time = '1970-01-01 00:00:00+0530'; 

//All alarms which are cleared for host_id 
select * from host_alerts where host_id = 'server-1' and clear_time > '2015-07-01 00:00:00+0530'; 

//All alarms between first occurrence 
select * from host_alerts where host_id = 'server-1' 
and occur_time > '2015-07-01 00:02:00+0530'and occur_time < '2015-07-01 00:05:00+0530'; 

我不知道我是否应该准备更多的表格示例:host_alerts_by_hostname 或host_alerts_by_cleartime等等,或者干脆添加集群索引。 作为唯一的ID是唯一的独特列,但我需要从另一列retrive数据

不清零报警:“1970-01-01 00:00:00 + 0530”清除事件有一定的日期值。

HOST_ID是服务器名称

occur_time是当事件已发生。

last_occur是当事件再次reoccured时间。

alarm_name是什么与系统happend。

如何建模我的表,以便我可以执行这些查询和基于unique_id更新?与我已经尝试选择是不可能的,并在upsert期间为同一个unique_key创建新行。

我想你可能需要三张表来支持你的三种查询类型。

第一个表将支持约当警报发生的每个主机的历史时间范围查询:

CREATE TABLE IF NOT EXISTS host_alerts_history (
    host_id text, 
    occur_time timestamp, 
    alarm_name text, 
    PRIMARY KEY (host_id, occur_time) 
); 

SELECT * FROM host_alerts_history WHERE host_id = 'server-1' AND occur_time > '2015-08-16 10:05:37-0400'; 

第二个表将跟踪未清除告警的每个主机:

CREATE TABLE IF NOT EXISTS host_uncleared_alarms (
    host_id text, 
    occur_time timestamp, 
    alarm_name text, 
    PRIMARY KEY (host_id, alarm_name) 
); 

SELECT * FROM host_uncleared_alarms WHERE host_id = 'server-1'; 

最后一个表格将跟踪每个主机清除警报的时间:

CREATE TABLE IF NOT EXISTS host_alerts_by_cleartime (
    host_id text, 
    clear_time timestamp, 
    alarm_name text, 
    PRIMARY KEY (host_id, clear_time) 
); 

SELECT * FROM host_alerts_by_cleartime WHERE host_id = 'server-1' AND clear_time > '2015-08-16 10:05:37-0400'; 

当一个新的报警事件到来时,你会执行此批:

BEGIN BATCH 
INSERT INTO host_alerts_history (host_id, occur_time, alarm_name) VALUES ('server-1', dateof(now()), 'disk full'); 
INSERT INTO host_uncleared_alarms (host_id, occur_time, alarm_name) VALUES ('server-1', dateof(now()), 'disk full'); 
APPLY BATCH; 

注意,INSERT INTO未清除的表是一个UPSERT,因为时间戳是不是关键的一部分。因此,该表格只会为每个具有最后发生时间戳的警报名称输入一个条目。

当报警清除事件到来时,你会执行此批:

BEGIN BATCH 
DELETE FROM host_uncleared_alarms WHERE host_id = 'server-1' AND alarm_name = 'disk full'; 
INSERT INTO host_alerts_by_cleartime (host_id, clear_time, alarm_name) VALUES ('server-1', dateof(now()), 'disk full'); 
APPLY BATCH; 

我真的不明白你的“unique_key”是什么,或者它从何而来。我不确定这是否需要,因为host_id和alarm_name的组合应该是您要使用的粒度级别。在混音中添加另一个独特的关键可能会产生许多无法比拟的警报/清除事件。如果unique_key是一个警报ID,那么在我的示例中使用它作为alarm_name的键,并将alarm_name作为数据列。

为防止您的表随着时间的推移被旧数据填满,您可以使用TTL功能在几天后自动删除行。

+0

非常感谢你的回答unique_key是在rdbms中生成的随机密钥。 cassandra是否具有自动复制表间数据的功能?我需要每次检查clear_time字段,它是否会减慢性能?另外,第三个我认为你的意思是happen_time? – kinkajou

+0

我该如何为每秒100-1000次报警? – kinkajou

+0

Cassandra 3.0将支持物化视图,以将数据从一个表传播到另一个表,但该版本暂时不可用。我不明白你每次检查clear_time的意思。您希望避免在Cassandra中写入之前进行读取,因为它会大大降低事务吞吐量。 –