TiDB分布式HTAP数据库行列混合引擎与实时分析查询优化

TiDB HTAP架构与行列双引擎设计

TiDB作为开源分布式HTAP数据库,核心设计目标是同一集群内同时承载OLTP事务处理和OLAP分析查询。传统架构中这两类负载通常由独立系统承担——MySQL/PostgreSQL处理事务,ClickHouse/StarRocks处理分析,中间通过ETL或CDC同步数据,延迟和运维复杂度是主要痛点。

TiDB 7.x的HTAP架构由两个存储引擎协同工作:TiKV行存储引擎处理事务读写,TiFlash列存储引擎加速分析查询。两引擎共享同一份Raft日志流,数据通过Raft learner协议异步复制到TiFlash,保证事务一致性。行存和列存的数据在物理上独立存储,逻辑上对用户透明——SQL优化器自动根据查询特征选择最优执行路径。

TiFlash列存储引擎内部结构

TiFlash基于ClickHouse的DeltaTree存储引擎改造,核心数据结构包括:

DTSegment:数据段,每个段包含一个稳定数据区和多个增量数据区。稳定区数据按列存储并压缩,增量区接纳实时写入。段内数据按主键排序,支持高效的范围扫描和主键查找。

Delta Cache:写入缓冲区,新写入的数据先进入Delta Cache,累积到阈值后刷入增量区。这种设计使TiFlash在保持列存高压缩比的同时,对实时写入有良好的吞吐能力。

DMFile:磁盘文件格式,每列独立存储,支持LZ4/ZSTD压缩。数值列的压缩率通常在5:1到10:1之间,字符串列的压缩率取决于数据重复度。

TiFlash节点通过Raft Learner角色订阅TiKV的变更日志,数据同步延迟通常在百毫秒到秒级。对于强一致性分析查询,可通过SET tidb_isolation_read_engines = "tiflash"强制读取TiFlash,或在SQL hint中使用/*+ read_from_storage(tiflash[table_name]) */指定。

行列混合执行计划选择

TiDB优化器在生成执行计划时评估行存和列存两种路径的代价,选择成本更低的方案。关键判断逻辑:

纯点查和窄范围扫描走TiKV行存。行存对主键或索引点查的效率远高于列存,单行读取只需一次IO。

聚合分析和宽表扫描走TiFlash列存。列存只读取查询涉及的列,避免无关列的IO开销;列式压缩减少磁盘读取量;向量化执行引擎对批量数据处理效率高。

混合场景(OLTP查询中包含少量聚合)通过optimizer_switch控制:

SET SESSION tidb_opt_agg_push_down = 1;

SET SESSION tidb_allow_batch_cop = 1;

agg_push_down将聚合操作下推到存储层执行,减少网络传输数据量。allow_batch_cop允许TiFlash以批量模式执行Coprocessor请求,提升分析查询的并发效率。

查看优化器的引擎选择决策:

EXPLAIN ANALYZE SELECT region, SUM(amount) FROM orders GROUP BY region;

执行计划中的Storage列显示实际使用的存储引擎,如果出现TiKV而预期是TiFlash,需检查统计信息是否过期或是否被hint覆盖。

实时分析查询性能调优

TiDB HTAP场景下的性能调优围绕列存引擎和查询执行两个维度展开。

TiFlash副本数配置:至少2个副本保证高可用,分析查询负载大时增加到3-4个。副本数通过Placement Rules控制:

ALTER DATABASE analytics SET PLACEMENT POLICY = 'tiflash_2replicas';

Region副本调度:大表Region数量过多时,TiFlash的Raft learner同步开销增大。通过Region Merge减少Region数量:

SET config pd scheduler-max-merge-region-size = 96;

SET config pd scheduler-max-merge-region-keys = 960000;

列存数据压缩优化:对历史分区使用更高压缩比,降低存储成本:

ALTER TABLE orders MODIFY COLUMN data_compression = 'zstd' PARTITION p_before_2025;

内存控制:TiFlash的查询内存使用上限默认为单查询10GB,大分析查询可能超限。调整方式:

SET config tiflash max_memory_usage = 20000000000; -- 20GB

SET config tiflash max_memory_usage_for_all_queries = 80000000000; -- 80GB

spill to disk机制在内存不足时自动将中间结果溢写到磁盘,避免OOM。但溢写会显著降低查询速度,生产环境应通过合理设置内存上限和并发度来尽量避免。

典型场景部署架构

电商实时报表场景的推荐部署架构:

OLTP节点:3个TiKV节点(16C/64G/NVMe SSD),承载订单写入和查询。TiFlash节点:2个TiFlash节点(32C/128G/NVMe SSD + HDD冷数据),承载报表和实时大屏分析。PD节点:3个PD节点(4C/8G),与TiDB SQL节点混合部署。TiDB SQL节点:3个TiDB节点(8C/32G),根据查询类型设置read_from_storage hint。

监控核心指标:TiFlash同步延迟(raft_learn_duration)、列存段数量(segment_count)、查询执行耗时P99、内存使用率。告警阈值:同步延迟超过30秒、TiFlash节点CPU超过85%、查询耗时P99超过5分钟。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/tidb-fen-bu-shi-htap-shu-ju-ku-hang-lie-hun-he-yin-qing-yu/

(0)
小编小编
上一篇 8小时前
下一篇 8小时前

相关推荐