迫于没思路,如何用较少内存做到将一个数据库表采集成文件 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
pusidun
V2EX    程序员

迫于没思路,如何用较少内存做到将一个数据库表采集成文件

  •  
  •   pusidun
    pusidun 2018-12-08 16:15:53 +08:00 2922 次点击
    这是一个创建于 2529 天前的主题,其中的信息可能已经有所发展或是发生改变。
    工作的业务场景里面想到的。
    一张亿级记录数的表,有一个时间戳字段 timestamp 以及若干其他字段。这张表每隔 5 分钟更新,插入新的纪录,并删除上上个粒度数据。比如 9 点更新该时刻数据的时候,删除 timestamp 8:50 的数据,同时保证 9 点 5 分前数据更新完毕。
    要求在 9 点 10 分前用较少的内存将 9 点的数据采集成文件。不考虑读数据库和磁盘 io 时间,只允许使用这一个数据库。程序可以分布式,数据库只可查询

    我想法是把表按主键取模进行水平拆分,按照拆分个数 n 在 n 台主机采集,最后丢进 mq 队列,一台机器上把 n 个文件拼成一个。
    没搞过相关业务的经验,原来搞这个模块的人跑路了,所以现在没个讨论的。
    有经验有想法的,欢迎给个思考方向,谢谢
    12 条回复    2018-12-09 19:08:24 +08:00
    sagaxu
        1
    sagaxu  
       2018-12-08 18:29:59 +08:00 via Android
    每 5 分钟更新 1 亿条? 9 点是做个 snapshot 还是只采集更新部分?
    pusidun
        2
    pusidun  
    OP
       2018-12-08 21:09:54 +08:00
    @sagaxu 9 点开始更新时间戳是 9 点的数据,在 9 点 05 分更新结束。这部分数据会在 9 点 05 分到 9 点 10 分由程序采集。更新和采集是错开来的
    sagaxu
        3
    sagaxu  
       2018-12-08 21:50:41 +08:00 via Android
    @pusidun 时间戳是 9 点的数据预估是多少条呢?几千条和几百万条,设计是完全不同的,如果每隔 5 分钟就把亿级数据全量刷新一遍,又是完全不同的要求了
    yfl168648
        4
    yfl168648  
       2018-12-08 22:28:01 +08:00
    不清楚是增量还是全量采集。如果是全量,很多问题就出现了。拍快照行不行~
    reus
        5
    reus  
       2018-12-08 23:15:09 +08:00
    这个和内存有啥关系?读一行就写一行,又不是说全部读入内存才能写文件
    vitoliu
        6
    vitoliu  
       2018-12-09 01:21:28 +08:00
    我理解这种数据存储类似于时间序列吧,考虑一下 HBase?用 MySQL 的话感觉比较麻烦...
    pusidun
        7
    pusidun  
    OP
       2018-12-09 10:26:03 +08:00
    @sagaxu 一个时间戳数据大概千万条

    @yfl168648 全量采集最新的时间戳数据就行了

    @reus 那查询 sql 咋写?每一行一个 sql 数据库吃得消吗= =
    reus
        8
    reus  
       2018-12-09 11:29:20 +08:00
    @pusidun ……谁说一行一个 sql。主流数据库都支持 cursor,一次查询如果返回多行,可以一行一行取回,处理完再读下一行,这样不会占用多少内存。
    C2G
        9
    C2G  
       2018-12-09 11:35:49 +08:00 via Android
    虫群?
    ----------
    #8 的思路应该是可行的。
    跑路的话问人事要一下之前那个人的电话 /邮箱,私下沟通一下
    sagaxu
        10
    sagaxu  
       2018-12-09 12:22:49 +08:00 via Android
    @pusidun 似乎是在做设备监控,db 只保留当前状态,历史状态归档到文件。

    如果是这种需求,应该把 db 拿掉,一分钟 200 万个更新,得按照每秒 5 万次写入来设计,db 的压力是巨大的。

    可以考虑直接写到 mq,一个消费者负责 update 到 redis,另一个消费者负责聚合成文件。mq,redis,消费者都可以按需做 HA 或者 LB。
    winglight2016
        11
    winglight2016  
       2018-12-09 16:07:41 +08:00
    log 类型的数据,考虑一下 ELK 吧
    nekoneko
        12
    nekoneko  
       2018-12-09 19:08:24 +08:00
    为什么不在拿到数据的时候就写成文件并放进数据库呢,到了另一个时间段直接从数据库删除之前的数据不行吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5558 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 03:23 PVG 11:23 LAX 19:23 JFK 22:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86