V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
morota
V2EX  ›  数据库

一个程序开发问题请教各位 V 友大佬,每秒 10 万条数据需要存储,怎样选择技术方案

  •  
  •   morota · 2 小时 37 分钟前 · 2836 次点击

    物联网传感器发送的数据,走 tcp 或者 mqtt ,每秒大概有 10 万条,每条数据大概 20 个字节大小(5 个 int 值) 现在的问题是:服务端如何保存这些数据。

    1, 用什么数据库,如何高频插入 2, 服务器选什么样的配置,来配合数据插入。CPU ,内存,硬盘需要多大。

    请各位大佬不吝指教

    65 条回复    2024-11-29 11:30:39 +08:00
    asmoker
        1
    asmoker  
       2 小时 35 分钟前 via Android
    ck
    kenneth104
        2
    kenneth104  
       2 小时 35 分钟前
    非程序员
    加缓冲层,1 层不够再来 1 层
    FanError
        3
    FanError  
       2 小时 35 分钟前
    先扔到消息队列里,再慢慢消费。
    rockxsj
        4
    rockxsj  
       2 小时 32 分钟前
    1 、日志服务器收到之后先落地本地文件
    2 、fluentbit watch 本地文件然后发送到 kafka
    3 、写个程序从 kafka 消费写入到最终数据库 starrocks
    hxzhouh1
        5
    hxzhouh1  
       2 小时 31 分钟前
    好像有个国产消息队列 TDengine , 专门应对这种物联网场景的
    morota
        6
    morota  
    OP
       2 小时 27 分钟前
    @FanError 消息队列的话,内存是不是需要配置很大的内存,否则会爆?
    morota
        7
    morota  
    OP
       2 小时 26 分钟前
    @rockxsj 消息队列的话,内存是不是需要配置很大的内存,否则会爆?
    saintatgod
        8
    saintatgod  
       2 小时 25 分钟前
    1. 使用时序数据库或者 nosql ,或者 pgsql 这样的数据库,使用队列异步去消费这些数据,插入时候可以批量插入,最好在插入前对数据库进行好分区,然后按照分区读写。
    2. 服务器的话需要 16 核的 CPU , 内存按照 32-64 来搞,硬盘的话,你这个量级如果没有估算错,至少 1T ,另外就是带宽搞大一点。
    基本上就这样。
    E520
        9
    E520  
       2 小时 25 分钟前
    @morota 这也要看你的消费处理速度,消费的快,那堆积内存就不大, 你可以算一下 1 秒 10 万条数据,占多少内存,去计算就行了
    morota
        10
    morota  
    OP
       2 小时 23 分钟前
    @saintatgod 感谢大佬,算了一下带宽至少需要 10M ,对吗?
    rockxsj
        11
    rockxsj  
       2 小时 23 分钟前
    @morota #7 kafka 是顺序写入硬盘的,不需要内存很大,硬盘大写就行了
    tool2dx
        12
    tool2dx  
       2 小时 23 分钟前
    搜了一下,一般正规一点的 E5 服务器( 24 核心+24G 内存),mysql 每秒能支持到 117 万的请求。

    当然他测试客户端没那么多,你是物联网,tcp 来源比较碎片化,性能可能要打折。

    感觉优先走分布式,一个机房宽带顶不住啊。
    tool2dx
        13
    tool2dx  
       2 小时 20 分钟前
    @morota “感谢大佬,算了一下带宽至少需要 10M ,对吗?”

    肯定不是按照字节来算。你要根据终端数量的 tcp ip 封包切割来算。哪怕只是 20 字节,频繁握手对于带宽的压力也不小。
    vkillwucy
        14
    vkillwucy  
       2 小时 20 分钟前 via Android
    kafka + flink + starrocks 大数据套件搞起来
    KOMA1NIUJUNSHENG
        15
    KOMA1NIUJUNSHENG  
       2 小时 16 分钟前   ❤️ 1
    搞不懂和大数据有什么关系,这种物联网硬件数据明显用时序数据库啊
    bthulu
        16
    bthulu  
       2 小时 14 分钟前   ❤️ 1
    那就是每秒 50 万个 int, 共 2MB. 就是每秒 2MB, 直接写文件, 一条一行. 这样是个设备就能满足要求.
    几十块收个几年前的斐讯盒子, 刷机, 把自己的程序放上去就行了.
    standchan
        17
    standchan  
       2 小时 10 分钟前
    clickhouse ,不要求实时的话,都放在消息队列里面慢慢消费
    songyoucai
        18
    songyoucai  
       2 小时 9 分钟前   ❤️ 2
    做过物联网的来回答一下。 首先你的边缘网关,就需要处理这些数据。并不是所有的数据都需要入库的,比如传感器每 5s 上报一次。有一些频率甚至更低。 想想你物联网网关,如果是走的 5g 来上报数据,流量卡吃得消吗

    假设你已经是边缘网关清洗过的数据,现在设备几万台,,每秒就是有 10 万条数据. .这时候需要用到时序数据库,消息队列是给物联网后续的指令去消费的。


    重点: 边缘网关做数据清洗和心跳,定期上报异常数据和转发指令。这样如果是平常的数据,可以每十分钟发送一次数据包到服务器。异常数据(超过指定阈值。比如温度过高,报警信息)和指令回复可立即上报。

    时序数据库存储 来做数据存储,消息队列来消费数据。 进行告警时段统计等信息。
    Curtion
        19
    Curtion  
       2 小时 8 分钟前
    时序数据库直接存问题也不大吧
    ggabc
        20
    ggabc  
       2 小时 3 分钟前 via Android
    缓冲一下分批量写入就行
    bthulu
        21
    bthulu  
       1 小时 59 分钟前
    为啥你们想的这么复杂呢? 就起个服务接收物联网设备请求, 顺序写文件就行了, 什么设备都能满足要求.

    你们 BT 下过小姐姐嘛? 每秒几十 M 都毫无压力, 存储数据这块, 就他这个每秒 2M, 随便搞个树莓派都能做到.

    唯一难点就是, 这每秒 10 万条数据来自几个设备, 如果是 10 万个设备, 那可能确实需要两三千块钱买个 ryzen 5600 级别的主机.

    如果就那么几十个设备, 真的需要花钱吗?
    a33291
        22
    a33291  
       1 小时 55 分钟前
    @bthulu +1 tcp 收先存内存,然后分块落盘,即使 hdd 也至少几十 M 的写入,另外一侧读做业务完事
    只要磁盘够就行
    yunpiao111
        23
    yunpiao111  
       1 小时 54 分钟前
    存的话 怎么样都可以, 存成文件都可以, 你接下来的这部分数据除了保存, 是不是还有读取需求和留存时间要求, 这部分需求也影响选型
    - 如果后期要检索, 最好性能好点+大存储的机器搭一个时序数据库, 或者直接用一个云时序数据库
    - 如果只是留存, 机器选型成数据压缩后转发->云对象存储
    csys
        24
    csys  
       1 小时 53 分钟前
    这种技术方案在遥测领域有很多
    粗看下来我的直觉方案是:
    缓冲(内存+本地),使用 WAL
    批量填入 tsdb
    甚至可以不写入 tsdb ,取决于你有多少传感器,如果是有限数量的话,可以直接写入文件,看使用数据的场景来决定是否需要 parquet+bloom filter
    如果传感器数量很多又是动态的话,可以使用云对象存储来做
    SoulSleep
        25
    SoulSleep  
       1 小时 52 分钟前
    @bthulu #16 “几十块收个几年前的斐讯盒子, 刷机, 把自己的程序放上去就行了.”..................你只考虑 1 秒里发生的事+理论数值,实际情况怕是 10 个斐讯盒子也撑不住
    ————————————————————————————————
    1.10 万/秒+物联网,显然是落库到时序数据库,想要高频那就批量插,持久化之前不要搞太多逻辑,存下来再说处理的事
    2.如果每秒 10 万条===每秒 10 万个请求,那你得瓶颈可能在网络、CPU 上,网络比较传统,大力出奇迹,上高带宽,CPU 低频多核,不行就分布式多台扛。
    内存没太特殊,硬盘现在很多数据库有压缩技术,你这个数据量不大。
    ymz
        26
    ymz  
       1 小时 51 分钟前
    InfluxDB
    ymz
        27
    ymz  
       1 小时 47 分钟前
    @songyoucai 边缘网关是硬件设计好阈值,直接对数据进行清洗后再向服务器上报么
    cus
        28
    cus  
       1 小时 44 分钟前 via iPhone
    这个 10w/s 是多少设备呢
    cat007
        29
    cat007  
       1 小时 41 分钟前
    1, 用什么数据库,如何高频插入 ?用 iotdb ,10w/s 才是这个数据库的起步
    2, 服务器选什么样的配置,来配合数据插入。CPU ,内存,硬盘需要多大? 10w/s 级别官方推荐 2-4 核就可以,具体看官网资源规划
    链接 https://iotdb.apache.org/zh/
    Jinnrry
        30
    Jinnrry  
       1 小时 41 分钟前
    kafka 接受数据
    ck 或者 sr 存数据
    minoic
        31
    minoic  
       1 小时 37 分钟前
    时序数据库,例如 InfluxDB
    qiyilai
        32
    qiyilai  
       1 小时 36 分钟前   ❤️ 1
    @hxzhouh1 得花钱买企业版的,要不然一言难尽
    morota
        33
    morota  
    OP
       1 小时 36 分钟前
    设备倒是不多,大概 50 个,每个发送 2000 条。但是这是最初的一个数据量,后续设备会持续增加。
    看了大家的回复,总结一下大概是:
    1 ,直接写到文件里
    2 ,存到时序数据库里

    写到文件里岂不是要出现非常多的文件。跟 BT 下小姐姐一样的技术,感觉难度更大,更不好搞。
    还是倾向于写到时序数据库里

    那么问题焦点就是内存和带宽需要很大吗,需要分布式吗?
    nanrenlei
        34
    nanrenlei  
       1 小时 35 分钟前
    这玩意要结合具体业务场景具体分析的,比如这些数据是要永久存储还是消费完就不用了,还有实效性,如果用一次就不用了可以不用数据库,如果实效性不要求特别及时的话可以上消息队列,如果要永久存的话可以使用 InfluxDB 、hbase ,mongo 和 mysql 就不建议用了,这么大的数据量查询都是个问题
    Plutooo
        35
    Plutooo  
       1 小时 34 分钟前
    消息队列异步消费+1
    网传 kafka 吞吐能 17w ,rocketmq 能 11w ,感觉完全没啥问题
    wkong
        36
    wkong  
       1 小时 33 分钟前
    WAL ,直接写文件
    Outer2048
        37
    Outer2048  
       1 小时 31 分钟前
    先放到 kafka ,只要硬盘够大,每秒 10w 问题不大
    问题是一天 8,640,000,000 数据量,mysql 肯定是不行了,请楼下的懂王解答
    lqw3030
        38
    lqw3030  
       1 小时 30 分钟前
    把数据处理(聚合、筛选)前置,就像楼上老哥提到的边缘设备处理
    songyoucai
        39
    songyoucai  
       1 小时 28 分钟前
    @ymz 对的,这只是他众多功能中的一种。
    a67793581
        40
    a67793581  
       1 小时 28 分钟前
    @songyoucai 感谢分享,有一个细节,是请求过来直接丢时序数据库吗? 还是先丢消息队列,然后就是消息队列具体要多大才能扛住这个量级 没有计算过
    meeop
        41
    meeop  
       1 小时 27 分钟前
    简单啊,你搞 10w 个服务器负载均衡,每个服务器就只需要 1qps 的存储了,随便搞
    wulili
        42
    wulili  
       1 小时 27 分钟前   ❤️ 1
    看似很多,也就每秒 2mb 左右的数据量,内存能有什么压力,都先丢内存里,把数据整合一下,再慢慢插入数据库或者写入文件都可以吧。
    jimrok
        43
    jimrok  
       1 小时 26 分钟前
    先用日志方式收数据,多台服务器的磁盘写入肯定能保证,放入数据库你要考虑好,单节点吞吐量肯定不够,需要一个群集才能吃下这些数据,还需要分片存储。每个设备你要知道存在那个库,哪个表里,还需要一套元数据管理服务。
    ming159
        44
    ming159  
       1 小时 24 分钟前
    假设一条消息 1KB. 10W 条 约 100MB 数据.
    在这个基础上留出一定的余量, 比如 就按 200MB 算. 关键是 2 处 IO 瓶颈.
    1. 你的服务器 SSD 硬盘每秒写入速度是多少?
    2. 带宽是多少?

    剩下的,写个简单的测试程序,先直接内存生成 200MB 假数据, 循环往测试服务器写. 你会发现,貌似一台单机基本就没压力.
    剩下的就是看你们团队技术偏好,数据增长规模多少,来选合适的数据库就行了. 一台不行 2 台.
    songyoucai
        45
    songyoucai  
       1 小时 22 分钟前
    @a67793581 看你具体需求,一般都是先丢进消息队列,然后时序数据库去消费, 在消费的时候,根据具体的业务逻辑来格式化数据。消息队列只管生产和消费,时序数据库要管查询、计算,统计。
    everhythm
        46
    everhythm  
       1 小时 10 分钟前
    真实需求真的是这样么……相当于 10w 人在线的实时联网游戏了

    首先每秒 10w 条,是不是一定分开 10w 条请求,不是的话考虑合并上报,楼上也说了每几分钟合并成文件上传,即合并数据的空间或时间

    然后这个高频插入,是插入之后需要实时查询么,不实时那慢慢屯到 MQ 慢慢消化也行?数据插入后如何使用会影响你的设计
    MagicLi
        47
    MagicLi  
       1 小时 5 分钟前
    @morota #10 你这个带宽估计太粗糙了,如果是 4G 的话,稍微留一点余量。
    a67793581
        48
    a67793581  
       1 小时 5 分钟前
    @songyoucai 嗯 目前公司用的是 kafka + flink + hive
    pkoukk
        49
    pkoukk  
       1 小时 3 分钟前
    楼上都在说啥啊,物联网数据,5 个 int ,这不就是标准时序数据库么? 10W 在时序数据库里算个锤子多
    市面上流行的时序数据库都支持百万级写入
    sampeng
        50
    sampeng  
       1 小时 1 分钟前 via iPhone
    就一句,和技术无关。无论如何先落盘。再消费到系统里面做业务存储。不然有锅都没地儿甩。存储随便,这点 metric 数据你是看不起谁呢…
    ytmsdy
        51
    ytmsdy  
       1 小时 0 分钟前
    kafka+ InfluxDB
    pkoukk
        52
    pkoukk  
       59 分钟前
    @Plutooo 消息队列的吞吐能力影响因素太多了,首先是集群数量和机器配置。
    然后各种队列配置也影响很大,Retention 策略,Hash 策略,是否压缩等等等等
    fengemma9
        53
    fengemma9  
       59 分钟前
    付费数据库适合你
    morota
        54
    morota  
    OP
       50 分钟前
    @pkoukk 直接往里面插入吗?每秒都插入?
    Plutooo
        55
    Plutooo  
       49 分钟前
    @pkoukk #52 我记得这个吞吐量说的都是单机情况
    JungleZZ
        56
    JungleZZ  
       47 分钟前
    有个疑问,这些数据是直接落库使用的吗?我也是做物联网的,我们设备的数据都是转到 rocketmq 供下游服务消费后了处理了之后才存表的。举例:计算设备每天的运行时间,那肯定得是第二天统计了头天的数据然后存表。就算是大量的数据要落库,你也可以考虑下他们是否要求实时性,如果不是,那就丢队列慢慢消费。
    pkxutao
        57
    pkxutao  
       45 分钟前
    @rockxsj #4 请教下,为什么不能直接入 kafka ,需要先落到本地文件的原因是什么?
    fuis
        58
    fuis  
       44 分钟前
    直接三板斧搞定:Kafka ,Redis ,MySQL 。数据来了之后先存到 mq 里慢慢消费
    reatang
        59
    reatang  
       41 分钟前
    可不可以在开头过滤一些无所谓的数据,手工降频
    pkxutao
        60
    pkxutao  
       41 分钟前
    @bthulu #21 请问写文件的话,怎么做逻辑查询呢?
    xuanbg
        61
    xuanbg  
       40 分钟前
    看你这个 10 万/秒是浪涌还是持续性的。浪涌的一般丢消息队列削峰,后面正常入库就完了。持续性 10 万每秒,那就只能上负载均衡+数据库集群了。单数据库无论如何扛不住 10 万/秒的写入。
    ptaooo
        62
    ptaooo  
       36 分钟前
    应该算是典型的时序数据吧
    国外的 influxDB
    国内的 TDengine
    应该都可以满足了
    ala2008
        63
    ala2008  
       35 分钟前
    一定避免直接写数据库,存在瓶颈
    me1onsoda
        64
    me1onsoda  
       34 分钟前
    seriously ? 60*60*24*100000 不算增量一天就是 9 位数的存储,真的有必要每条消息都要存储吗
    sss15
        65
    sss15  
       13 分钟前
    @pkxutao #60 写文件就是把消息先存下来,类似丢进消息队列,后续还要实现消费的逻辑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5283 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:44 · PVG 11:44 · LAX 19:44 · JFK 22:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.