方案特点
- 模块化
- 将 IoTDB 的各个组件模块化,分布式或单机实例均通过这些模块组合而成
- 扩展性
- 支持快速(秒级)增加节点,无需迁移数据
- 支持新增节点后实时分担写入负载
- 支持数据读写以及磁盘空间使用的负载均衡
- 高可用
- 客户端可自动切换
- 单节点失效不影响集群服务
- 可观测
- 集群内置监控服务
集群角色
PartitionNode:管理数据分区表、元数据分区表、节点状态信息
DataNode:管理数据和元数据
每个 Node 是一个进程,可将多个进程部署到一台机器上,支持更强的灵活性,可适配云环境部署。
集群架构
主要模块
IoTDB 主要包括以下模块,分布式和单机均可由以下模块组合而成。
- 执行计划生成器(Planner)
- SQL 解析器、查询优化器
- 查询引擎(QueryExecutor)
- 原始数据查询、聚合查询等
- 存储引擎(VSG)
- TsFile 数据文件、数据合并、数据同步
- 元数据管理引擎(MManager)
- 管理一部分元数据,包括设备、时间序列的增、删、查
- 客户端请求处理模块(ClientRequestHandler)
- 管理读写请求的序列化反序列化,管理线程的并发模型。管理权限。
- 集群请求处理模块(ClusterRequestHandler)
- 处理 DataNode 发来的读写和管理请求。
- 分区表管理引擎(PTManager)
- 节点状态信息、数据分区表、元数据分区表、扩缩容、负载均衡
- 协调者(Coordinator)
- 接收执行计划,并判断此计划是本地执行还是远端执行。对于写入计划,交给共识模块进行多副本写入。对于查询计划,负责执行计划的拆分、分发读写请求、合并结果集。
- 共识模块(Consensus)
- 数据复制,根据一致性级别调度读写请求到对应副本
单机模块
- 执行计划生成器
- 查询引擎
- 存储引擎
- 元数据管理引擎
- 客户端请求处理模块
分布式模块
- PartitionNode
- 分区表管理引擎
- 共识模块
- 集群请求处理模块
- DataNode
- 执行计划生成器
- 查询引擎
- 存储引擎
- 元数据管理引擎
- 客户端请求处理模块
- 协调者
- 共识模块
集群模块分布示例
每个存储组对应 集群总核数/副本数个 VSG 共识组,并且对应 M 个 MManager 共识组
PartitionNode
功能:分区表管理者维护节点状态信息、数据分区表、元数据分区表,同时负责集群扩缩容和负载均衡。
节点状态信息
对于每个 DataNode,记录以下信息:
- 静态指标
- CPU 核数、总内存、磁盘总容量、磁盘类型、网卡最大吞吐
- 动态指标
- CPU 信息(负载,利用率)、内存信息(剩余内存)、磁盘 IO 信息(磁盘利用率)、存储空间信息(剩余容量),网络流量负载(网卡当前吞吐)。
- 数据负载:VSG 个数及其中的 Leader 个数,MManager 个数及其中的 Leader 个数
- 对于每个 VSG:记录序列数量,数据文件个数、大小
- 对于每个 MManager:记录序列数量
数据结构:DataNodeID->NodeInfo。(预估单节点的 NodeInfo 在 4KB 之下,因而此架构支持上百节点的节点状态表在 1MB 以内,不会成为瓶颈。)
元数据分区
数据分区
DataNode
管理数据、元数据的写入和查询。
分区表缓存
维护当前用到的分区表缓存,包括数据分区表和元数据分区表,以避免写入频繁访问 PartitionNode。
【需详细设计缓存一致性维护】
元数据持久化存储
每个 VSG 内部持久化存储其写入数据对应的元数据。
作用
- 数据写入时可在本地进行数据类型检查,避免每次写入访问 PartitionNode 和 MManager
- 查询时进行本地序列的存在性检查
- 场景:查询 d1.s1 时,分区表节点会告知协调者此设备所在的设备组所在的所有节点,其中某些节点可能不存在此序列,通过本地元数据可快速识别,避免访问每个数据文件
客户端
网络通信
节点增删
PartitionNode 增删流程
DataNode 增删流程
读写流程
数据管理:DML
数据写入
MPP 查询框架
元数据管理:DDL
元数据操作
共识层
负载均衡
内存控制
集群容错机制
集群监控框架
数据导入导出
集群运维工具
待讨论
- 设备模板的读写流程
- 客户端与数据节点的【分区表缓存】及【读写流程适配】
- 节点的后台线程,SEDA模型
- 心跳,Lease
- 各模块的改造:StorageGroupProsessor,PlanExecutor,MManager,PhysicalPlan