中移物联车联网项目,在 TDengine 3.0 的应用

news/2024/4/28 13:43:46/文章来源:https://blog.csdn.net/taos_data/article/details/131518108

小T导读:在中移物联网的智慧出行场景中,需要存储车联网设备的轨迹点,还要支持对车辆轨迹进行查询。为了更好地进行数据处理,他们在 2021 年上线了 TDengine 2.0 版本的 5 节点 3 副本集群。 3.0 发布后,它的众多特性吸引着中移物联网进行了大版本升级。本文详细分享了中移物联网在 3.0 项目的业务实践和全新体验,以此给大家作参考。

关于中移物联网:

中移物联网有限公司是中国移动通信集团有限公司出资成立的全资子公司。公司按照中国移动整体战略布局,围绕“物联网业务服务的支撑者、专用模组和芯片的提供者、物联网专用产品的推动者”的战略定位,专业化运营物联网专用网络,设计生产物联网专用模组和芯片,打造智慧出行、智能家居、智能穿戴等特色产品,开发运营物联网连接管理平台 OneLink 和物联网开放平台 OneNET,推广物联网解决方案,形成了五大方向业务布局和物联网“云-网-边-端 ”全方位的体系架构。

业务背景:

智慧出行是中移物联网的一个非常典型的场景,我们需要存储车联网设备的轨迹点,还要支持对轨迹进行查询。最初我们使用的是 Oracle 小型机单表分区存储数据,运维复杂不便管理。2017 年,响应集团去 IOE 的要求,该项目开始使用 MySQL 集群。2019 年,产品提出了更高的数据存储需求,我们又开始调研国产数据库 TiDB,但由于其存储成本过高,不适合轨迹存储这种低价值的数据,而且不能解决行业客户轨迹数据存储周期定制化的需要,因此我们开始继续调研新的存储方案——国产开源时序数据库 (Time Series Database)TDengine 就是这个时候进入了我们的视野。

在调研中我们发现,智慧出行轨迹数据的特点天然适合 TDengine :

  • 高频写入,每天写入约两亿条轨迹数据;
  • 低频查询,通常是由用户触发,查询最近几天的轨迹;
  • 企业用户有定制轨迹存储周期的需求;
  • 不针对 OLAP 需求,数据价值密度低。

因此,在经历了严谨的选型测试后,我们最终确定选择 TDengine 作为新的数据存储引擎。具体选型过程和项目历史背景可以参考 2.x 版本的案例《存储空间降为原来的1/7,TDengine在中移物联网轨迹数据存储中的应用》。

改造后系统的整体架构如下图所示:

 我们在 2021 年上线 TDengine 的 2.4.0.18 的 5 节点 3 副本集群稳定运行至今。今年 3.0 发布后,它的众多特性十分吸引我们,其中最典型的几个包括:

  1. Raft 协议的引入使 TDengine 拥有了更标准的一致性算法
  2. 存储引擎的重构优化了 2.x 版本的设计
  3. 查询灵活度大幅提升,可实现的需求变得多元化
  4. 支持更强大的流式计算

因此,尽管 2 - 3 版本底层数据文件并不兼容,我们还是自己写了程序把数据迁移到了 3.0.2.5 版本,以至于后面官方正式发布了企业版迁移工具 taosX 的时候,我们早就先走一步了。

3.0 使用体验:

TDengine 3.0 的安装部署上保留了和 2.0 一样的简单易用模式,升级操作只需要备份数据文件目录,覆盖安装即可,而且写入速度极高,接近硬盘的连续写入性能。TDengine 的高效压缩算法,可以节省大量存储空间,SQL 使用也非常简单。在此前对 MySQL 方案的替换中,我们的存储空间降为原来的 1/7,可以看到,在节省存储空间方面,TDengine 的优势极为明显。

目前我们共有 102 万张子表,已经累积的总数据量已经达到了 2000 亿行,3 副本,磁盘占用 3.1TB。在迁移到 TDengine 3.0 之后,各方面的表现依然非常不错:业务的写入峰值达到了 1.2-1.3w 行/s ,数据迁移的过程中可以达到 20w 行/s,这些情况下 TDengine 都可以轻松处理;存储大约只有 MySQL 的 1/7;读取数据性能也很突出,我们最常用的单设备单日查询,可以在 0.1s 内返回结果。

