ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

TDengine Catalog 与元数据缓存

TDengine Catalog 与元数据缓存 分类17.内部机制 |篇章04 Catalog 与元数据缓存免费详情Catalog 是数据库的地图库、表、列、Tag、路由信息。本文讲解 Catalog 设计、客户端缓存、一致性机制。Catalog 内容速查项说明数据库库元信息超级表Schema Tag 定义子表Tag 值 所在 VGroup路由VGroup → DNode 映射用户权限信息索引索引元数据详细解析1. 元数据层级集群元数据MNode 维护 Cluster │ ├── DNode 列表节点 │ ├── Database 列表 │ │ │ ├── STable 列表 │ │ │ │ │ ├── Schema列定义 │ │ ├── Tag Schema │ │ └── 子表索引 │ │ │ └── VGroup 列表 │ │ │ └── 副本分配 │ ├── User 列表 │ └── 流/订阅 列表 权威性 - MNode RAFT 副本保证 - 强一致 - 操作通过 Leader - 失效后自动选举2. 元数据存储MNode 持久化 ① 内存常驻 - 全部元数据加载到内存 - 高效查询 ② 持久化机制 - 写日志 Snapshot - 启动时恢复 - RAFT 复制到副本 VNode 元数据 ① 包含 VGroup 内的 - 超级表 Schema - 子表信息Tag 列 - 索引 ② 持久化在 VNode 数据目录 大小估算 - 单超级表元数据 ~ KB - 单子表 Tag ~ 百字节 - 100 万子表 ~ 100 MB 内存3. 客户端缓存客户端 Catalog Cache ① 连接时获取 - 库列表 - 表列表按需 - 路由表 ② 解析 SQL 用 - 查表是否存在 - 校验列名 - 路由到 VGroup ③ 缓存策略 - LRU - TTL - 版本号检测 缓存命中率 - 静态环境 99% - 频繁建表低 - 影响每次查询的额外开销4. 元数据一致性版本号机制 ① 每次 DDL 操作 - MNode 版本号递增 - 元数据更新持久化 - 通知关联 DNode/VNode ② 客户端检测 - 每个请求带版本号 - 服务端返回最新版本 - 客户端发现落后 → 主动刷新 ③ VNode 检测 - 收到请求版本号过旧 → 拒绝 - 收到过新 → 主动拉取 一致性保证 - DDL 操作通过 MNode 串行化 - 客户端缓存最终一致 - VNode强一致RAFT5. 路由解析SQL 执行的路由步骤 ① 解析 SQL → AST └─ 提取库名 表名 WHERE 条件 ② Catalog 查询 └─ 库存在 └─ 表存在 └─ Schema 信息 ③ Tag 过滤优化 └─ WHERE 含 Tag 条件 └─ 利用 Tag 索引缩小子表集 ④ 路由计算 └─ 子表 → VGroup └─ VGroup → DNode取 Leader ⑤ 任务下发 └─ 按 VGroup 拆分子任务 └─ 并行发送到各 DNode6. DDL 操作流程CREATE TABLE / ALTER TABLE 流程 ① 客户端 → MNode任意节点中转 ② MNode Leader 接收 - 验证语法 - 验证权限 - 检查冲突 ③ RAFT 写入 - 写日志 - 复制到 Follower - majority 确认 ④ 应用到状态机 - 更新元数据 - 版本号递增 ⑤ 通知 VNode - 异步推送变更 - VNode 应用 schema ⑥ 返回客户端 延迟 - 简单 DDL 100ms - 复杂大量子表秒级 - 跨节点同步异步7. 缓存失效失效场景 ① 主动失效 - DDL 操作DROP TABLE - 用户权限变化 ② 检测失效 - 请求带旧版本号 - 服务端返回错误 - 客户端清缓存重试 ③ TTL 失效 - 缓存条目过期 - 主动刷新 客户端策略 - 失败重试时刷新 - 周期心跳获取最新版本 - 收到 invalidation 通知视实现 典型情况 - DROP TABLE 后查询 → 错误 → 客户端刷新 → 重试 → 报表不存在 - ALTER ADD COLUMN → 旧客户端可继续工作新列需更新8. 调优与监控元数据相关问题 ① 大量子表导致内存高 - 解决减少 Tag 组合合并子表 ② DDL 慢 - 解决避免高频建表 - Schemaless 自动创建走优化路径 ③ 客户端缓存命中低 - 解决长连接避免频繁重连 - 检查 SQL 是否每次都不同表 ④ 元数据查询延迟 - 解决MNode 节点资源 - 增加 MNode 数少数情况 监控 -- 子表数量 SELECT db_name, COUNT(*) FROM information_schema.ins_tables GROUP BY db_name; -- 超级表数量 SELECT COUNT(*) FROM information_schema.ins_stables; -- MNode 状态 SHOW MNODES; SELECT * FROM information_schema.ins_mnodes;代码示例客户端连接优化# 不好频繁建连for_inrange(1000):conntaosws.connect(...)conn.execute(SELECT ...)conn.close()# 每次都要重新拉元数据# 好长连接复用conntaosws.connect(...)for_inrange(1000):conn.execute(SELECT ...)conn.close()# 更好连接池fromqueueimportQueueclassConnectionPool:def__init__(self,size10):self.poolQueue()for_inrange(size):self.pool.put(taosws.connect(...))defexecute(self,sql):connself.pool.get()try:returnconn.execute(sql)finally:self.pool.put(conn)大量建表优化# 不好逐表 CREATEforiinrange(100000):conn.execute(fCREATE TABLE d_{i}USING meters TAGS (Beijing))# 元数据更新 10 万次# 好写入时自动建表foriinrange(100000):conn.execute(f INSERT INTO d_{i}USING meters TAGS (Beijing) VALUES (NOW, 25.3) )# 更好Schemaless 批量lines[]foriinrange(100000):lines.append(fmeters,deviced_{i},locationBeijing current25.3{ts})conn.execute_schemaless(lines)性能考量元数据操作开销操作开销查询缓存命中 1µs查询缓存失效1~10ms拉元数据CREATE TABLE10~100msALTER TABLE10~100ms子表 INSERT自动建10ms 首次容量限制项典型上限单库子表数千万级单 STable 列数4096单 STable Tag 数128单库 STable 数万级FAQQ1: 元数据丢了怎么办MNode RAFT REPLICA 3 提供保护。极端情况从备份恢复联系官方支持Q2: 客户端缓存怎么手动刷新通常自动处理。手动可重连。Q3: 子表数过多影响性能内存占用大每子表 Tag元数据查询慢建议合理设计 Tag避免过细Q4: SHOW TABLES 慢子表数过多时慢。优化按超级表过滤用 LIMIT查 ins_tables 系统表带过滤Q5: MNode 数怎么选小集群1无 HA标准生产3超大集群3 或 5不需要太多MNode 不存数据。参考系统构架篇01-《TDengine 整体架构全景》02-《集群拓扑深度解析》03-《MNode 内部机制深度解析》04-《RPC 通信层深度解析》05-《VNode 生命周期》06-《RAFT 共识协议》07-《端到端的消息流》数据模型01-《数据库创建与参数详解》02-《超级表/子表/普通表》03-《支持数据类型深度解析》04-《TDengine Tag 设计哲学与 Schema 变更机制》05-《TDengine 虚拟表实现原理》存储引擎01-《TDengine 存储引擎概览》02-《TDengine MemTable 深度解析》03-《TDengine WAL 预写日志机制》04-《TDengine 数据文件格式》05-《TDengine Commit 与 Flush 机制 》06-《TDengine Compaction 合并策略 》07-《TDengine 数据保留与 TTL》08-《TDengine 压缩编码机制》09-《TDengine Cache 与 Last 查询加速》10-《TDengine 逻辑计划生成》查询引擎01-《TDengine 查询引擎概览》02-《TDengine SQL 解析与词法分析》03-《TDengine 语义分析与 AST 重写》04-《TDengine 逻辑计划生成》05-《TDengine 物理计划生成》06-《TDengine 扫描算子》07-《TDengine 聚合算子》08-《TDengine 连接算子》09-《TDengine 排序、填充与投影》10-《TDengine 分布式查询执行》11-《TDengine EXPLAIN 与查询优化》数据写入01-《TDengine SQL INSERT》02-《TDengine 无模式写入》03-《TDengine STMT 写入》04-《TDengine 写入内部流程》05-《TDengine 数据更新删除》数据订阅01-《TDengine 数据订阅》02-《TDengine 订阅 vs Kafka》03-《TDengine TMQ 消费流程》04-《TDengine 内部机制》05-《TDengine TMQ 最佳实践》预聚合01-《TDengine RSMA》02-《TDengine TSMA — 时间维度的物化聚合视图》03-《TDengine SMA 内部实现》索引01-《TDengine Tag 索引》02-《TDengine SMA 索引》SQL 语句01-《TDengine DDL》02-《TDengine DML SELECT》03-《TDengine DML 函数完整参考》04-《TDengine JOIN 完整语法》05-《TDengine 窗口完整语法》06-《TDengine 操作符与表达式》07-《TDengine 系统表》08-《TDengine SQL 与标准 SQL 差异》客户端与连接器01-《TDengine 的连接方式》02-《TDengine C/C 连接器》03-《TDengine java 连接器》04-《TDengine Python 连接器》05-《TDengine Go 与 Rust 连接器》06-《TDengine Node.js 与 C# 连接器》运维01-《TDengine 部署指南》02-《TDengine 配置详解》03-《TDengine 监控系统》04-《TDengine 备份与恢复》05-《TDengine 版本升级》06-《TDengine 加密使用指南》安全01-《TDengine 认证与权限》02-《TDengine 认证与权限》03-《TDengine 审计日志》生态01-《TDengine taosAdapter》02-《TDengine taosX 与 Explorer》03-《TDengine Grafana 集成》04-《TDengine 第三方工具》应用案例01-《TDengine IoT 设备监控》02-《TDengine 工业大数据与智能制造》03-《TDengine 车联网与新能源汽车》04-《TDengine 能源与电力监控》05-《TDengine IT 运维与可观测性》产品对比01-《TDengine vs InfluxDB》02-《TDengine vs TimescaleDB》03-《TDengine vs IoTDB/ClickHouse》内部机制01-《TDengine 内存管理》02-《TDengine 线程模型》03-《TDengine 错误处理》关于 TDengineTDengine 专为物联网IoT平台、工业大数据平台设计。其中TDengine TSDB 是一款高性能、分布式的时序数据库Time Series Database同时它还带有内建的缓存、流式计算、数据订阅等系统功能TDengine IDMP 是一款AI原生工业数据管理平台它通过树状层次结构建立数据目录对数据进行标准化、情景化并通过 AI 提供实时分析、可视化、事件管理与报警等功能。
返回列表