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

tidb企业_中移物联网在车联网场景的TiDB探索和实现

作者介绍:薛超,中移物联网有限公司数据库运维高级工程师。中移物联网有限公司是中国移动通信集团公司投资成立的全资子公司,公司按照中国移动整体

作者介绍:薛超,中移物联网有限公司数据库运维高级工程师。

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

本次分享主要介绍车联网业务,它主要围绕车载位置终端和车载视频终端开展业务,包括停车卫士、路尚个人、路尚行业、和统一填装业务。截止 2020 年 5 月,累计接入 150 万终端,车联网用户主要是个人用户和企业用户,目前累计注册个人用户 151 万,累计注册企业用户 1471 个。

基础 IOV 架构

3e3b468e10172c4115c279a4ec688430.png

首先讲一下基础架构,车载设备中搭载在小汽车上的 opd 设备会根据业务类型的配置,及时发送报文到切入计算模块和分发引擎,将报文按照预先制定的协议解析,把不同的信息分发到下游不同的服务。比如,轨迹服务、告警服务。不同服务的存储媒介是不一样的,比如说轨迹放到 TiDB,位置服务放在 Redis 集群,行车视频是放在七牛的对象存储,完整的报文信息是放在 HBase 做数据分析。

IOV 核心场景

场景一:设备管理模块

设备管理主要是记录车载设备的各种状态信息数据,部分数据更新频率比较高,峰值达到 1.2 万字/秒。在用 TiDB 之前设备管理是放在 Redis Cluster 里面的,放到 TiDB 里面验证,主要是想看它处理 update 语句的效率。

场景二:行车轨迹

行车轨迹场景主要是行车轨迹数据的写入和少量轨迹查询的请求,日均写入量在 4.5 亿行数据。目前验证集群的规模数据在 300 亿行左右,最终规模会达到 1600 亿行以上,那时就算是一个比较海量的数据了。

行车轨迹存储演进

4d4d45e631ff6071ad0e89c730a9f6dc.png

2017 年,行车轨迹是跑在 Oracle 的双机 RAC 上面的,在去 IOE 的浪潮下,业务的发展受到了限制,Oracle 相关的硬件采购需求得不到集团的批准,因此我们开始考虑把整个行车轨迹的存储迁移到开源的数据库上面。当时选择了 MySQL 作为迁移方向,但是轨迹模块在 Oracle 上面体量比较大,有 8 T 的数据,前期 MySQL 肯定是无法承载这样规模的业务,因此我们当时考虑将数据进行水平的切片,结合 Oracle 的环境,QPS 峰值大概是 1 万。当时把分片的数量定在三个,由代码控制具体某个设备的轨迹数据,给到具体哪一个分片。在我们验证的过程中,发现 3 个节点处理不了,于是我们扩展到 8 个节点,这个时候基本上可以承载整个轨迹服务的数据写入了,但是业务侧的逻辑又变得相当的繁重,维护的成本非常高,因此想找一个中间件来替代代码的分片功能。

于是我们选择了 MyCat,几经调整过后,由 16 台 X86 的物理机组成了 8 组 MySQL 的节点,将 Oracle 替换了下来。过程并不顺利,在使用 MyCat 的前期,写入的性能不好,队列经常积压,我们想了一些办法来优化,比如在写数据到 MyCat 之前,将每条轨迹进行一致性 hash 的计算,把 hash 值一样的数据归在一起,然后再批量写入到 MyCat,来减少把 MyCat 分发到各个 data note 的开销。另外还采用了 Twitter 的分布式自增 ID 算法 sonwflake 用于 ID 组件,改造成自增的 Big Int 类型组件,提高写入性能。

使用 MyCat 一段时间后,我们也在思考,目前的集群如果要做节点的扩容,成本高不高?风险大不大?结论是我们要花 4 到 5 天的时间来做节点扩容后的数据迁移,显然这个成本是相当昂贵的。这个时候,我们关注到了 TiDB,官方介绍这个产品支持弹性的水平扩展,能够轻松的应对高并发,海量数据场景,支持分布式事务,并且有自动的灾难恢复和故障转移功能,听上去非常的诱人,我就找研发大佬聊了这个事情,我们一拍即合,后面的事情进展很顺利,资源申请、部署环境,我们很快的把 3 个 TiDB server、3 个 TiKV 和 3 个 PD 集群布置好,开始了一系列的场景验证。

遇到的问题

第一个问题是在验证设备管理模块的时候,发现整个集群每一个节点的负载其实并不高,但是处理的效率比较低,导致队列有积压。为了解决这个问题,我们也咨询了官方的同事,进行了一些优化,比如调整批量的更新来减少开销,扩容一个 TiDB 的 server 节点,最重要的是把 TiDB 版本从 2.04 升级到 3.05。

另外一个问题就是热点数据,因为 MySQL 的模型组件用的是自增的 int 类型,迁移过来以后热点数据效应比较明显。为了解决这一问题,我们将主键改成 uuid,通过 shard_row_id_bits=N 这样的语句,来将数据打散,打散后数据写入的效率大大提升。听说现在 4.0 GA 版本的 AutoRandom 可以解决同样的问题,不再需要使用 uuid 作为组件,我们可以期待一下这个版本的新特性。

TiDB 解决了哪些痛点问题

第一,它的水平扩展特性解决了 MyCat 等中间件分库分表带来的维护成本高的问题。通过无缝扩展 TiDB 和 TiKV 实力,提高系统的计算能力和存储能力。

第二,TiDB 兼容现有的 MySQL 的语法和协议,迁移成本低。我们从 MyCat 集群迁移到 TiDB 业务代码都非常少。在数据迁移方面,历史数据通过开发的迁移小工具,从 MyCat 集群读取出来,然后写到 TiDB 集群,数据是在代码层做的双写,我们很顺利的将数据迁移到了 TiDB。

第三,海量数据下,查询效率非常优秀。我们的轨迹数据是按照日期分区的,每天会写入 4 亿到 5 亿的数据,那么在这个量级的数据场景下,我们设备 ID 的查询一般在 10 毫秒就能够返回结果,能够满足我们业务场景的需求。

第四,扩容和升级非常快捷。TiDB 在版本升级方面真的非常好用,把准备工作做好之后,3、4 分钟不到就完成了整个升级,用户体验非常棒。

TiDB 在物联网的应用前景

我们公司的核心产品是物联卡,目前卡片数量在 7 亿以上;另外一个产品是智能组网,现在有将近 1600 万的家庭网关;在智能家居和智能娱乐方面,我们有 700 万左右的摄像头和智能穿戴设备,这几个场景都是属于高并发以及海量数据的场景,我认为这些场景都是比较适合迁移到 TiDB 上面跑的。随着我们车联网场景在 TiDB 上的使用越来越成熟,未来我们会推动更多的业务,迁移到 TiDB 上面。同时,也希望 PingCAP 公司的同学们,能够给我们带来更优秀的产品。



推荐阅读
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
author-avatar
cocoC陳靜雯具_606
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有