TiDB HTAP分布式数据库架构与存算分离设计实战

TiDB整体架构与组件职责

TiDB是PingCAP开源的分布式HTAP(Hybrid Transactional and Analytical Processing)数据库,兼容MySQL协议,支持水平扩缩容和强一致性事务。TiDB的存算分离架构将SQL计算层与存储层解耦,OLTP和OLAP负载使用各自的存储引擎但共享同一份数据,无需ETL同步。本文从TiDB架构设计、TiFlash列存引擎、数据同步机制和部署调优四个方面展开实战配置。

TiDB集群由三个核心组件构成:TiDB Server(SQL层)、TiKV(行存存储层)和PD(Placement Driver,调度协调层)。TiFlash作为可选组件提供列存引擎,支撑OLAP分析查询。

TiDB Server是无状态的SQL计算节点,接收客户端连接,解析SQL,生成执行计划,通过gRPC从TiKV读取数据。TiDB节点间无数据共享,可以水平扩展计算能力,应用层通过负载均衡(如HAProxy)分发请求。

TiKV是分布式KV存储引擎,基于RocksDB构建,采用Raft协议保证多副本一致性。数据按Region(默认96MB)分片,每个Region有Leader和Follower副本,Leader负责读写请求。PD自动调度Region到不同节点实现负载均衡。

PD是集群的大脑,负责全局时间戳分配(TSO)、Region调度和数据副本位置管理。PD通过心跳感知TiKV节点状态,自动迁移Region副本实现故障自愈和扩缩容协调。

TiFlash列存引擎与HTAP数据同步

TiFlash是TiDB的列式存储扩展,基于ClickHouse的MergeTree引擎改进。TiFlash与本节点的TiKV共存部署时,通过Raft Learner机制异步复制数据,TiKV写入数据后通过Raft日志同步到TiFlash,延迟通常在百毫秒级别。

TiFlash的列式存储对分析查询有天然优势。聚合查询只需扫描涉及的列,I/O量大幅降低。向量化执行引擎批量处理数据,CPU缓存命中率高。对于星型模型查询(Fact表关联多张Dimension表),TiFlash的MPP模式在多个节点间并行执行,利用分布式计算加速大表扫描。

-- 创建表时指定TiFlash副本
ALTER TABLE orders SET TIFLASH REPLICA 2;

-- 查看TiFlash副本同步状态
SELECT * FROM information_schema.tiflash_replica WHERE table_name = 'orders';

-- 强制查询走TiFlash列存引擎(分析场景)
SET tidb_isolation_read_engines = 'tiflash,tidb';
SELECT region, count(*) as order_count, sum(amount) as total_amount
FROM orders
WHERE create_time >= '2026-01-01'
GROUP BY region
ORDER BY total_amount DESC;

-- 恢复默认引擎选择
SET tidb_isolation_read_engines = 'tikv,tiflash,tidb';

TiDB的优化器自动判断查询走TiKV行存还是TiFlash列存。点查询和小范围范围扫描走TiKV,大表全表扫描和聚合分析走TiFlash。通过hint或session变量可以强制指定引擎。

存算分离架构与多租户资源隔离

TiDB 7.x版本引入Resource Control功能,实现存算分离架构下的资源隔离。每个Resource Group绑定RU(Request Unit)配额,RU是CPU、I/O和内存资源的统一计量单位。

-- 创建Resource Group
CREATE RESOURCE GROUP IF NOT EXISTS oltp_group
  RU_PER_SEC = 2000
  PRIORITY = HIGH;

CREATE RESOURCE GROUP IF NOT EXISTS olap_group
  RU_PER_SEC = 500
  PRIORITY = LOW;

-- 将用户绑定到Resource Group
ALTER USER 'oltp_user' RESOURCE GROUP oltp_group;
ALTER USER 'olap_user' RESOURCE GROUP olap_group;

-- 查看Resource Group使用情况
SELECT * FROM information_schema.resource_groups;

oltp_group分配2000 RU/s和高优先级,保证在线交易响应延迟。olap_group分配500 RU/s和低优先级,分析查询不会抢占OLTP资源。当OLAP查询消耗超过配额时自动限流,防止分析任务影响在线交易。

数据分片与Raft多副本配置

TiKV的数据分片是自动的,应用层无需关心分片键设计。新写入的数据PD会自动分配Region,当Region超过96MB时自动分裂。Region的副本数由集群配置决定,通常设为3(三副本Raft)。

