造型卡桑德拉表
我设计下表来存储服务器警报:造型卡桑德拉表
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功能在几天后自动删除行。
非常感谢你的回答unique_key是在rdbms中生成的随机密钥。 cassandra是否具有自动复制表间数据的功能?我需要每次检查clear_time字段,它是否会减慢性能?另外,第三个我认为你的意思是happen_time? – kinkajou
我该如何为每秒100-1000次报警? – kinkajou
Cassandra 3.0将支持物化视图,以将数据从一个表传播到另一个表,但该版本暂时不可用。我不明白你每次检查clear_time的意思。您希望避免在Cassandra中写入之前进行读取,因为它会大大降低事务吞吐量。 –