TDEngine 数据库实现解析

2022-03-21 00:00:00 数据 多个 文件 时序 设备

TDEngine 是一款开源的时序数据库引擎,针对物联网业务场景优化,适合存储物联网设备持续产生的大量时序指标;本文基于 TDEngine Server 1.6.5 版本源码实现,分析 TDEngine 单机存储的实现原理。

TDEngine 组件

  • taosd :TDEngine Server 服务程序,主要有 MGMT 元数据管理、DNODE 数据管理2个模块组成。
  • MGMT 模块维护 TDEngine Database、Table、User、Vnode 等元数据信息
  • DNODE 模块实现数据存储、访问逻辑,DNODE 有多个 vnode 组成,每个 vnode 是一个独立的 LSM Tree,彼此间数据通过目录隔离。
  • taos :TDEngine 客户端工具,通过 taos 可以连接到 TDEngine Server,并进行 DDL、DML 等数据库查询操作。
  • taosdemo :快速往 TDEngine Server 导入 Demo 数据的工具,用于测试非常方便 。
  • taosdump :从 TDEngine Server 导出数据库数据。

备注:图片转自参考资料 TDengine架构设计与存储结构

元数据管理

TDEngine Server 启动后,其数据组织结构类似如下结构,其中 $root/mgmt 目录存储数据库的元数据。

  • db.db: 存储所有 database 的元数据信息,包括数据保留策略,压缩算法等; 一个 database 包含多个 table。
  • meters.db : 存储所有 table 的元数据信息,包括 table 对应的 ID 标识等;建模时,一个设备对应一个 table,table 的多个列存储设备的指标信息。
  • user.db : 存储所有 user 的元数据信息,包括用户名、鉴权信息等。
  • vgroups.db :存储所有 vnode 的元数据信息,包括 vnode 的缓存大小、所属的 database 等信息。一个 database 的数据会分散存储到多个 vnode 里,默认每个 vnode 存储 1000 个 table 的数据,当 database 里table 数量增加时,会跟着动态创建新的 vnode。
├── data
│   ├── vnode0
│   │   ├── v0f1865.data
│   │   ├── v0f1865.head0
│   │   └── v0f1865.last0
│   └── vnode1
│       ├── v1f1736.data
│       ├── v1f1736.head0
│       └── v1f1736.last0
├── mgmt
│   ├── db.db
│   ├── meters.db
│   ├── user.db
│   └── vgroups.db
├── output.txt
└── tsdb
    ├── vnode0
    │   ├── db
    │   │   ├── submit0.log
    │   │   ├── v0f1865.data -> /var/lib/taos/data/vnode0/v0f1865.data
    │   │   ├── v0f1865.head -> /var/lib/taos/data/vnode0/v0f1865.head0
    │   │   └── v0f1865.last -> /var/lib/taos/data/vnode0/v0f1865.last0
    │   └── meterObj.v0
    └── vnode1
        ├── db
        │   ├── submit1.log
        │   ├── v1f1736.data -> /var/lib/taos/data/vnode1/v1f1736.data
        │   ├── v1f1736.head -> /var/lib/taos/data/vnode1/v1f1736.head0
        │   └── v1f1736.last -> /var/lib/taos/data/vnode1/v1f1736.last0
        └── meterObj.v1

相关文章