V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wxt
V2EX  ›  程序员

关于物联网系统的数据库设计和选型

  •  
  •   wxt · 152 天前 via Android · 2435 次点击
    这是一个创建于 152 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前做能耗监测类的项目,因为有个集中器主控,所以一般一个集中器连接几百块仪表,一个项目也就几十个集中器。当时系统数据库用的 mysql 按月和设备编号分表。也就是一个月一个设备一张数据表。

    最近做了一个项目,但是量大了,可以理解为有一万个集中器了,每个集中器固定有二十多个仪表,沿用原来代码发现 mysql 一个月就要建一万多个数据表,这个很明显不合理了。目前看一个设备一个月也就一百万到四百万条记录吧。

    只有一台 32 核,64g ,19t 硬盘的服务器的话大家有什么更好的方案和技术选型,是不是要放弃 mysql 数据库。

    甲方说年底可能要到三万个设备,明年要五万个。

    38 条回复    2022-03-28 11:14:55 +08:00
    nebkad
        1
    nebkad  
       152 天前   ❤️ 1
    https://www.infoq.cn/article/2017/07/why-time-series-database
    《我们为什么需要一个时序数据库?》
    wxt
        2
    wxt  
    OP
       152 天前 via Android
    @nebkad 多谢,有什么好的开源稳定的时序库推荐吗
    duke807
        3
    duke807  
       152 天前
    我喜歡直接用目錄和文件,按照子項目分不同目錄,每個設備再搞一個子目錄,目錄中有設備的 info 文件,數據直接用固定的二進制格式追加到目錄下的數據文件中,單個設備數據量大的話可按時間段或文件大小用多個文件儲存。
    (二進制格式可以是 C 語言 struct 數據結構,或者是 MessagePack 這樣的動態結構,或者直接用字符串。)
    全程不需要類似 PostgreSQL MongoDB 這樣的專用數據庫。
    CEBBCAT
        4
    CEBBCAT  
       152 天前
    诶?怎么没提数据备份的事情?不用担心数据丢失吗?
    dayeye2006199
        5
    dayeye2006199  
       152 天前   ❤️ 1
    可以一张表,但是指定一个 partition key (月份+设备)。https://dev.mysql.com/doc/refman/8.0/en/partitioning-overview.html

    其实就是系统帮你做分表。查询的时候只会扫有你目标数据的 partition 。例如指定一个设备号,就只会看 partition key 里面包含这个设备号的分区,所以性能会很高。

    这么做的好处是你现有数据库设计和下游的查询代码基本不需要怎么改动。
    查询性能和你目前的方案性能基本一致:找 parition + 找到表之后查询。查询 partition 设计合理就是个 log n 的复杂度。
    twing37
        6
    twing37  
       152 天前
    - clickhouse
    - cassandra / scylladb
    singerll
        7
    singerll  
       152 天前 via Android
    淘思,我觉得挺不错的一个公司
    aragakiyuii
        8
    aragakiyuii  
       152 天前 via iPhone
    clickhouse
    opengps
        9
    opengps  
       152 天前 via Android
    我做过类似的,如果不能使用时序数据库的话,mysql 要设计成无主键超简逻辑超大容量的结构,我博客有分享
    opengps
        10
    opengps  
       152 天前 via Android
    bthulu
        11
    bthulu  
       152 天前
    mariadb 啊, 无缝兼容 mysql 还自带时序数据库
    wangtian2020
        12
    wangtian2020  
       152 天前
    是跟 plc 什么相关的吗,我们公司用的 PostgreSQL 。不过我是前端,其他不懂
    joesonw
        13
    joesonw  
       152 天前 via iPhone
    influxdb
    masterclock
        14
    masterclock  
       152 天前
    从时序数据库里挑一个
    TimescaleDB 基于 PG ,没啥缺点
    InfluxDB 排名第一,除单机外没啥缺点

    其他的都大概有点缺点
    banmuyutian
        15
    banmuyutian  
       152 天前
    我司用 InfluxDB
    cco
        16
    cco  
       152 天前
    监控基本上都是无脑时序吧。opentsdb,influxDB 都可以。
    spacezip
        17
    spacezip  
       152 天前
    偶然点进来不太懂开发 我觉得存储性能够一般问题不大
    朋友公司 全国四五十万个仪表 双机 1u 双路 32 核心 256 内存 只不过数据量很小每天几个 g 存储目前是 8t nvme 固态
    youngce
        18
    youngce  
       152 天前
    InfluxDB 性能好但是单机、mongodb 性能差一点但是分布式方案成熟
    v2orz
        19
    v2orz  
       151 天前
    借楼问一下 用 influxDB 的大佬们是怎么做高可用的啊?
    blackshadow
        20
    blackshadow  
       151 天前
    @v2orz 高可用要商业版把。 开源的只支持单机模式。
    MoYi123
        21
    MoYi123  
       151 天前
    @singerll 2 年前用过, bug 还挺多的.
    winnie2012
        22
    winnie2012  
       151 天前
    cshlxm
        23
    cshlxm  
       151 天前
    支持下国产,tdengine ,涛思,用下来感觉不错
    singerll
        24
    singerll  
       151 天前
    @MoYi123 2019 年 7 月 12 日,涛思数据宣布 TDengine 正式开源。
    开源后发展的还挺好的,我见过他们商务,这个公司搞笑的就是没有专职商务人员,商务都是技术人员兼职的,跟我们公司的技术交流群里,提的技术问题商务是解答最快的。。。。。
    实话说我觉得他们真的是一个想做技术的公司,跟拿开源改文件名骗钱的完全不一样。
    pengtdyd
        25
    pengtdyd  
       151 天前
    只要是单机的不能用于生产环境!!!
    wxt
        26
    wxt  
    OP
       151 天前 via Android
    @pengtdyd 没办法,甲方只能提供一台服务器,情况该说的也都说了,服务器带了个磁盘阵列。
    wxt
        27
    wxt  
    OP
       151 天前 via Android
    @dayeye2006199 这种方式目前看可能是优选了,改动最小。
    wxt
        28
    wxt  
    OP
       151 天前 via Android
    @opengps 多谢
    wxt
        29
    wxt  
    OP
       151 天前 via Android
    @spacezip 我们最初计算大概是一万个设备一个月大概是 1T,目前看可能没那么大。
    wxt
        30
    wxt  
    OP
       151 天前 via Android
    @CEBBCAT 甲方认为数据存储一个月就行,做了个磁盘阵列。
    leonhao
        31
    leonhao  
       151 天前
    IOT 这块做过几个项目,推荐 timescaledb ,简单好用,没有坑。clikchouse 一生黑,各种 bug ,浪费时间。
    moen
        32
    moen  
       151 天前
    关系型的话用 TimescaleDB ,起码能自动分表还能对历史数据做压缩
    PopRain
        33
    PopRain  
       151 天前
    发现很多搞 IOT 的都喜欢按设备建表,为什么不把设备 ID 作为数据库的一个字段? 既然数据仅仅保留一个月,这点数据对于数据库来说实在是小 case 了。(可以按时间分区,删除起来也不影响当前工作表)
    wxt
        34
    wxt  
    OP
       151 天前
    @duke807 感觉这种方式不太适合我们 这个数据回头还得查询 计算处理什么的 感觉操作文件弄起来有点麻烦。
    zhangrenjie
        35
    zhangrenjie  
       151 天前
    刚开始是使用 influxdb ,后面转到了 hbase,慢慢堆起来之后发现 Hbase 磁盘占用太多了,现在在踩坑 clickhouse 。
    liveej
        36
    liveej  
       151 天前
    也推荐 TDengine ,省资源,技术支持方便
    ljhskyso7
        37
    ljhskyso7  
       150 天前 via iPhone
    @wxt 可以试试这个: http://iotbase.io/

    第一个真正意义上的物联网数据库,特点已经在官网有说明。总结一下:MQTT 消息直写(也兼容 pg 线协议),顶级的写入性能,顶级的分析查询性能(引擎内部对标 ClickHouse ,比 ClickHouse 快;外部对标 Timescale ,比 Timescale 快的 2-3 个数量级),免运维设计,极好的工程稳定性,完整地支持常用 SQL 函数。有待改进的是,目前只支持单机(但支持 HA ),复杂的 SQL 分析函数和 JOIN 还在进行中。

    目前团队正在进行一些上云的工作,所以 SQL 方面的功能性增强会稍微放几天。

    团队正在对有真实需求的企业用户提供免费内测,CEO 直接提供企业级支持,欢迎申请:
    [email protected]
    wxt
        38
    wxt  
    OP
       141 天前 via Android
    @ljhskyso7 多谢 抱拳
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4126 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 01:32 · PVG 09:32 · LAX 18:32 · JFK 21:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.