我的名字是丹尼尔, 我是一个新手,但很长一段时间潜伏着。 我决定为我的下一个学习Apache Cassandra"让孩子们在睡觉的时候写一些代码"项目
我写的是一个简洁的小api,它会对cassandra数据库进行读写操作。 我在mongodb中找到了很多db布局,但对我而言,现在是时候继续前进并成长为一名工程师:)
团: 我将从机架中的服务器收集指标,代理将每分钟发送一个指标的有效负载。 我有很多想法的api部分,将使用JWT令牌签署有效载荷。 我将存储的数据类型如下所示。 cpuload,cpuusage,memusage,diskusage等。
我与cassandra混淆的部分是如何编写实际模型,我理解存储器类型将它全部写为时间序列 在磁盘上让我阅读相当惊人。我知道任何事情我会鞭在一起现在可以为我的实验室工作,因为它有30台机器, 但是我试图了解这些事情是如何正确完成的,以及如何在服务器密度,数据对象等实际生活场景中完成这些工作,并插入您喜欢的服务器监控服务"。 :)
但是,您如何更有经验的工程师设计这样的架构?
数据库的使用方案:
- 通过api每分钟写入有效负载。 (为了学习一些东西,让我们想象每分钟至少有100k次写入 有用)
读取与某个用户标识相关联的资产
- 拉最新数据(3h)
- 提取最新数据(每日)
- 提取最新数据(每周)
- 提取最新数据(每月)
- 等等
生成显示正常运行时间等的每月pdf报告。
我应该插入包含完整有效负载的行还是我最好按服务插入它们:timeuid | cpuusage
每个服务行
CREATE TABLE metrics(
id uuid PRIMARY KEY,
assetid int,
serviceType text,
metricValue int
)
一体化
CREATE TABLE metrics(
id uuid PRIMARY KEY,
assetid int,
cpuload int,
cpuusage int,
memusage int,
diskusage int,
)
在mongo中,我会预先分配桶,并在文档内部保持快速读取avg。 因此,在webgui中,我可以简单地显示预定时间段的平均统计数据。
dumbasses的例子非常受欢迎。 希望你能破译我相当贫穷的英语。
刚刚在SO建议中找到了这个网址: Cassandra data model for time series 我想这也适用于我。
诚恳 丹尼尔奥尔森
答案 0 :(得分:1)
对于您的数据模型,我建议将时间添加为群集列:
CREATE TABLE metrics(
id uuid,
time timeuuid,
assetid int,
cpuload int,
cpuusage int,
memusage int,
diskusage int,
PRIMARY KEY (id, time) WITH CLUSTERING ORDER BY (time DESC))
使用降序来保持最新的指标。然后,您可以使用LIMIT子句进行查询以获取最近的小时:
SELECT * FROM metrics WHERE id = <UUID> LIMIT 60
或者一天:
SELECT * FROM metrics WHERE id = <UUID> LIMIT 1440
根据您计划保留数据的时间长短,您可能需要在表中添加年,月或日的列以限制分区大小。例如,如果您希望将数据保留3个月,则可以添加月列,以按ID和月分区您的密钥:
CREATE TABLE metrics(
id uuid,
time timeuuid,
month text,
assetid int,
cpuload int,
cpuusage int,
memusage int,
diskusage int,
PRIMARY KEY ((id, month), time) WITH CLUSTERING ORDER BY (time DESC))
如果您保存数年数据,请使用年份+月份或日期值。
关于最后一个问题,关于单独的表格或单个表格。 Cassandra支持稀疏列,因此您可以在公共表中为每个度量标准进行多次插入,而无需更新任何数据。但是,每行只写一次总是更快。
如果您必须通过备用密钥查询不同的指标,则可能需要单独的表。例如,按ID和磁盘名称查询磁盘使用情况。您需要一个单独的表或物化视图来支持该查询模式。
最后,您的架构定义了 assetid ,但这并未在您的主键中定义,所以使用您当前的架构,您无法使用assetid进行查询。