项目背景

本项目为车联网监控系统,系统由车载硬件设备、云服务端构成。车载硬件设备会定时采集车辆的各种状态信息,并通过移动网络上传到服务器端。
服务器端接收到硬件设备发送的数据首先需要将数据进行解析,校验,随后会将该消息转发到国家汽车监测平台和地方汽车监测平台,最后将解析后的明文数据和原始报文数据存储到系统中。
车辆的数据和其他数据需要通过web页面或rest API接口进行查询访问。
要求半年内的数据查询响应时间在毫秒级别内,超过半年的数据需要放到更加低成本的介质上,查询延迟在3s以内,这些数据的查询频次比较低。
系统的主要参数有以下几项:

  • 10万台车辆同时在线;
  • 车辆正常情况下平均每分钟发送两个数据报文到监控平台;
  • 若车辆处于报警状态,则平均一秒钟发送一次数据报文;
  • 数据情况:(1)、车辆数据报文平均大小为1KB;(2)、解析后的数据包大小为7KB;(3)、平均一台车每天会产生20MB的数据;(4)、系统每天会产生2TB的数据;(5)同时系统有2.9亿行的数据需要写入到数据库中;
  • 系统并发量:(1)、3300的持续并发量;(2)、10万个长连接;(3)、每秒3.3MB的原始数据需要被解析;(4)、每秒23.1MB的解析数据需要被存储。

系统设计

系统的技术选型对初创公司来说至关重要,所以在设计系统的时候尤为小心。经过仔细分析,我们要求新系统必须满足以下几个条件:

  • 必须能够支持海量数据的不间断写入,而且能够存储PB级别的数据,具有高扩展性、高可靠性等;
  • 能够支持简单的关键字查询,响应时间在秒级别内;
  • 能够兼容大数据生态产品(如Spark、Hive、Hadoop等),同时支持离线和准实时OLAP;
  • 优先选择有雄厚实力的商业公司支持的云平台,最大限度减少运维成本。

为何选择HBase以及阿里云

因为车辆的监控数据非常大,传统关系型数据库(如Mysql、pg等)已经无法胜任存储工作,所以我们需要选用一种分布式数据库用于存储车辆实时数据。
我们在市场上能够找到分布式数据库有MongoDB和 HBase。

  • MongoDB:MongoDB是一种我们曾经使用使用过的数据库,该数据库是一种基于文档的数据库。
    支持分片副本集扩展,但是由于MongoDB的分片集群维护成本过高,另外查询性能严重依赖索引,扩容时分片的迁移速度过慢。所以在这一版本的监控系统中我们并未采用。
  • HBase:HBase底层存储基于HDFS的面向列数据库,其核心思想来源于谷歌三大论文内的bigtable。在谷歌和开源界均拥有丰富的应用实践经验。
    除此之外,HBase还有以下特点:(1)、支持PB级别的数据量;(2)、压缩效率非常高;(3)、支持亿级别的QPS;(4)、在国内外很多大型互联网公司使用;(5)、HBase添加节点及扩容比较方便,无需DBA任何干预。

经过对这几种数据库的分析,我们最终选用HBase,其满足我们前面提到的四个要求,而且还提供Phoenix插件用于SQL语句的查询。

作为初创公司,我们的运维能力有限,我们需要业务的快速落地。所以自建机房以及运维团队意味着前期较大的投入以及高昂的运维成本,所以我们决定使用云方案。

 

经过比较国内的各大云厂商,我们最终选用了阿里云平台,因为阿里云提供SaaS化的HBase服务,同时阿里云HBase支持很全面的多模式,支持冷数据存放在OSS之中,节约成本;
支持备份恢复等特性,做到了真正的native
cloud的数据库服务。
另外,HBase
在阿里内部部署超过12000台机器,历经7年天猫双11的考验,这些实际数据以及经验增强了我们对阿里云HBase的技术信心,同时满足了我们的技术和业务需求。

层级系统架构

系统采用层级架构以方便后期扩展和维护,现在主要分为以下几层:

  • 接入层:主要负责管理车辆设备的长连接,认证接收车辆发送的数据,下放数据和指令等操作。
  • 消息队列层:主要负责缓存接入层收到的车辆实时数据。
  • 实时数据处理与解析层:主要负责解析车辆上传的实时数据,并将其存储到数据库中。另外还需要负责数据转发、指令生成等工作。
  • 应用层:主要负责处理各种业务逻辑、将解析后的数据进行分析整理提供给用户使用。

系统架构预览

最终新能源监控系统的系统架构设计如下