我们当前使用的是 3.0.2.5 版本,但是由于业务本身不允许停机,所以没办法做离线升级。因此,后续会由 TDengine 企业版团队协助我们在线升级至最新版本(当前最新版本为 3.0.5.1)。

建模设计:

在库表设计上,我们运用了自动建表来写入数据,每个终端设备产生的轨迹点位数据在第一次入库的时候自动创建子表,这样只需要建一个 database 和业务需求的超级表就可以了,省掉了数据入库时的校验和建表操作。

值得一提的是,在 2.x 时代,元数据是在管理节点上集中存储的,因此在当时的版本中,自动建表的速度会受到单线程工作能力的制约,当时大概最高每秒只能创建 6000 个子表左右,不过当时我们也没有这么高的建表频率所以也没有受到太大影响。经过重构之后,3.0 的元数据已经完全做到了分布式存储,所有 vnode 都会独立存储自己表的元数据并处理写入操作,所以自动建表的写入效率已经大幅增加。

我们的超级表建表语句如下,可以给大家参考:

1.车辆历史状态、位置:

create stable device_statushis (   pos_time TIMESTAMP,    sample_time TIMESTAMP,    record_time TIMESTAMP,    online_status SMALLINT,    alarm_status SMALLINT,    pos_method SMALLINT,    pos_precision SMALLINT,    pos_longitude DOUBLE,    pos_latitude DOUBLE,    pos_altitude DOUBLE,    pos_speed FLOAT,    pos_direction FLOAT,    acc_forward FLOAT,    acc_side FLOAT,    acc_verticle FLOAT,    rollover_level SMALLINT,    power_voltage FLOAT,    acc_status SMALLINT,    satellite_num SMALLINT    )    tags(        device_id BINARY(32)    ) ;

2.车辆事件:四急( 急加速  急减速 急刹车  急转弯)

CREATE STABLE `emg_info` (`pos_time` TIMESTAMP, `sample_time` TIMESTAMP, `record_time` TIMESTAMP, `duration` SMALLINT, `mid_interval` SMALLINT, `mid_number` SMALLINT, `pre_number` SMALLINT, `pre_interval` SMALLINT, `start_time` TIMESTAMP, `end_time` TIMESTAMP, `start_lat` DOUBLE, `end_lat` DOUBLE, `start_lng` DOUBLE, `end_lng` DOUBLE, `event_type` SMALLINT, `sample_info` NCHAR(2048), `parameter_type` NCHAR(10)) TAGS (`device_id` VARCHAR(32), `app_code` NCHAR(32));

3.GPS 信息:

CREATE STABLE `gps_info` (`pos_time` TIMESTAMP, `sample_time` TIMESTAMP, `record_time` TIMESTAMP, `online_status` SMALLINT, `alarm_status` SMALLINT, `pos_method` SMALLINT, `pos_precision` SMALLINT, `pos_longitude` DOUBLE, `pos_latitude` DOUBLE, `pos_altitude` DOUBLE, `pos_speed` FLOAT, `pos_direction` FLOAT, `acc_forward` FLOAT, `acc_side` FLOAT, `acc_verticle` FLOAT, `rollover_level` SMALLINT, `power_voltage` FLOAT, `acc_status` SMALLINT, `satellite_num` SMALLINT) TAGS (`device_id` VARCHAR(32), `app_code` NCHAR(32), `device_hash` INT);

4. 汽车总线数据:

CREATE STABLE `can_info` (`pos_time` TIMESTAMP, `sample_time` TIMESTAMP, `record_time` TIMESTAMP, `gas_pedal_position` FLOAT, `spark_angle` FLOAT, `total_fuel_consumption` INT, `storage_battery_voltage` FLOAT, `latest_engine_runtime` INT, `fuel_pressure` INT, `distance_after_mil` INT, `long_term_fuel_trim` FLOAT, `engine_rpm` INT, `intake_manifold_pressure` SMALLINT, `distance_total` INT, `engine_inlet_port_temp` SMALLINT, `calcu_load` TINYINT, `vehicle_speed` SMALLINT, `fuel_type` NCHAR(30), `area_code` INT) TAGS (`device_id` VARCHAR(32), `app_code` NCHAR(32));

在应用层,由于我们存储的数据是车辆轨迹数据,因此会做很多关于车辆轨迹数据的分析,比如:热点路线、轨迹段数据、停留点、行驶事件(急转弯、急加速、急减速、车辆其它信息),但由于TDengine一直以来都是时序数据库,并没有地理信息相关的计算函数,所以在这块我们自己写了很多函数,通过 Spark 的 RDD 来进行了计算分析,最后再把分析后的数据返回给客户端。