-- 查看Region分布
SHOW TABLE regions;

-- 查看Region分布详情
SELECT 
  TABLE_NAME,
  REGION_ID,
  START_KEY,
  END_KEY,
  LEADER_STORE_ID,
  PEERS
FROM information_schema.tikv_region_status
WHERE TABLE_NAME = 'orders'
LIMIT 10;

对于已知热点写入的表(如自增ID主键),可以使用SHARD_ROW_ID_BITS打散Region,避免写入集中在单个Region Leader:

CREATE TABLE orders (
  id BIGINT PRIMARY KEY AUTO_RANDOM,
  user_id BIGINT NOT NULL,
  amount DECIMAL(10,2),
  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_user (user_id),
  INDEX idx_time (create_time)
) SHARD_ROW_ID_BITS 4 PRE_SPLIT_REGIONS 4;

AUTO_RANDOM替代AUTO_INCREMENT,主键值是随机分布的,写入自动打散到多个Region。SHARD_ROW_ID_BITS=4表示16个分片,PRE_SPLIT_REGIONS=4在建表时预分裂为16个Region,避免冷启动热点。这套组合方案是TiDB处理高并发写入的标准实践。

分布式事务与MVCC一致性读

TiDB实现Percolator事务模型,通过两阶段提交(2PC)保证跨Region事务的ACID。事务开始时从PD获取全局唯一递增时间戳作为事务版本号,提交时进行冲突检测。

-- 显式事务
BEGIN OPTIMISTIC;
  UPDATE accounts SET balance = balance - 100 WHERE user_id = 1001;
  UPDATE accounts SET balance = balance + 100 WHERE user_id = 1002;
COMMIT;

-- 悲观事务模式(默认)
BEGIN PESSIMISTIC;
  SELECT balance FROM accounts WHERE user_id = 1001 FOR UPDATE;
  UPDATE accounts SET balance = balance - 100 WHERE user_id = 1001;
  UPDATE accounts SET balance = balance + 100 WHERE user_id = 1002;
COMMIT;

乐观事务在COMMIT时才检测写冲突,高冲突场景下重试代价大。悲观事务在执行DML时即加锁,冲突时立即报错,适合传统金融交易场景。TiDB 7.x默认使用悲观事务模式,与MySQL行为一致。

MVCC机制支持一致性快照读。每个事务看到的是事务开始时刻的数据版本,不受其他事务提交影响:

-- 设置事务隔离级别
SET @@session.tidb_isolation_read_engines = 'tikv';
SET @@session.tx_isolation = 'REPEATABLE-READ';

-- 历史数据查询(通过TSO回溯)
SET @@session.tidb_snapshot = '430736681014603776';
SELECT count(*) FROM orders;
SET @@session.tidb_snapshot = '';

TiDB集群部署与监控配置

生产环境推荐使用TiUP工具部署集群。下面是一个3 TiDB + 3 TiKV + 3 PD + 2 TiFlash的拓扑配置:

# topology.yaml
global:
  user: tidb
  ssh_port: 22
  deploy_dir: /data/tidb-deploy
  data_dir: /data/tidb-data

tidb_servers:
  - host: 10.0.1.31
  - host: 10.0.1.32
  - host: 10.0.1.33

tikv_servers:
  - host: 10.0.1.41
    port: 20160
    status_port: 20180
  - host: 10.0.1.42
  - host: 10.0.1.43

pd_servers:
  - host: 10.0.1.21
  - host: 10.0.1.22
  - host: 10.0.1.23

tiflash_servers:
  - host: 10.0.1.51
    data_dir: /data/tiflash-data
  - host: 10.0.1.52

TiKV节点建议使用NVMe SSD,TiFlash节点配置大内存。TiFlash的内存用于缓存列存数据块,内存越大缓存命中率越高。PD部署在独立节点上避免与TiKV竞争资源。TiKV节点配置多块磁盘时,TiUP支持指定多data_dir路径实现磁盘级负载均衡。

Grafana监控Dashboard覆盖集群健康状况的各个维度。关键指标包括:QPS、延迟分位值(P99/P999)、Region数量与大小分布、Raft提案处理速度、TiFlash同步延迟。PD的调度面板显示Region迁移和Balance进度,扩缩容操作期间需要关注该面板确认调度完成。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/tidbhtap-fen-bu-shi-shu-ju-ku-jia-gou-yu-cun-suan-fen-li/

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

相关推荐