图中最左端为监控的车辆,它会实时采集车辆的各项数据,并把采集到的数据通过移动互联网发送到平台。
平台验证完数据会将其写入到Kafka消息队列中。流式计算服务器从Kafka消息队列中取出车辆的原始数据,并对车辆的数据进行解析、存储、转发等操作。
HBase集群负责存储车辆实时数据,MySQL负责存储组织关系数据。同时,我们还会将超过一定时间(比如半年前)的数据转存到OSS存储介质中,以便降低存储成本。
Spark
ML会对系统中的各项数据进行分析。终端用户会从HBase中查询一些数据。

HBase使用难点

Row key 设计

团队在使用HBase之前一直使用MySQL关系型数据库,在系统设计之初并没有考虑HBase的特性,而是按照关系型数据库的设计原则设计。
经过一段时间的了解后才知道HBase主要使用Row
key进行数据查询。Row key的设计至关重要。
目前系统中设计的Row key如下

  • 设备ID + 时间戳:此种方式可以快速定位单台车辆。但是由于设备ID前缀为型号,一旦某批次的设备或车辆发送故障,则会造成HBase的某个Region写入压力过大。
  • subString(MD5(设备ID),x) + 设备ID + 时间戳:此种方式可以将所有车辆打散到每个Region中,避免热点数据和数据倾斜问题,式中的x一般取5左右。但对于某个型号的车辆查询就只能够每台车辆单独进行查询了。

复杂查询问题

虽然通过Row
key的设计可以解决部分数据查询的需求,但是在面对复杂需求时难以通过Row key
直接索引到数据,若索引无法命中,则只能进行大范围或全表扫描才能够定位数据。
所以我们在使用HBase时尽量避免复杂的查询需求。但业务方面仍然会有部分较为复杂的查询需求。针对这些需求,我们主要使用两种方式来建立二级索引。

  • 手动在事务产生时将索引写入到HBase表中:使用这种方式建立索引虽然可以不借用第三方插件,但是事务的原子性很难得到保障,业务代码也会因为索引的变化而难以维护。
    另外索引的管理也较为麻烦,后期的数据迁移很难能够。
  • 通过Phoenix构建索引:通过Phoenix构建索引可以避免事务原子性问题,另外也可以通过重建索引来进行数据迁移。
    因为使用的SQL语句,开发人员更能够利用之前关系型数据库的设计经验建立数据索引。

目前新能源监控系统中主要使用Phoenix实现二级索引,大大增加了数据的查询使用场景。

虽然Phoenix能够通过二级索引实现较为复杂的数据查询,但对于更为复杂的查询与分析需求就显得捉襟见肘。所以我们选用了Spark等其他数据分析组件对数据进行离线分析,分析后对结果通过接口提供给用户。

多语言连接问题

团队使用Python语言构建系统,但HBase使用Java语言编写,原生提供了Java

API,并未对Python语言提供直接的API。
我们使用happybase连接HBase,因为它提供了更为Pythonic的接口服务。另外我们也是用QueryServer
作为Python组件和Phoenix连接的纽带。

HBase冷数据存储

系统中车辆数据分为热数据和冷数据,热数据需要HBase中实时可查,冷数据虽不需要实时可查,但却需要一直保存在磁盘中。
阿里云HBase支持将冷数据直接存储在OSS中,而这些数据的转存只需要简单的设置表相关属性,操作非常简单。将冷数据存储在OSS之中大大减少了数据的存储成本。

总结

首先,本文介绍了新能源车辆监控系统的项目背景,随后分析了本项目的项目难点,并介绍了我们团队的各种解决方案。
针对项目需求,介绍了我们选择HBase的原因,及在HBase数据库使用过程中的经验和痛点。

展望

未来,我们会在系统接入大量车辆后,使用golang重写高性能组件以满足后期的并发性能需求。由于项目初期考虑到开发时间的问题,并未采用服务拆分的方式进行开发,这限制了系统的可扩展性,
后期我们会根据实际业务需求,将系统切分成相对独立的模块,增强扩展性可维护性。
另外,车辆数据积累到一定程度后,我们可以利用这些数据进行大数据分析, 如车辆的故障诊断,车辆状态预测等,这样就可以在车辆出现问题前提前发出预警,为车主和保险公司避免更大的损失,降低运营成本。

