• 请不要在回答技术问题时复制粘贴 AI 生成的内容
tuine
V2EX  ›  程序员

数千个设备的实时数据,每 30 分钟内存储最大值即可,如何设计方案?

  •  
  •   tuine · Dec 26, 2021 · 4536 views
    This topic created in 1783 days ago, the information mentioned may be changed or developed.

    比如数千个温度传感器,每 5s 采集一次数据,后期数据使用只会使用每 30 分钟内最大值,由于大数据及实时数据处理经验较少,目前考虑是数据存储到 kafka 中,然后消费端使用 Redis 存储当前 30 分内最大值,并持续对比更新最大值,且每过一个 30 分钟循环则刷新一次 redis 值到时序数据库,求教

    Supplement 1  ·  Dec 27, 2021
    可能描述没太清楚:
    5000 个设备,每 5 秒一条数据,一天 8640w 条数据,但实际分析和展示报表只会使用 30 分钟内的最大值(实际时间 00-30 ,30-59 分)非滑动窗口,所以打算只存中 30 分钟内最大值到数据库,之前预想是刷新本次 30 分钟内最大值存到内存中,每过一个 30 分钟存储一次最大值到数据库,这样一天大概 24w 条数据,这个数据量关系库也没啥问题了
    32 replies  •  2021-12-28 23:55:25 +08:00
    masterclock
    masterclock
    Dec 26, 2021
    1
    Influxdb 存储每 5 秒的数据,然后搞个 continuous 的 notebook 就差不多了。
    其他的 TSDB ,如 TimescaleDB (continuous aggregation)也都有类似的机制。
    git00ll
    git00ll
    Dec 26, 2021❤️1
    2
    30 分钟是指现实世界中的每 30 分钟作为一个区间吗?
    感觉建张表存就可以了,内存里持有当前区间最大值,处理数据时比内存中值大就更新到数据库,否则就跳过。

    如果是滚动 30 分钟,可以使用找个时序数据库用一下。
    ipwx
    ipwx
    Dec 26, 2021
    3
    为啥我觉得你用 c++ 写个程序用内存 map 就能扛下来。。。
    wangyu17455
    wangyu17455
    Dec 26, 2021 via Android
    4
    mysql 存储时间和温度,查的时候走时间索引,查最近半小时所有数据然后 max 函数取最大值
    T0m008
    T0m008
    Dec 26, 2021
    5
    每 5 秒几千个数值不算啥大数据,随便什么数据库都能轻松搞定
    lauix
    lauix
    Dec 27, 2021
    6
    TSDB 了解下,当然没多少数据 redis 完全可以胜任
    slowman
    slowman
    Dec 27, 2021
    7
    现在方案就挺好的,不用改
    vance123
    vance123
    Dec 27, 2021 via Android
    8
    笑死,几千个数据存 JSON 里都可以
    lyz1990
    lyz1990
    Dec 27, 2021 via Android
    9
    放内存得了
    learningman
    learningman
    Dec 27, 2021
    10
    才这点,map 套 priority_queue 就好了
    Rocketer
    Rocketer
    Dec 27, 2021 via iPhone
    11
    看得不是很明白,你是总共每 30 分钟产生一条数据,还是每台设备每 30 分钟都要产生一条数据?

    5 秒钟的那个算临时数据,不该进数据库,直接内存里处理就行。
    f165af34d4830eeb
    f165af34d4830eeb
    Dec 27, 2021
    12
    既然用了 kafka ,可以看看 ksqldb ?感觉 ksqldb 给的样例场景和你的需求挺接近的
    geniussoft
    geniussoft
    Dec 27, 2021
    13
    怎么感觉内存里随便放一下,然后 JSON 或者 XML 序列化都行呢...
    pengtdyd
    pengtdyd
    Dec 27, 2021
    14
    这点数据光盘就能搞定了
    xukongyang
    xukongyang
    Dec 27, 2021
    15
    可以学习一下 tdengine ,轻量、简单、易用.
    ebingtel
    ebingtel
    Dec 27, 2021
    16
    flink 等类似的滑动窗口都可以……如果场景简单,你目前的方案就不错了
    tuine
    tuine
    OP
    Dec 27, 2021
    17
    @git00ll #2 对,不是滑动。现在想的就是这种方案,数据量也没那么大
    tuine
    tuine
    OP
    Dec 27, 2021
    18
    @T0m008 #5 那一天也 8 千多万数据,要是直接存储到 mysql 这种也不太好吧
    tuine
    tuine
    OP
    Dec 27, 2021
    19
    @xukongyang #15 目前就是打算用这个,而且是国产 TSDB
    tuine
    tuine
    OP
    Dec 27, 2021
    20
    @1423 #7 好的,3Q ,先按这个方案落地,后续再优化吧
    tuine
    tuine
    OP
    Dec 27, 2021
    21
    @Rocketer #11 每台设备每 5s 都产生一条,算作临时数据,这样 30 分钟存一次数据量就下来了
    tuine
    tuine
    OP
    Dec 27, 2021
    22
    @vance123 #8 😂要是几千个我就不问了。。。可能没描述太清楚,Append 重新说明了一下~
    yolee599
    yolee599
    Dec 27, 2021
    23
    在设备端统计好 30 分钟最大值再上传服务器,如果要调整间隔可以设计一条设备配置指令来配置
    glfpes
    glfpes
    Dec 27, 2021 via iPhone
    24
    Redis zset
    zrt
    zrt
    Dec 27, 2021
    25
    看起来 c++写个单调队列就可以解决
    SmiteChow
    SmiteChow
    Dec 27, 2021
    26
    就这点数据不用思考任何算法
    Jf35jxN3fwBXyeLh
    Jf35jxN3fwBXyeLh
    Dec 27, 2021
    27
    数千个设备数据直接放内存,我估计你的数据 1gb 都用不完,每 30 分钟 load 到 db 中就行,注意内存读写锁
    frozenshadow
    frozenshadow
    Dec 27, 2021
    28
    想玩一下的话,可以看看 flink 。可以按照 30min 时间窗计算
    cnuser002
    cnuser002
    Dec 27, 2021
    29
    你的设备上报是 5 秒一个,但是你实际是每个 30 分钟存一个值到数据库。

    那你的主要工作,其实就是写一个比较程序,将每台设备每次上报的数据,跟 30 分钟段内最高的温度,做一个比较就行了。

    到点把最高值往数据库里写就完事了。

    那我感觉,你也没必要搞 Redis ,用你熟悉的语言把这个变换的流程,写一下就 Ok 了。
    tuine
    tuine
    OP
    Dec 27, 2021
    30
    @frozenshadow #28 准备学习一下 玩个试试
    tuine
    tuine
    OP
    Dec 27, 2021
    31
    @cnuser002 #29 是这个道理
    jellyspot
    jellyspot
    Dec 28, 2021
    32
    你这个我理解就是个监控需求么,Prometheus 能实现采集监控,然后也可以用 promql 查询出 30 分钟最大的值,然后把这个值写到数据库之类的就行了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1497 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 16:53 · PVG 00:53 · LAX 08:53 · JFK 11:53
    ♥ Do have faith in what you're doing.