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

一个服务器轻松存储上亿数据,TDengine在北京智能建筑边缘存储的应用

一个服务器轻松存储上亿数据,TDengine在北京智能建筑边缘存储的应用-小T导读:在北京智能建筑边缘侧采集数据存储的方案中,面临着在有限的计算资源下,如何实现最高效的数据存储、分

小 T 导读:在北京智能建筑边缘侧采集数据存储的方案中,面临着在有限的计算资源下,如何实现最高效的数据存储、分析和计算的问题。经过调研与测试,最终选择了由 TDengine 处理时序数据,SQLite 处理关系数据,以此更好地实现边缘侧的数据自治。本文讲述了他们的选型和建模思路以及落地后的效果展示,作为经验参考分享给有需要的读者。

公司简介

北京智能建筑科技有限公司作为北京市在智能建筑和智慧城市领域的创新平台,是冬奥科技平台公司、智慧冬奥国家重点项目设计单位和核心实施单位,同时,北智建作为国家高新技术企业,致力于打造中国最大的智能建筑 AIoT 平台。

在云计算模式中,采集的数据必须要传到云上进行集中式的存储、归档及分析,依托云端计算资源进行复杂的计算,再将所得到的指导性结论通过网络下发给终端。而对于边缘计算,即把一部分的存储和计算的能力下沉到边缘侧(即设备侧),由于终端设备可以较独立地进行数据存储、计算、决策和应用,因此边缘侧会更加智能,对云端依赖更小,数据处理的时效性也更高,且不再受网络影响。

一般来说,边缘侧往往是一些能够大量铺设的小型智能终端,出于成本考虑,其配置的内存、CPU 等硬件资源和计算能力都很有限。边缘计算的难点就在于能否在有限的计算资源下,实现最高效的数据存储、分析和计算。总结下来,边缘计算对数据库能力的要求主要反映在以下几个方面,这也是我们在选择数据库时的重点考量维度:

  • 超高读写性能
  • 低硬件开销
  • 通用接口,适配边缘侧多样计算需求
  • 实时数据的缓存能力、流式计算能力
  • 历史数据持久化存储、高效压缩能力
  • 历史数据回溯能力、按时间窗口的统计聚合能力

一、技术选型

整体而言,时序数据库具备上述各项能力,也是边缘侧采集数据存储的最佳选择。但市面上时序数据库产品众多,如何筛选也是一个难点。

如 OpenTSDB(底层基于 HBase 改造)、InfluxDB 等一类的时序数据库,其运行起来的硬件资源开销过高,对于边缘侧来说还是太重了。后来我们观察到了一个极轻量化的开源时序数据库 —— TDengine,当时它的整个安装包只有 2 MB 多,使用 C 语言完全自主研发,核心功能就是一个高性能分布式时序数据库。具体优势汇总如下:

  • TDengine 社区已经发布了支持 ARM64 处理器的版本,可以顺畅地运行在树莓派等主流的边缘侧硬件上,同时提供对实时数据的缓存、历史数据的回溯、按时间段进行聚合计算等多种能力。
  • TDengine ARM 版本支持的接口也有很多种,与正常集群版几乎没有区别。同时,它还提供了一个 taos shell 客户端,让调试人员可以方便地去查看 TDengine 的运行状态。
  • 支持包括 C/C++、JAVA、Python、RESTful、Go 在内的多种语言,学习成本低
  • 安装超级简单,无任何依赖
  • 安装无任何依赖
  • 使用便捷

SQLite VS TDengine
另外提起边缘侧、嵌入式设备中的数据存储,那就不得不提 SQLite。SQLite 是一个不需要后台的超轻量级数据库,即插即用的特点也让它成为世界上装机量最高的数据库。SQLite甚至在官网上将自身定位与 fopen() 对标,而不再是作为一款数据库。SQLite 提供的一系列 API 都是对标关系型数据库的,它甚至还支持了事务,因此业界常常把它用作嵌入式关系型数据库。其与 TDengine 的各项对比如下:

从上面的比较中我们可以看到,TDengine 和 SQLite 要处理的问题侧重点不同,各有所长。从我们自身业务的切实需求出发,两者并非必须要进行取舍,而是可以根据业务需求灵活搭配使用——由 TDengine 处理时序数据,由 SQLite 处理关系数据,以此更好地实现边缘侧的数据自治。基于此,在存储方面我们决定采用 TDengine + SQLite 的组合形式。