HBase实践案例:车联网监控系统的更多相关文章

  1. HBase实践案例:知乎 AI 用户模型服务性能优化实践

    用户模型简介 知乎 AI 用户模型服务于知乎两亿多用户,主要为首页.推荐.广告.知识服务.想法.关注页等业务场景提供数据和服务, 例如首页个性化 Feed 的召回和排序.相关回答等用到的用户长期兴趣特 ...

  2. Zabbix监控系统深度实践

    Zabbix监控系统深度实践(企业级分布式系统自动化运维必选利器,大规模Zabbix集群实战经验技巧总结,由浅入深全面讲解配置.设计.案例和内部原理) 姚仁捷 著  ISBN 978-7-121-24 ...

  3. 集群监控系统Ganglia应用案例

    集群监控系统Ganglia应用案例 --我们把集群系统投入生产环境后,这时就需要一套可视化的工具来监视集群系统,这将有助于我们迅速地了解机群的整体配置情况,准确地把握机群各个监控节点的信息,全面地察看 ...

  4. 微信团队原创分享:iOS版微信的内存监控系统技术实践

    本文来自微信开发团队yangyang的技术分享. 一.前言 FOOM(Foreground Out Of Memory),是指App在前台因消耗内存过多引起系统强杀.对用户而言,表现跟crash一样. ...

  5. HBase 集群监控系统构建

    HBase 集群监控系统构建 标签(空格分隔): Hbase 一, 集群为什么需要监控系统 总的来说是为了保证系统的稳定性,可靠性,可运维性.具体来说我认为有以下几点: 掌控集群的核心性能指标,了解集 ...

  6. Zabbix分布式监控系统实践

    https://www.zabbix.com/wiki/howto/install/Ubuntu/ubuntuinstall 环境介绍OS: Ubuntu 10.10 Server 64-bitSer ...

  7. vivo 容器集群监控系统架构与实践

    vivo 互联网服务器团队-YuanPeng 一.概述 从容器技术的推广以及 Kubernetes成为容器调度管理领域的事实标准开始,云原生的理念和技术架构体系逐渐在生产环境中得到了越来越广泛的应用实 ...

  8. Legolas工业自动化平台案例 —— 水源地自动化监控系统

    天津港爆炸事件后,除了安置群众.追究事故责任外,人们最关心的莫过于爆炸污染物对于周边环境的影响,其中最重要的一块就是饮用水的安全.所幸的是,水源的安全监测是实实在在有据可依的.环保单位和供水企业在建设 ...

  9. 运维开发实践——基于Sentry搭建错误日志监控系统

    错误日志监控也可称为业务逻辑监控, 旨在对业务系统运行过程中产生的错误日志进行收集归纳和监控告警.似乎有那么点曾相识?没错... 就是提到的“APM应用性能监控”.但它又与APM不同,APM系统主要注 ...

随机推荐

  1. 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析

    LinkedBlockingQueue 在看源码之前,通过查询API发现对LinkedBlockingQueue特点的简单介绍: 1.LinkedBlockingQueue是一个由链表实现的有界队列阻 ...

  2. redis 系列26 Cluster高可用 (1)

    一.概述 Redis集群提供了分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能.在大数据量方面的高可用方案,cluster集群比Sentinel有优势.但Redis集群并不支持处 ...

  3. 什么是LogDashboard?

    What is LogDashboard 接上篇 LogDashboard是可视化的日志面板,摆脱了传统查看txt与数据库的方式. 使查看日志变的简单方便并且可供分析 基于Net Core中间件编写适 ...

  4. SQL优化总结之一

    一.实践中如何优化mysql 1) SQL语句及索引的优化 2) 数据库表结构的优化 3) 系统配置的优化 4) 硬件优化 二.索引的底层实现原理和优化 2.1 底层实现 在DB2数据库中索引采用的是 ...

  5. Docker系列03—Docker 基础入门

    本文收录在容器技术学习系列文章总目录 1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. ...

  6. 痞子衡嵌入式:第一本Git命令教程(2)- 连接(remote/clone)

    今天是Git系列课程第二课,上一课我们已经学会在本地创建一个空仓库,痞子衡今天要讲的是如何将本地仓库与远程建立联系. 1.将本地仓库挂上远程git remote 本地建好了仓库,我们希望能够挂到远程服 ...

  7. SQL——嵌套查询与子查询

    前言 sql的嵌套查询可以说是sql语句中比较复杂的一部分,但是掌握好了的话就可以提高查询效率.下面将介绍带in的子查询.带比较运算符的子查询.带any/all的子查询.带exists的子查询以及基于 ...

  8. Tomcat常用的过滤器

    前言 之前我很肤浅的以为为了实现某种请求过滤功能(比如图片转换.文件上传.安全认证等),都需要自己去实现javax.servlet.Filter.之后在web.xml中配置即可. 但事实上,Tomca ...

  9. 【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上一篇我介绍了JWT的生成验证及流程内容,相信大家也对JWT非常熟悉了,今天将从一个小众的需求出发,介绍如何强制令牌过期的思路和实现过程. ...

  10. MEF 基础简介 四

    前言 前面讲解了MEF的引用方法,接口的导入导出,类属性的导入导出和集合的导出用法其实大家可以看到基本上大同小异的. MEF的延迟加载 我们知道当装配一个组件的时候,当前组件里面的所有的Import的 ...