热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大疆车载从多家数据库中选定TDengine

大疆车载从多家数据库中选定TDengine-小T导读:为了满足智能驾驶业务的数据处理需求,大疆车载试图从多家数据库中进行选型调研,帮助智能驾驶业务提升写入查询性能、降低运维成本。本
小 T 导读:为了满足智能驾驶业务的数据处理需求,大疆车载试图从多家数据库中进行选型调研,帮助智能驾驶业务提升写入查询性能、降低运维成本。本文将分享大疆车载在数据库选型、系统搭建和业务迁移等方面的经验。

根据国家发改委、科技部、工信部等 11 个部门联合印发的《智能汽车创新发展战略》,到 2025 年,中国标准智能汽车的技术创新、产业生态、基础设施、法规标准、产品监管和网络安全体系基本形成。同时,实现有条件智能驾驶的智能汽车达到规模化生产,实现高度智能驾驶的智能汽车在特定环境下市场化应用。目前,随着我国正在积极发展智能网联汽车,无人驾驶技术进一步推动,互联网巨头企业进入市场、加大投入研发技术,无人驾驶市场正处于快速发展阶段。无人机头部企业大疆车载也在去年 4 月份宣布进入智能驾驶领域。

由于当前的智能驾驶业务还是新的业务场景,所以大疆车载在选型上的历史负担相对较轻。在 Database 选型要求上,从业务需求出发,主要聚焦在两点:首先,结合当下的业务场景,需要满足单台车辆的高频消息上报频率;其次,支持在数据量大的时候,通过聚合函数,或选择函数来快速筛选出需要的数据。

此外,对数据库要求支持集群部署的同时,也要求更低的查询语句编写上手难度;而且需支持单表千万量级,在海量数据并发场景下,需要有较高的统计报表能力和较好的查询 SQL 效率;最后通过数据压缩、运维成本和并发能力上的考量,最终选定 TDengine 来存储海量数据。

综合来看,TDengine 满足需求的主要原因如下:

  • 国产、开源的时序数据库(Time Series Database)
  • 开源版支持分布式集群,方便扩展
  • 列式存储,数据压缩比率高,读写性能优秀
  • 一个设备一张表,对应我们一个车辆一张表,模型契合
  • 超级表对于分组聚合查询的强大支持能力

TDengine 建表思路

作为智能驾驶领域的创新者之一,大疆车载为汽车主机厂提供了软硬一体的智能驾驶解决方案。其中,车辆云端平台负责对车辆状态信息进行监控,具体包括 GPS、速度、转速、里程等,经由 MQTT 流转到 TDengine 存储,满足车辆历史轨迹回放和车辆实时状态监控。

车辆消息样例数据展示如下:

{"message_id": "a78b6d9a","device_key": "deviceKey2","ts": "2022-03-01 15:01:59","longitude": 123.9795647512915,"latitude": 21.58338210717887,"altitude": 51.47800064086914,"signal_strength": 12,"satellites_in_view": 21,"speed": 72.798225,"acceleration": 12,"rpm":2190,"gear": "D","direction": -91.32959,"mileage": 10020,"ip": "10.1.2.3","create_time": "2022-03-01 15:02:03",}

落脚到实际业务上,我们搭建的表结构如下:

我们落地使用的是 TDengine 2.2.1.3 单机版 ,按照车辆唯一的标识 DeviceKey 来创建子表,如 device_stat_$deviceKey,一个车辆的状态信息都存在一张子表中。mqtt_msg 超级表也是一样的逻辑,也是以 DeviceKey 来创建子表。

架构与迁移

除了上报的 GPS、速度等,App 端还会和车辆/设备之间进行大量的命令交互,如下发车辆指令操作,这些我们也是使用 TDengine 来进行存储和链路追踪的。具体到链路消息追踪的使用上,我们会将设备与云端、云端与 App 之间双向通信的 MQTT 消息转发到 Kafka 消息队列中,然后业务系统进行消费解析,得到 TraceID、消息 ID、消息版本、消息类型、消息时间戳、消息内容等不同字段的数据,然后将其写入 TDengine 的 mqtt_msg 超级表当中。

除了写入以外,我们也有一定量的查询操作,但是整体上还是以写入为主,目前 TDengine 的性能完全可以满足我们的需求。不过文本类的检索并不是 TDengine 最擅长的场景,于是我们接入了 ES 提供部分服务。

由于是项目初期,目前我们暂时还在使用 TDengine 和 MySQL 双写新数据,把 MySQL 的 SQL 和 TDengine 的 SQL 做了映射关系,从而实现将历史数据以日志回放的方式迁移到 TDengine 中去。因此,目前两个库暂时可以互为备份,后面等业务完全迁移后,我们就可以使用 TDengine 的集群多副本功能来完成数据备份了。

