求友们帮助,每天亿级数据怎么储存 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rapperx2
V2EX    问与答

求友们帮助,每天亿级数据怎么储存

  •  2
     
  •   rapperx2 2020-05-27 09:06:19 +08:00 8799 次点击
    这是一个创建于 1966 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目是 GPS 业务,每天有约 2w+台车传数据到我们这里储存。每天数据量大概在 1 亿左右。

    数据主要用于做报表,查询历史轨迹(查询频率高,基本上每次查出过万的数据)

    没做过这么大数据量的业务场景,想问下这场景应该怎么做?感谢

    51 条回复    2023-03-01 16:12:11 +08:00
    tanranran
        1
    tanranran  
       2020-05-27 09:18:17 +08:00
    如果查询条件复杂,且有文本查询,那就 Hbase + ElasticSearch ;如果用云产品,那就是阿里云的 OTS + OpenSearch
    cominghome
        2
    cominghome  
       2020-05-27 09:24:33 +08:00
    没做过这种业务,不过可以说下看法。

    2w 台车,数据量一亿,那看来单位是请求数? 给你往大了说,一个请求按 10 KB 算, 算下来一天也就 1T 左右,正常的大数据仓库都能 hold 住的吧
    shadowyue
        3
    shadowyue  
       2020-05-27 09:32:12 +08:00
    有接触过相关业务,量应该没你这么大,5k-1w 量车,mongodb 就 hold 住
    xman99
        4
    xman99  
       2020-05-27 09:33:26 +08:00
    考虑下 新的分布式数据库? tidb 、hbase 等超大型分布式数据库吧
    daozhihun
        5
    daozhihun  
       2020-05-27 09:34:15 +08:00
    你这个很适合 hbase
    HEROic
        6
    HEROic  
       2020-05-27 09:34:37 +08:00 via Android   1
    hbase+es 吧,hbase 用时间年月划分 region,es 按天建索引
    HEROic
        7
    HEROic  
       2020-05-27 09:36:45 +08:00 via Android
    单纯的过车数据大概就 2KB 左右,一天就 200G
    tolerance
        8
    tolerance  
       2020-05-27 09:42:53 +08:00
    时序数据库考虑一下
    micean
        9
    micean  
       2020-05-27 09:44:00 +08:00
    没做过大数据业务的话就按一般情况考虑吧
    每台车每天发 5 千条,平均不到 1 秒一条。
    不代表每条都要存储吧,地图上也不需要展示这么精细
    可以 15 秒以上存一次,这样数量级就降到百万级以下了
    rockyou12
        10
    rockyou12  
       2020-05-27 09:52:47 +08:00
    你这该用各种时序数据库,hbase 不是特别好。优先考虑 influxdb 这类的吧
    lianglianglee
        11
    lianglianglee  
       2020-05-27 09:54:08 +08:00 via Android
    这种场景多适合时序数据库啊
    ychost
        12
    ychost  
       2020-05-27 09:59:58 +08:00
    时序数据库 InfluxDB +1,特别适合做 IOT 数据存储,再配合 grafana 美滋滋,谁用谁知道
    rrfeng
        13
    rrfeng  
       2020-05-27 10:00:14 +08:00
    看数据结构,只说数据量就是耍流氓啊。
    wellsc
        14
    wellsc  
       2020-05-27 10:03:28 +08:00
    时序数据库+1
    irockman
        15
    irockman  
       2020-05-27 10:43:25 +08:00
    传统数据库 mysql:一台车一张表,按 gps 每十秒上报一条数据,一年数据量 6*60*24*365=3153600 条数据,单表查询压力不大。或者选择时序数据库 influxdb,不过集群方案收费。
    alienx717
        16
    alienx717  
       2020-05-27 11:40:04 +08:00
    大众的车联网项目自己都用的 HBASE
    你可以参考以下。
    另外,非得每 10 秒钟一条么,我记得 15 秒一条也可以吧,应该能少不少数据
    WhoMercy
        17
    WhoMercy  
       2020-05-27 12:44:00 +08:00
    冷热分离,多级缓存,数据预聚合,Data Partition/Sharding,DDB ( Distributed DB )...

    具体怎么实施看情况而定,一方面看已有痛点在哪,一方面估计会有的瓶颈,一方面平衡开发的复杂度
    soulzz
        18
    soulzz  
       2020-05-27 15:18:51 +08:00   3
    同行啊 我这公司有好几个同类型平台,我待的这个平台设备量 30W+
    用的 MongoDb 轻轻松松
    一天设备上报的报文一亿多条,设备实时状态一定不要存数据库,放缓存中间件,不然后期真的改不动
    轨迹的话按天分表,超过几个月的轨迹定期移到另一个空间大的冷存储(机械盘之类
    原始报文只保存几天,接收上报的模块一定不要有存库操作,数据库挂掉会导致大量 TCP CLOSE_WAIT
    建议接收上报的模块把原始报文发 kafka ,再由消费者存到另一个原始报文库
    只要解耦解的好,并不需要用到时序数据库
    用时序数据库会存在的问题在于设备可能定位漂移,或者突然报了一个有问题的包,这个时候再去时序数据库里修改它就非常困难了,这也是我们这没有采用时序数据库的原因
    jwdstefani
        19
    jwdstefani  
       2020-05-27 16:11:33 +08:00
    我们之前的车贷 GPS 监控系统,一台车接了 3 个厂商的 GPS,也是用的 MongoDB,数据只保留一个月的,数据量也是大的一批,就是轨迹查询的时候吃内存
    tolbkni
        20
    tolbkni  
       2020-05-27 16:18:24 +08:00
    结构化数据只新增不更新的场景可以用 ClickHouse 数据库
    dkerss
        21
    dkerss  
       2020-05-27 16:29:05 +08:00
    推荐 ClickHouse 神器!
    rapperx2
        span class="no">22
    rapperx2  
    OP
       2020-05-27 16:42:05 +08:00
    @soulzz 大佬啊。哈哈,能加个 V 交流学习下吗?
    soulzz
        23
    soulzz  
       2020-05-27 17:44:18 +08:00
    @rapperx2 不是大佬,架子别人搭的,我在这天天修修补补
    Magic347
        24
    Magic347  
       2020-05-27 17:46:56 +08:00
    hive?
    yjhatfdu2
        25
    yjhatfdu2  
       2020-05-27 17:48:54 +08:00   1
    这个场景,clickhouse 使用 mergetree 引擎,根据日期做分区,车辆 ID,timestamp 排序,clickhouse 对于 float 类型时序数据也有类似时序数据库的 Gorilla codec,有效压缩时序浮点数据。clickhouse 本身的话,支持分布式、高可用,支持 SQL (部分),可以用 http 接口直接访问,使用难度很低。性能的话,我们做过一些测试,单节点 64 核 epyc2+256G 内存,单表 15 亿行 20 多列的纽约出租车数据,单个全表级的 group by+sum 大概 200ms 左右,多个维度的 group by+多个聚合能在 700ms 内完成,基本上是现在分析库的上限了。https://clickhouse.tech/docs/en/getting-started/example-datasets/nyc-taxi/
    yjhatfdu2
        26
    yjhatfdu2  
       2020-05-27 17:50:30 +08:00
    @yjhatfdu2 比 hive 或者 HBase+mr/spark 之类的的方案大概也就快几百倍把
    yjhatfdu2
        27
    yjhatfdu2  
       2020-05-27 17:52:51 +08:00
    顺便,现在如果是少量数据的 update,clickhouse 可以使用 mutations 完美完成,如果量大的话,可以用 collaspemergetree 引擎,变相实现标记删除并且不影响查询结果
    ahmcsxcc
        28
    ahmcsxcc  
       2020-05-27 17:55:39 +08:00
    同 clickhouse
    yjhatfdu2
        29
    yjhatfdu2  
       2020-05-27 20:06:48 +08:00   1
    @rapperx2 我还真造了点数据来测试一下 clickhouse 。
    表结构:
    create table ts_test
    (
    ts DateTime64 CODEC(DoubleDelta),
    car_id Int32,
    lat Float32 CODEC(Gorilla),
    log Float32 CODEC(Gorilla),
    dir Float32 CODEC(Gorilla)
    ) engine MergeTree() order by (car_id, ts) partition by toDate(ts);
    其中,方向 dir 平均 100s 随机刷新,速度 0-100 之间随机,ts 的间隔 1s±100ms 并加入随机抖动,20000 辆车,每辆车起始位置随机,然后模拟每辆车运动,生成 csv 数据导入 clickhouse 。共使用了 20 分钟导入了 983725233(9.8 亿)行数据,占用硬盘空间 9.45 GiB,大概每 1 亿行 1G 。
    然后测试了一些简单的查询。
    Q1: 查询某个车的完整轨迹: select * from ts_test where car_id=1;
    行数和耗时:49187 rows in set. Elapsed: 0.041 sec.
    Q2: 查询表总行数: select count(*) from ts_test;
    行数和耗时:1 rows in set. Elapsed: 0.001 sec. (估计缓存了)
    Q3: 查询每辆车的数据点数量: select car_id,count(*) from ts_test group by car_id;
    行数和耗时:20000 rows in set. Elapsed: 0.129 sec.
    Q4: 查询每辆车的活动范围(矩形):select car_id,min(lat),max(lat),min(log),max(log) from ts_test group by car_id;
    行数和耗时:20000 rows in set. Elapsed: 0.568 sec.
    Q5: 查询一辆车的活动范围(矩形):select min(lat),max(lat),min(log),max(log) from ts_test where car_id=100;
    行数和耗时:1 rows in set. Elapsed: 0.003 sec.
    Q6: 查询每小时的数据点(每小时约 7200w )数量: select count(*),toYYYYMMDD(ts)+toHour(ts) as hour from ts_test group by hour;
    行数和耗时:14 rows in set. Elapsed: 0.347 sec.

    测试硬件:单机 AMD EPYC 7702P 64-Core Processor 64 核,256G 内存,SSD
    希望对楼主有帮助
    gainsurier
        30
    gainsurier  
       2020-05-27 22:48:47 +08:00 via Android
    歪个楼问下,为啥车每天要传那么对数据回来
    calpiswater
        31
    calpiswater  
       2020-05-27 22:54:18 +08:00 via iPhone
    可以考虑下清华的 IoTDB
    likuku
        32
    likuku  
       2020-05-27 23:08:12 +08:00
    aws s3,还有啥存不了的?

    直接进大数据服务 EMR,要么数据湖,简单查询,直接来 Athena 查 s3 也没问题啊

    实时处理分析? aws 有 kinesis 啊,各种并行实时处理,本来就是很适合搭配 IoT / GPS 业务场景的

    非实时分析,还有 redshift 数据仓库服务可以用,更可以联合查询,操作型关系数据库。
    跨一个或多个 Amazon RDS 和 Aurora PostgreSQL 数据库查询实时数据,支持大规模并行数据处理。

    有兴趣欢迎继续交流~
    wd
        33
    wd  
       2020-05-28 07:43:00 +08:00 via iPhone
    @gainsurier #30 一般都会认为,数据就是钱呀,越多的数据越多的钱。每天几亿出去和投资人好吹牛逼。
    rapperx2
        34
    rapperx2  
    OP
       2020-05-28 08:39:08 +08:00
    @yjhatfdu2 非常感谢大佬这么上心帮我,太感谢了,连性能测试都给我举例出来了。我现在还需要学习下 clickhouse 。从来没用过。
    感觉这个方案不错,先参考你这个方案吧
    rapperx2
        35
    rapperx2  
    OP
       2020-05-28 08:40:57 +08:00
    @gainsurier 因为我们需要对车进行实时监控和历史轨迹回放。还要做一些报表之类的。
    cqdx02
        36
    cqdx02  
       2020-05-28 08:53:55 +08:00
    @yjhatfdu2 能否进行数据聚合呢,比如按分钟级,15 分钟级统计数据
    rockcat
        37
    rockcat  
       2020-05-28 09:29:58 +08:00
    ClickHouse 或者 Green Plum 。
    0987363
        38
    0987363  
       2020-05-28 09:35:27 +08:00 via Android
    @soulzz 状态不存数据库的话,那要用状态排序岂不是凉
    yjhatfdu2
        39
    yjhatfdu2  
       2020-05-28 10:05:43 +08:00
    @cqdx02 当然可以,group by 就可以,看上面的 Q6,使用对应的函数对时间进行处理就行
    yjhatfdu2
        40
    yjhatfdu2  
       2020-05-28 10:09:30 +08:00
    @rapperx2 对了,时间戳精度要求不高的话,可以用不需要用 DateTime64,可以 DateTime (精确到秒),经度维度可以用 UInt32 CODEC(DoubleDelta),方向不需要的话可以不存,这样估计还能小一倍,也能快一些。
    soulzz
        41
    soulzz  
       2020-05-28 10:13:02 +08:00
    @0987363 这个要看应用场景,实时状态存库的话数据库压力非常高
    caotian
        42
    caotian  
       2020-05-28 12:46:32 +08:00
    TDEngine
    chinvo
        43
    chinvo  
       2020-05-28 12:53:34 +08:00 via iPhone
    TimescalaDB
    rapperx2
        44
    rapperx2  
    OP
       2020-05-29 11:14:27 +08:00
    @yjhatfdu2 我根据车牌 查询时间范围一个月的数据

    58516 rows in set. Elapsed: 19.415 sec. Processed 23.93 million rows, 2.17 GB (1.23 million rows/s., 111.70 MB/s.)

    这个查询时间属于正常的吗?
    yjhatfdu2
        45
    yjhatfdu2  
       2020-05-29 11:38:16 +08:00
    @rapperx2 不正常,方便看一下表定义和查询嘛?
    yjhatfdu2
        46
    yjhatfdu2  
       2020-05-29 11:42:14 +08:00
    @rapperx2 渐变语句要加上 oder by(车牌,时间),我怀疑你这边是直接按照日期排序了,这样找一辆车的数据也要扫全表,然后数据类型建议也再看一下车牌最好用个足够小的 int 作为,再建一张表用来存车牌和 ID 的映射,查询时使用 join,这样能显著减少查询的数据量( 2300w 行就 2.17GB 太大了),数据结构越高效性能越高
    rapperx2
        47
    rapperx2  
    OP
       2020-05-29 11:50:57 +08:00
    @yjhatfdu2 能方便加个 V 吗?
    yjhatfdu2
        48
    yjhatfdu2  
       2020-05-29 12:03:26 +08:00
    @rapperx2 qq 吧,base64:MjUxNjUwMjky
    Huayx9
        49
    Huayx9  
       2021-01-15 16:34:19 +08:00
    @rapperx2 请问最后你选用了什么技术方案,方便加个 v 么,我的 vx 是 base64:Zm9yX215Xzc3
    rapperx2
        50
    rapperx2  
    OP
       2021-01-18 09:01:27 +08:00
    @Huayx9 加你了
    raywong
        51
    raywong  
       2023-03-01 16:12:11 +08:00
    楼主后续选了什么方案,遇到相似的场景,方便加个 qq 么。base64: MTU1MjkzNzAwMA==
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     903 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 21:22 PVG 05:22 LAX 14:22 JFK 17:22
    Do have faith in what you're doing.
    ubao 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