在 OPPO 的穿戴产品的手环 / 手表类业务中,产生的数据类型为时序数据,具备写入量微小且存在离线 / 历史数据补录(更新)的解决需要。此前应用的 MongoDB/MySQL 集群计划,后端存储压力较大,须要常常扩盘,针对此痛点,OPPO 云计算中心智慧物联云团队尝试调研比照了几款时序数据库(Time-Series Database)产品,试图寻找一个降本增效的解决方案。
除了存储压力外,咱们进行数据库替换还有一个比拟重要的起因,就是 MySQL 和 MongoDB 的各个集群都比拟独立,保护和需要开发成本绝对较高。
以上是三款 Database 的初步调研后果,TSHouse 是 OPPO 云监控时序数据库,其底层为 Prometheus 的 TSDB 存储引擎,目前不反对历史数据和乱序写入;InfluxDB 对历史数据写入会进行二次压缩,影响性能,这两款数据库都不满足当下的数据处理需要。初步钻研 TDengine 后,咱们发现其作为国产时序数据库开源产品,不仅能够满足历史数据高效写入,还领有较高的压缩能力。随后,咱们抉择对 TDengine 进行了比拟具体的产品调研和性能测试。
TDengine 产品与能力调研
产品调研
某个数据表的构造如下:
咱们写入 60 万行数据,到 MySQL(目前局部业务部署在 MySQL 集群)和 TDengine 的 4C 12G 容器上,对 CPU/ 内存 / 磁盘进行察看。 测试发现 CPU 和内存耗费根本持平的状况下,TDengine 的落盘数据是 MySQL 环境的 1 / 4 左右。
同时,咱们在不同规格容器及物理机场景下进行 TDengine 写入测试,局部记录如下:
须要阐明的是,对于不同业务场景须要进行理论测试,能力确定适宜该业务的部署参数。在整个测试过程中,TDengine 工程师们也为咱们进行了及时答疑和帮忙。
能力调研
随后咱们依据 TDengine 丰盛的产品手册,对一些要害能力进行了验证,包含数据管理、数据写入、聚合计算、集群扩容、故障可靠性保障等场景。
在数据管理上,TDengine 的元数据与业务数据是拆散开来的。如下图所示,Mnode 负责管理元数据信息;单个 Vnode 能够寄存多个表数据,相当于相当于程度分片,单个表的数据,又能够持续依照日期分片。
在数据写入逻辑上,整体和 LSM 相似:WAL,内存块,磁盘 FILE。
在 TDengine 中,数据在文件中是按块间断存储的。每个数据块只蕴含一张表的数据,且数据是依照工夫主键递增排列的。数据在数据块中按列存储,这样使得同类型的数据可能寄存在一起,大大提高了压缩比,节俭了存储空间。
TDengine 是 10 天一组 data file,data file 里的 .data 文件只进行追加,且后续不会进行压缩。这种益处是:对历史数据和乱序极其敌对,十分实用于 IoT 场景;没有压缩也就缩小了写入之后的资源耗费,保障了较好的读写性能。
TDengine 落地实际
在经验了比拟充沛调研后,咱们依据业务写入模型,对生产环境中某一套 MySQL 集群环境,进行 TDengine 集群部署,搭建了如下所示的集群:
集群为 3 台 AWS-EC2 容器(8C 32GB 3.5TB NVME 盘)组成,配置为 3 节点、2 正本,写入端应用 RESTful 申请到 VIP 节点,转发到数据库服务。图中的 V0-V2 为正本数为 2 的 3 组数据分片,M0-M2 为正本数为 3 的 1 组治理节点。
配置的 Grafana 面板展现如下:
后盾表构造展现如下:
目前数据曾经开始接入 TDengine 的数据库,历史数据也在同步导入中。
- 实际效果展现
1. 应用 last_row() 函数一次性输入 38 万个设施查问最新状态,后果如下所示。
2. 应用 interval() 查问某个设施每 1 小时的总步数,后果如下所示。
在存储方面,因为目前数据还没有齐全导入,针对生产环境的一个 6.6TB 集群,咱们粗略预计了一下前后的压缩比,大略在 6.6/0.4。
在咱们原来的集群中是没有正本的,单纯就部署了 MySQL 的 5 个分库,应用了 4C 8GB 2TB 的 5 台机器,在利用 TDengine 之后,当初是 8C 32GB 2TB 的 3 台机器。通过 TDengine 咱们构建了多正本和对立的能力,以及后续上混合云的能力,这是整个平台级的一个优化与晋升。
写在最初
在后期调研和集群搭建过程中,TDengine Database 的工程师搭档们给咱们提供了充沛且及时的帮助,为咱们构建时序数据后端能力提供了很大帮忙。目前接入 TDengine 的数据是海内某集群,后续咱们会依据业务停顿陆续进行其余集群数据的接入。
想理解更多 TDengine Database 的具体细节,欢送大家在 GitHub 上查看相干源代码。