比如数千个温度传感器,每 5s 采集一次数据,后期数据使用只会使用每 30 分钟内最大值,由于大数据及实时数据处理经验较少,目前考虑是数据存储到 kafka 中,然后消费端使用 Redis 存储当前 30 分内最大值,并持续对比更新最大值,且每过一个 30 分钟循环则刷新一次 redis 值到时序数据库,求教
1
masterclock 2021-12-26 22:37:29 +08:00
Influxdb 存储每 5 秒的数据,然后搞个 continuous 的 notebook 就差不多了。
其他的 TSDB ,如 TimescaleDB (continuous aggregation)也都有类似的机制。 |
2
git00ll 2021-12-26 22:57:08 +08:00 1
30 分钟是指现实世界中的每 30 分钟作为一个区间吗?
感觉建张表存就可以了,内存里持有当前区间最大值,处理数据时比内存中值大就更新到数据库,否则就跳过。 如果是滚动 30 分钟,可以使用找个时序数据库用一下。 |
3
ipwx 2021-12-26 22:58:51 +08:00
为啥我觉得你用 c++ 写个程序用内存 map 就能扛下来。。。
|
4
wangyu17455 2021-12-26 23:32:33 +08:00 via Android
mysql 存储时间和温度,查的时候走时间索引,查最近半小时所有数据然后 max 函数取最大值
|
5
T0m008 2021-12-26 23:46:01 +08:00
每 5 秒几千个数值不算啥大数据,随便什么数据库都能轻松搞定
|
6
lauix 2021-12-27 00:11:59 +08:00
TSDB 了解下,当然没多少数据 redis 完全可以胜任
|
7
1423 2021-12-27 00:22:53 +08:00
现在方案就挺好的,不用改
|
8
vance123 2021-12-27 00:39:16 +08:00 via Android
笑死,几千个数据存 JSON 里都可以
|
9
lyz1990 2021-12-27 00:44:59 +08:00 via Android
放内存得了
|
10
learningman 2021-12-27 00:46:58 +08:00
才这点,map 套 priority_queue 就好了
|
11
Rocketer 2021-12-27 00:55:52 +08:00 via iPhone
看得不是很明白,你是总共每 30 分钟产生一条数据,还是每台设备每 30 分钟都要产生一条数据?
5 秒钟的那个算临时数据,不该进数据库,直接内存里处理就行。 |
12
f165af34d4830eeb 2021-12-27 01:04:27 +08:00
既然用了 kafka ,可以看看 ksqldb ?感觉 ksqldb 给的样例场景和你的需求挺接近的
|
13
geniussoft 2021-12-27 01:33:00 +08:00
怎么感觉内存里随便放一下,然后 JSON 或者 XML 序列化都行呢...
|
14
pengtdyd 2021-12-27 08:59:14 +08:00
这点数据光盘就能搞定了
|
15
xukongyang 2021-12-27 09:00:15 +08:00
可以学习一下 tdengine ,轻量、简单、易用.
|
16
ebingtel 2021-12-27 09:34:47 +08:00
flink 等类似的滑动窗口都可以……如果场景简单,你目前的方案就不错了
|
19
tuine OP @xukongyang #15 目前就是打算用这个,而且是国产 TSDB
|
23
yolee599 2021-12-27 10:04:22 +08:00
在设备端统计好 30 分钟最大值再上传服务器,如果要调整间隔可以设计一条设备配置指令来配置
|
24
glfpes 2021-12-27 12:40:44 +08:00 via iPhone
Redis zset
|
25
zrt 2021-12-27 13:29:11 +08:00
看起来 c++写个单调队列就可以解决
|
26
SmiteChow 2021-12-27 14:37:11 +08:00
就这点数据不用思考任何算法
|
27
YouKnowIt 2021-12-27 16:36:40 +08:00
数千个设备数据直接放内存,我估计你的数据 1gb 都用不完,每 30 分钟 load 到 db 中就行,注意内存读写锁
|
28
frozenshadow 2021-12-27 16:50:23 +08:00
想玩一下的话,可以看看 flink 。可以按照 30min 时间窗计算
|
29
cnuser002 2021-12-27 17:01:20 +08:00
你的设备上报是 5 秒一个,但是你实际是每个 30 分钟存一个值到数据库。
那你的主要工作,其实就是写一个比较程序,将每台设备每次上报的数据,跟 30 分钟段内最高的温度,做一个比较就行了。 到点把最高值往数据库里写就完事了。 那我感觉,你也没必要搞 Redis ,用你熟悉的语言把这个变换的流程,写一下就 Ok 了。 |
30
tuine OP @frozenshadow #28 准备学习一下 玩个试试
|
32
jellyspot 2021-12-28 23:55:25 +08:00
你这个我理解就是个监控需求么,Prometheus 能实现采集监控,然后也可以用 promql 查询出 30 分钟最大的值,然后把这个值写到数据库之类的就行了
|