二、架构与具体实现

技术架构

  • 物理视图
  • 逻辑视图

在边缘端日志功能(为边缘端的设备提供日志上报)的设计上,我们采用 TDengine 对日志进行存储,该功能的设计是为出现异常状况的设备提供溯源依据,在与告警功能配合下可以让开发人员快速定位到问题,及时进行解决。此外在边缘端进行日志处理,就能利用边缘端的算力减轻中台的压力,还可以支撑 2 万设备异常情况下的日志并发写入。

对于设备的采集值,我们同样采用 TDengine 进行存储和检索。以往采用关系型数据库进行存储时,在设备比较多、数据量庞大的情况下,查询会非常的慢,体验感极差。反观 TDengine 高压缩算法能提升 10 到 20 倍的压缩性能,降低存储压力的同时也解决了数据存储成本高的问题,还达到了降低硬件成本的效果。

建表建库思路

  • 直接输入 taos 进入 TDengine 界面
  • SHOW DATABASES 查看数据库
  • USE db_name; 选择数据库
  • SHOW TABLES; 查看表
  • CREATE DATABASE 创建库
  • CREATE TABLE 创建表
  • INSERT INTO 插入数据
  • SELECT 查询数据

三、落地效果

在产品开发初期阶段,我们也尝试过其他类型的数据库解决方案,但都因为各种问题而搁置了。因为研发团队精力人力有限,我们没有考虑过自己搭建一套大数据处理平台,毕竟要充分整合 Kafka、HBase、Hadoop、Spark 这一系列开源框架不仅意味要花费大量人力,还需要更多的时间去调试开源框架本身的问题,融合及联调不同框架也存在着很多数据一致性的问题,同时也意味着后期运维成本的大幅度增加,稳定性也是个不小的未知数。

所幸遇到了 TDengine,它帮助我们在边缘侧解决了一个很大的问题,即边缘存储的问题。因为很多时候边缘是布署在资源比较少的机器上面,甚至是 ARM 的工业盒子上面,在资源使用上非常的苛刻,而现在得益于 TDengine 超强的压缩算法,我们使用非常小的存储空间就存储了几千万数据,压缩率远超 1/20,在单机上面布署一个 TDengine 服务器就可以轻轻松松地存储上亿的数据

此外它还拥有超强的计算能力,占用的资源也非常小,在我们的业务中千万级数据检索时间达到了毫秒级,从用户角度来说产品体验非常好。在运维层面,TDengine 提供标准的 SQL 语法,有过 SQL 使用经验的同学基本上很快就能上手,学习成本接近于零。

四、写在最后

事实上,TDengine 这款产品我已经关注很久了,我也和涛思的同学们提出过一些在使用过程中发现的 Bug,从最初的版本到现在的产品,TDengine 变得更加强大和成熟。作为它的“老朋友”,我在此也提出两个改进优化建议,以便帮助它更好的成长:

  • 现在安装 TDengine Server 时要向下兼容 TaosClient,如果在升级 Server 时,我不需要再在自己的服务器上面同时升级 TaosClient,可以减少一些部署步骤。
  • 如果我们用 kubernetes 进行部署,POD 删掉重启后服务就无法启动了,还需要在挂载的数据文件夹里面手动去修改配置,非常地不灵活。

我们与TDengine的合作不会止于此,未来等到 TDengine 更加成熟稳定后,不仅我们的边缘计算存储要使用它,甚至我们的中台数据也要迁移到上面。


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


推荐阅读
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • Phoenix 使用体验分享与深度解析
    闲来无事看了下hbase方面的东西,发现还好理解不过不大习惯于是找到个phoenix感觉不错性能指标如下好像还不错了准备工作:启动hadoop集群启动zookkeeper启动hba ... [详细]
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 本文详细记录了腾讯ABS云平台的一次前端开发岗位面试经历,包括面试过程中遇到的JavaScript相关问题、Vue.js等框架的深入探讨以及算法挑战等内容。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 本文介绍了Memcached分布式集群中的取模算法和一致性哈希算法的原理及其对缓存命中率的影响。通过详细分析,探讨了如何优化这些算法以提高系统的稳定性和性能。 ... [详细]
author-avatar
mobiledu2502898473
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有