未来展望:

目前 TDengine 能够很好地解决我们的需求,尤其是强大的存取能力是我们最满意的地方。但近期我从官方人员处得知,从即将于 7 月份发布的 3.0.6.0 版本开始,TDengine 将提供全新的数据类型 geometry 用于点线面等几何类型的存储,并且会逐步提供一套符合 OGC(Open Geospatial Consortium) 标准的 SQL 函数,包括几何输入输出、空间关系、几何测量、集合操作和几何处理等等。

其实通过我们观察,还是有很多车联网用户对于轨迹分析有使用需求,如果 TDengine 可以完整支持到空间数据的处理,这样我们的系统架构将会进一步简化,连 Spark 都可以不用了,这就可以说是完全意义上地使用了 All in one 的时序数据处理引擎。

可惜的是,目前由于我们历史数据的经纬度都是通过单独列来存储的,对于 Geometry 带来的全新数据类型,我们庞大的历史数据量和应用层是很难快速调整的,所以只能在测试环境应用,先逐渐试用起来。

最后,祝 TDengine 越来越好,最终成为时序数据库的事实标准。

作者介绍: 薛超,中移物联网数据库运维高级工程师,10 年数据库运维经历,2017 年加入中移物联网,负责智能硬件产品部数据库相关工作,专注于数据库优化和推动架构演进;近年来主要研究国产新型数据库,目前所在部门全部业务已经去“O”,在此过程中,积累了大量新型数据库的运维经验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_325671.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于visual studio 2010 及以上版本 引入boost库的最新解决方法

之前没有怎么用到boost库,出来实习需要去编译一些代码,需要引入boost第三方库,在这过程中,一直出现 LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc100-mt-gd-x3 错误, 但是也确实是跟其他教程学过…

myCobot机器人ChatGPT应用:设计原则和模型能力

我们将 ChatGPT 的功能扩展到机器人,并通过语言直观地控制机器人手臂、无人机和家庭助理机器人等多个平台。 你有没有想过用你自己的话告诉机器人该怎么做,就像你对人类一样?只是告诉你的家庭助理机器人:“请加热我的午餐”&…

MYSQL根据标签查询数据

场景条件: 1.根据用户id查询到该id绑定的标签(可能是多个标签也可能是单个标签) 2.根据标签的id查询到绑定标签id的信息表 SELECT labelID FROM LRrelation WHERE relationID 1 SELECT * FROM notification SELECT * FROM notification…

6.30学习-函数柯里化,回调解决异步多线程

6.30学习-函数柯里化,回调解决异步多线程 1.函数柯里化1.1 确定参数的函数柯里化1.2参数不确定的函数柯里化1.3 用法1.3.1 给setTimeout传递进来的函数添加参数 2.回调解决异步多线程 1.函数柯里化 函数柯里化,经常可能就面试的时候听说过,反…

如何在半导体行业运用IPD?

半导体产业链具体包括上游半导体原材料与设备供应、中游半导体产品制造和下游应用。其中,半导体材料处于上游供应环节,材料品类繁多,按制造流程可细分为前端制造材料和后端封装材料。半导体设备,即在芯片制造和封测流程中应用到的…

智谱AI-算法实习生(知识图谱方向)实习面试记录

岗位描述 没错和我的经历可以说是match得不能再match了,但是还是挂了hh。 面试内容 给我面试的是唐杰老师的博士生,方向是社交网络数据挖掘,知识图谱。不cue名了,态度很友好的 ,很赞。 date:6.28 Q1 自…

服务器解析漏洞与cms靶场搭建教程

文章目录 一、解析漏洞定义1.CVE-2017-157152.AddHandler3.IIS64.IIS75.nginx 二、Kali安装docker并搭建DVWA靶场1.安装docker2.启动docker3.安装docker的DVWA容器4.启动dvwa 三、kali搭建vulhub与CVE-2017-15715复现1.安装vulhub2.安装CVE-2017-15715漏洞利用靶场3.启动靶场4.…

液晶铝薄膜的干蚀特性

引言 对于先进的薄膜晶体管液晶显示器(TFT-LCD)制造工艺来说,薄膜层已逐渐取代传统的湿法蚀刻工艺。对于栅电极,一般使用铝(Al),在Al中加入一些金属,除了可以保持低电阻率和增强Al薄膜的耐腐蚀性外,还可以防止在后退火…

