【发布时间】:2017-05-24 08:11:12
【问题描述】:
我们正在考虑将我们的时间序列应用程序从 SQL Server 迁移到 Cassandra,因为数据量变得太大,SQL Server 无法处理。我们可以有多达 100 个传感器同时工作(有时一整年,有时更短,但通常至少同时工作 50 个),每个传感器能够以高达 60 Hz 的频率传输多达 20 个不同的测量值(未来可能有 120 个)。
大多数在线资源(例如DataStax)建议将分区划分为“可管理的分区”,这可能低于 1,000,000 行(实际上,低于 50MB 的数据可能是实际指标)。因此,对于 1 Hz 的报告率,将每个传感器数量按一周划分会产生(7 * 24 * 60 * 60) = 604,800 每个分区的测量值:
CREATE TABLE measurements (
sensor_id TEXT,
quantity TEXT,
start_of_week TIMESTAMP,
offset_seconds INT, -- offset from week start (0..604799)
value FLOAT,
PRIMARY KEY ((sensor_id, quantity, start_of_week), offset_seconds)
) WITH CLUSTERING ORDER BY (offset_seconds DESC)
因此,自然地,对于 60 Hz 报告率,我可能会按小时 进行分区,以保持简单并获得每个分区的 (60 * 60 * 60) = 216,000 测量值。或者几个小时,当然。
但是,我对这将如何在实践中发挥作用有一些不确定性。
到目前为止,我们有一个相当非规范化的 SQL Server 数据库,我们会将来自单个传感器的所有 20 个值放在一行中,并且服务器能够跟上(尽管 CPU 一直保持在 ~30%)最多 50 台设备(基本上是每秒 3,000 行,我们假设 SQL Server 的最大速度约为 10,000 行/秒)。不用说,如果每个设备都添加新数量,这根本无法扩展,同时对于报告数量少于 20 个的设备会浪费大量空间。
但是,使用上述 C* 方法,每秒存储的键值对的数量(假设 100 个传感器、20 个测量值、60 Hz)似乎将是每秒 120,000 个。
是否可以通过“基本”3 节点设置来实现这一点?对于这样的插入率,实际上需要多少个 Cassandra 节点?
-
将单个数量的所有亚秒 (60 Hz) 值移动到单个 blob 是否会提高性能?这意味着总插入率将是 2,000 个blob,这似乎更易于管理(甚至 60 个 float32 值的 240 字节大小的 blob 似乎也不是那么大)。
李>
大多数情况下,数据将从包含预先计算的最小/最大/平均聚合的不同表中显示(用户可以随时创建全分辨率范围查询,但范围更小),因此我们的重点是最大化写入吞吐量。如果您认为任何其他模式可能会提供更好的吞吐量(我不知道,可能是多个表/其他一些分区/集群策略),请提出建议。如果它能够更好地满足我们的要求,我们甚至愿意切换到不同的 NoSQL 数据库。
【问题讨论】:
标签: cassandra time-series nosql