我一直在一个cassandra数据库中工作,以保存事件/监视系统的实时数据,该系统每小时有相当多的事件(100k+),而且我遇到了一个特殊的需要:我需要一种方法来按事件状态(打开、关闭)获取所有事件的数据。
每个事件都有以下字段:id(由事件系统生成)、状态、start_date、end_date、节点、描述。
我的第一步是拥有一个状态作为分区键,id作为集群的表:
CREATE TABLE alarms_by_state (
id,state,start_date,end_date,node,
PRIMARY KEY((state),id))这是无效的,因为它为每个id保留了2个状态。
我需要的是,例如,我们接收id=1和state=open的事件,然后应用程序将它保存到数据库中,然后用id=1和state=closed保存另一个事件,并替换以前的记录。
我知道这一切都可以在应用程序端完成,但由于每小时收到的事件数量,我试图将该控件保持在最低限度。
谢谢您抽时间见我
发布于 2021-02-17 16:54:50
这不起作用,因为它为每个id保留了2个状态。
我喜欢你试过这个。对于将来看到这篇文章的人来说,它将强调卡桑德拉的主键是独一无二的。
我会这么做的。
CREATE TABLE alarms_by_date (
id UUID,
state TEXT,
start_date DATE,
end_date DATE,
node TEXT,
PRIMARY KEY((day,hour,m15),start_date,id))
WITH CLUSTERING INDEX ON (start_date DESC,id ASC);
CREATE INDEX ON alarms_by_date(state);这样做的目的是:
start_date和id的聚类索引。不确定这两个日期中哪个日期(开始/结束)对您的业务情况更重要。但是这样的话,数据就会按时间递减。另外,我喜欢使用id列作为最后一个集群键,以帮助确保唯一性。https://dba.stackexchange.com/questions/285538
复制相似问题