此外,涛思数据的工作人员也提供了另外两种数据迁移方案供我们参考:一是利用 csv 文件的导出导入。二则是基于一款开源的数据库迁移工具 DataX,该工具目前已经完成了关系型数据库(Relational Database)到 TDengine 的适配,实现了 TDengineReader 和 TDengineWriter 两个插件,迁移时只要做好相应的 json 文件配置即可。

性能展示

在应用 TDengine 之后,车辆的实时状态查询变得十分简单,具体展示如下:

  1. 查询单个车辆的上报的最新位置状态
select last_row(*) from device_stat_deJgTAEzInsZeGLM\G;

  1. 多个车辆的最新位置状态查询
select last_row(*) from device_stat where device_key in ('mpVOGpaHqAxGiHWo','HEChzTCZeIWSUysB','HgsIdzvJPeFlVDuT','LVaPHOXkEeTGjTpm','PFHnQCkcXCIBnbsC') group by device_key;

对于车辆历史时间区间内的状态查询,也可以极快地返回结果,用以进行前端分析。

select * from device_stat_mpVOGpaHqAxGiHWo where ts >'2022-03-17 00:00:00' and ts <'2022-03-18 00:00:00';

  1. 进行 MQTT 消息追踪时,查询 MQTT Broker 收发的最新消息

select last_row(*) from mqtt_msg\G;

  1. 按照 requestId 进行消息追踪
select * from mqtt_msg where request_id = 'f90c46d4-22a3-4ab9-b50a-aad8b237fc57'\G;

  1. 时间区间内消息查询
select * from mqtt_msg where ts >'2022-03-18 12:00:00' and ts <'2022-03-18 13:00:00';

通过以上的查询情况汇总可以看出,TDengine 实现了一些选择特定数据的查询和轻量的查询,全部都是毫秒级返回数据,即便是 30000+ 行数据的查询,消耗也只在 1.1 秒左右。

写在最后

在当前的云端平台中,TDengine 的应用不仅节约了存储成本和开发学习成本,同时也表现出了很好的写入读取性能,满足了智能驾驶云端平台海量时序数据的处理需求。

未来我们会对海量时空数据的应用场景进行持续探索和挖掘,对于 TDengine 我们也有更多的期许,希望它能:

  • 在空间数据的读写上有新的特性和更好的支持
  • 拥有更加丰富的认证授权机制,提供更细粒度的权限管控
  • 系统性地丰富各类日志,协助更快地定位问题

最后,祝愿 TDengine 越来越好,能够在中国庞大的时序数据处理场景中脱颖而出,成为国产数据库中的精品!


想了解更多 TDengine Database的具体细节,欢迎大家在GitHub上查看相关源代码。


推荐阅读
  • 字节Java高级岗:java开发cpu吃多线程吗
    前言抱着侥幸心理投了字节跳动后台JAVA开发岗,居然收到通知去面试,一面下整个人来都是懵逼的,不知道我对着面试官都说了些啥(捂脸~~)。侥幸一面居然过了,三天后接到二面通知,结果这 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在当今的软件开发领域,分布式技术已成为程序员不可或缺的核心技能之一,尤其在面试中更是考察的重点。无论是小微企业还是大型企业,掌握分布式技术对于提升工作效率和解决实际问题都至关重要。本周的Java架构师实战训练营中,我们深入探讨了Kafka这一高效的分布式消息系统,它不仅支持发布订阅模式,还能在高并发场景下保持高性能和高可靠性。通过实际案例和代码演练,学员们对Kafka的应用有了更加深刻的理解。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • 分布式一致性算法:Paxos 的企业级实战
    一、简介首先我们这个平台是ES专题技术的分享平台,众所周知,ES是一个典型的分布式系统。在工作和学习中,我们可能都已经接触和学习过多种不同的分布式系统了,各 ... [详细]
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • B站服务器故障影响豆瓣评分?别担心,阿里巴巴架构师分享预防策略与技术方案
    13日晚上,在视频观看高峰时段,B站出现了服务器故障,引发网友在各大平台上的广泛吐槽。这一事件导致了连锁反应,大量用户纷纷涌入A站、豆瓣和晋江等平台,给这些网站带来了突如其来的流量压力。为了防止类似问题的发生,阿里巴巴架构师分享了一系列预防策略和技术方案,包括负载均衡、弹性伸缩和容灾备份等措施,以确保系统的稳定性和可靠性。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • Kafka 是由 Apache 软件基金会开发的高性能分布式消息系统,支持高吞吐量的发布和订阅功能,主要使用 Scala 和 Java 编写。本文将深入解析 Kafka 的安装与配置过程,为程序员提供详尽的操作指南,涵盖从环境准备到集群搭建的每一个关键步骤。 ... [详细]
author-avatar
天高云淡-tgyd
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有