spfa求负环

1.虫洞 Wormholes&#xff08;裸spfa判断负环问题&#xff09; 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/problem_show.php?pid1507 #include<bits/stdc.h> using namespace std; const int N510,M5210; int d…

判断数组中所有元素是否均为实数对象 numpy.isrealobj()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断数组中所有元素 是否均为实数对象 numpy.isrealobj() [太阳]选择题 请问关于以下代码的说法错误的是&#xff1f; import numpy as np a np.array([1, 2, 3]) b np.array([1, 1 2j, …

docker学习(七)docker daemon

1.Docker 的CS模式 1.1.Docker 的C/S模式介绍 在 Docker Client 中来运行 Docker 的各种命令&#xff0c;这些命令会传送给在 Docker 的宿主机上运行的 Docker 守护进程。而 Docker 守护进程是负责实现 Docker 各种功能的。 如图所示&#xff0c;Docker 守护进程运行在宿主机…

第四章 数组

前言 学习方法 可以多看几遍视频把上课的代码&#xff0c;自己加加注释&#xff0c;在自己写之前&#xff0c;可以画一个流程图照着流程图把代码自己实现一遍 不要怀疑自己&#xff0c;不要遇到困难就觉得自己不行&#xff0c;遇到困难就解决困难&#xff0c;编程初学者都是…

SSH连接vmware 虚拟机 centos

检查虚拟机设置的网络连接是否为NAT模式 点击左上角“编辑” -> “虚拟网络编辑器” 在虚拟网络编辑器中查看IP地址 &#xff0c;点击NAT模式后&#xff0c;点击“NAT设置 记住自己的网关,下面在服务器中配置需要 进入服务器的 /etc/sysconfig/network-scripts/ 编辑 i…

浑元太极马老师和小薇-UMLChina建模知识竞赛第4赛季第7轮[更新]

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 第7轮一直无人得分&#xff0c;再次更换题目。 因有的题目之前已经出过&#xff0c;本轮需要最先答对全…

Android View 事件派发流程

原文链接 Android View 事件派发流程 自从乔帮主横空出世推出了iPhone以来&#xff0c;触控式的操作便成了21世纪智能设备的标准输入方式。对于同是智能操作系统的Android来说&#xff0c;也不例外。事件&#xff0c;特别是触控事件对于移动应用程序开发来说是一个非常重要的&…

软件DevOps云化发展的趋势 【课程限时免费】

你了解什么是DevOps吗&#xff1f; 它是怎么诞生的&#xff1f; DevOps能做些什么&#xff1f; 相信对于DevOps的实践者和关注者来说&#xff0c;对它已经不陌生了&#xff0c;但是对于刚刚进入开发者领域不久的小伙伴应该并不清楚&#xff0c;下面就让小智带你一起了解DevO…

C. Insert Zero and Invert Prefix - 构造+思维

分析&#xff1a; 数组b的最后一个元素永远不可能使1&#xff0c;因为即使在最后一个位置操作&#xff0c;也只会把前n-1个元素反转&#xff0c;最后一个元素只能为0.然后可以发现只要a[i]0就可以直接输出0&#xff0c;当a[i]1时一连串的1只需要最后一个1的位置改变成1的字串长…

Keil5中写的软件延时函数不起作用现象解析_ARM_Compiler_volatile关键字

一、问题描述 在学习野火霸天虎F407寄存器点亮LED时&#xff0c;出现实验现象&#xff1a;LED灯不亮&#xff0c;野火霸天虎F407资料。 main.c代码如下&#xff1a; #include "stm32f4xx.h"void Delay(unsigned int count);int main(void) { #if 0/* 第一步&a…

oracle rowscn 简单记录

可以通过ROWSCN 侦测row是否有变化&#xff0c;但需要注意&#xff1a; 默认是一个block的scn 相同可以通过create table ROWDEPENDENCIES 在每行上记录无论哪种模式&#xff0c;ROW SCN是一个大致值&#xff0c;不是准确值 NOROWDEPENDENCIES | ROWDEPENDENCIES This claus…

Maven安装和配置详细教程

Maven安装和配置详细教程 1、Maven简介 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、测试、打包和发布等工作。 2、Maven下载 点击Maven下载官方地址下载Maven。或者去…