求友们帮助,大量 GPS 轨迹数据利用 MongoDB 数据库如何存储呢(SpringBoot+ MongoDB)

284 天前
 Allenxup

有大约 500 辆车 每辆车绑定 1 台 GPS 有线设备,每天大概运行 16 小时 运动状态下每 10 秒上报 1 条 gps 数据,静止状态下每 5 分钟上报 1 条。数据对接的是第三方 GPS 平台。

需求 1:需要实时同步轨迹数据到自己 MongoDB 库中,目前第三方可进行推送数据,我方只需要提供 http 接收接口。 现在问题是只要数据接收接口挂了,就无法接收到数据了,要如何保证数据不丢失呢

需求 2:在大量 GPS 数据情况下如何利用 MongoDB 如何存储呢,需要实现的功能:轨迹查询、区域查车、查询所有车辆当前位置。表结构改怎么设计比较合理呢?

3347 次点击
所在节点    程序员
47 条回复
opengps
284 天前
这也不多,我曾经在关系型里都能存到几十亿条,你这非关系型问题更不大了
有一点需要调整:查询最新位置没必要进入历史表,用缓存或者单独一个表去更新存储最新即可。
serafin
284 天前
最多平均每秒 50 条,极端情况每 10 秒同时来 500 条。用 .txt 都行吧。MongoDB 随便怎么都行吧。问题是 http 协议不适合干这个吧。这个体量 http 也不是不行。
lzd123
284 天前
针对需求 1 ,建议搞个网关服务用于专门对接数据,可高可用设计;
数据流: http 接口-》网关服务:接收到轨迹数据简单处理-〉消息中间件(如 mq )-》相关服务再消费入库
Allenxup
284 天前
@opengps 感谢您的解答。你的意思是 MongoDB 一个集合存所有的设备轨迹数据嘛?如果达到几十亿条查询轨迹速度咋样,
最新位置存表里那不是要频繁更新吗
dreasky
284 天前
MongoDB 不是有专门存储地理空间数据的类型吗
yoyoluck
284 天前
这种数据时序数据库是不是更合适, 像 influxdb 这样的
liprais
284 天前
api -> kafka -> mongodb 完事
leloext
284 天前
同 6 楼,这种处理带时间标签的数据是时序数据库更合适。
vincent7245
284 天前
1 直接用 nginx 收,打日志到本地,nginx 也可以做多台保证高可用,反正只要收到的数据都打到日志了,数据不可能丢。后面你怎么处理都随便了,日志传到 kafka ,还是直接读都行,看你们架构怎么设计了。

2 暂时没什么建议,对 mongo 不熟
xwayway
284 天前
恰巧做过车辆网云平台,之前采取的是 gateway -> kafka ,存储用的是 hbase ,mongodb 只存最新的数据。
hbase 用 vin+timestamp 做 rowkey 。
其他更多的细节记不太清了,六七年前做的了。
fishg
284 天前
其实有如果目标定了是 MongoDB ,可以在预期量级下模拟测试下
xwayway
284 天前
@xwayway 涉及到你说的区域查车和当前位置直接从 mongo 查询应该就能满足,轨迹查询应该也是单台车的吧,这个时候去 hbase 查就行了。
opengps
284 天前
@Allenxup 历史轨迹单独存,这张表很大,但用途非常单一,仅仅用于需要使用历史数据的场景,结构也足够简单,仅仅支持单设备特定时间查询,仅仅支持写入效率,就已经足够了
nosql 的我没写,参考下我之前关系型结构的博客: https://www.opengps.cn/Blog/View.aspx?id=284
3kkkk
284 天前
需求 1:直接网关+分布式 api+mq+mongodb ;
需求 2:建议分三个集合吧,最新车辆基本信息及最新位置信息、历史轨迹(可以把数据定期归档主要用来撕逼)、轨迹数据。至于三个需求:
第一个看轨迹数据具体需求是否需要筛选你这么多数据加载到前端也不好处理,确认轨迹查询具体规则在 mq 处理的时侯可以直接筛选下重复数据生成一个车辆轨迹相关的文档。
第二和第三个直接查询最新位置信息就可以,
BurgerTown
284 天前
1. 换 MQTT 感觉 IoT 场景用 MQTT 的挺多的吧
2.这个的话 MongoDB 是有针对时序数据的 collection 做单独优化的 但是具体性能位置
然后你要的那几个查询 MongoDB 都有原生的查询函数 起码你代码写起来很简单
lsk569937453
283 天前
1.现在问题是只要数据接收接口挂了,就无法接收到数据了,要如何保证数据不丢失呢?

这个接口原来直接写 mongoDB 的话,改为写 kafka ,然后开异步线程从 kafka 消费写入 MongoDB 。

2.我记得 MongoDB 在大数据量下性能不咋地。每天大概新增 500*16*36(每小时)=83W 数据。每月大概是 2000w 新增。这种数据量我也建议上 Hbase 。只不过 Hbase 的话查询有限制,不能像关系型数据一样查询。
hopingtop
283 天前
我提供一个 Mongodb 写数据性能的实际体验吧。
之前写了一个小的日志收集,提供的 gRPC 传输,2c4g 的 Mgo ,一天至少写 2-3 千万的数据,但是这个是多集合写。
分担到单集合有些峰值差不多在 5-7 百万数据,CPU 使用波动幅度很小,是因为做了集合分片的。

你的需求就用 mongo ,随便用,本身他也支持 GPS 的查询。 实在担心,自己 router 做一个集合分片即可。
没必要使用 mongodb 自带的 Sharding ,运维成本又上去了。

再回到你说的数据不丢失,这已经有很多成熟的解决方案了,匹配自己的技术栈和架构,找最简单的就行,如果发送端有最基本的重试,那么加一个 gateway 就是最实在的!
hopingtop
283 天前
@hopingtop #17 再补一个查询体验,只要时间范围做好,命中索引 不长的复合索引,根据日志的查询感官来说,单集合 5000W 数据,可以做到 秒级返回。
roundgis
283 天前
存儲不用特別考慮 一條記錄一個軌跡點即可

我以前用 mongodb 2.x 版本做過車隊管理 2000 台車一個實例 單表幾十億數據不成問題
Desdemor
283 天前
用 ck 吧,查的快

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/961002

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX