TiDB HTAP数据库实战:行列混合存储与在线实时分析查询方案

TiDB是开源的分布式HTAP(Hybrid Transactional and Analytical Processing)数据库,行存引擎TiKV处理OLTP事务,列存引擎TiFlash处理OLAP分析查询。两个引擎共享同一份数据,通过Raft Learner异步复制保持一致性。HTAP架构消除了传统数仓ETL搬运数据的延迟,支持在同一个数据库上同时执行事务写入和实时分析。

TiDB集群架构与组件部署

TiDB集群由三个核心组件构成:TiDB Server(SQL层,无状态,可水平扩展)、TiKV(行存节点,存储数据和Raft一致性协议)、PD(Placement Driver,调度和元数据管理)。TiFlash作为可插拔的列存节点,通过异步Raft Learner接收TiKV的数据变更。

# 使用TiUP部署TiDB集群
# 1. 安装TiUP
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
source ~/.bash_profile
tiup cluster

# 2. 编写集群拓扑文件 topology.yaml
pd_servers:
  - host: 10.0.1.1
  - host: 10.0.1.2
  - host: 10.0.1.3

tidb_servers:
  - host: 10.0.1.1
  - host: 10.0.1.2

tikv_servers:
  - host: 10.0.1.4
    data_dir: /data/tikv
  - host: 10.0.1.5
    data_dir: /data/tikv
  - host: 10.0.1.6
    data_dir: /data/tikv

tiflash_servers:
  - host: 10.0.1.7
    data_dir: /data/tiflash
  - host: 10.0.1.8
    data_dir: /data/tiflash

# 3. 部署集群
tiup cluster deploy tidb-prod 7.5.0 ./topology.yaml -u root -p

# 4. 启动集群
tiup cluster start tidb-prod

# 5. 检查集群状态
tiup cluster display tidb-prod

列存副本同步与强一致性读取

TiFlash通过Raft Learner角色从TiKV接收数据变更日志,异步应用到列存引擎。默认情况下TiFlash的数据有轻微延迟(通常在秒级)。对于需要强一致性的分析查询,TiDB提供Hint强制走TiFlash读取最新数据:

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

-- 为表添加TiFlash列存副本(2副本)
ALTER TABLE order_detail SET TIFLASH REPLICA 2;

-- 查看同步进度
SELECT * FROM information_schema.tiflash_replica 
WHERE table_schema = 'orders' AND table_name = 'order_detail';
-- PROGRESS字段为1.0表示同步完成

-- 强制走TiFlash列存查询(如果同步完成)
SELECT /*+ read_from_storage(tiflash[order_detail]) */ 
    region, COUNT(*) as order_count, SUM(amount) as total_amount
FROM order_detail
WHERE create_date >= '2026-09-01'
GROUP BY region;

-- 查看查询实际走了哪个引擎
EXPLAIN ANALYZE 
SELECT region, COUNT(*) FROM order_detail GROUP BY region;

行列混合查询路由机制

TiDB优化器自动选择行存或列存执行查询。OLTP点查优先走TiKV(行存更适合按主键查找),聚合分析优先走TiFlash(列存按列读取减少IO)。可以通过Hint手动干预:

-- 场景1:点查走TiKV行存(低延迟)
SELECT /*+ read_from_storage(tikv[order_detail]) */ * 
FROM order_detail WHERE order_id = 100001;

-- 场景2:大范围聚合走TiFlash列存(高吞吐)
SELECT /*+ read_from_storage(tiflash[order_detail]) */ 
    product_category, COUNT(DISTINCT user_id) as unique_users,
    AVG(amount) as avg_amount, MAX(amount) as max_amount
FROM order_detail
WHERE create_date BETWEEN '2026-01-01' AND '2026-09-30'
GROUP BY product_category ORDER BY unique_users DESC;

-- 场景3:行列混合Join
SELECT /*+ read_from_storage(tikv[users], tiflash[orders]) */
    u.user_name, u.region, o.total_orders, o.total_amount
FROM users u
JOIN (
    SELECT user_id, COUNT(*) as total_orders, SUM(amount) as total_amount
    FROM orders WHERE create_date >= '2026-09-01' GROUP BY user_id
) o ON u.id = o.user_id
WHERE u.vip_level >= 3;

在线DDL与表结构变更

TiDB的DDL操作在线执行,不阻塞业务读写。添加列、修改列类型、添加索引等操作在后台分批处理数据:

-- 在线添加索引(不阻塞DML)
ALTER TABLE order_detail ADD INDEX idx_user_date (user_id, create_date);

-- 查看DDL进度
ADMIN SHOW DDL JOBS;

-- 在线修改列类型
ALTER TABLE order_detail MODIFY COLUMN amount DECIMAL(15,2);

-- 添加生成列用于加速特定查询
ALTER TABLE order_detail ADD COLUMN (
    amount_cny DECIMAL(15,2) AS (amount * 7.25) STORED
);
CREATE INDEX idx_amount_cny ON order_detail(amount_cny);

数据分片与Region调度

TiKV以Region为单位存储数据,每个Region默认96MB。PD自动调度Region在多个TiKV节点间分布。热点Region会自动分裂并迁移:

-- 查看表的Region分布
SHOW TABLE order_detail REGIONS;

-- 查看热点Region
SELECT * FROM information_schema.hot_regions_history 
WHERE table_name = 'order_detail' ORDER BY start_time DESC LIMIT 10;

-- 使用SHARD_ROW_ID_BITS打散热点
CREATE TABLE order_detail (
    id BIGINT PRIMARY KEY,
    order_id BIGINT,
    amount DECIMAL(15,2),
    create_date DATE
) SHARD_ROW_ID_BITS 4 PRE_SPLIT_REGIONS 4;

-- 查看Region健康状态
SELECT STORE_ID, LEADER_COUNT, REGION_COUNT, REGION_SIZE
FROM information_schema.tikv_store_status
ORDER BY REGION_COUNT DESC;

备份恢复与数据迁移

TiDB提供BR(Backup and Restore)工具进行全量和增量备份。从MySQL迁移数据使用DM(Data Migration)或Lightning:

# 使用BR全量备份到S3
tiup br backup full \
    --pd "10.0.1.1:2379" \
    --storage "s3://tidb-backup/full-20260914" \
    --s3.endpoint "https://s3.example.com" \
    --ratelimit 128 --log-file backup.log

# 恢复
tiup br restore full \
    --pd "10.0.1.1:2379" \
    --storage "s3://tidb-backup/full-20260914" \
    --s3.endpoint "https://s3.example.com" \
    --log-file restore.log

# 使用TiDB Lightning从CSV快速导入
tiup tidb-lightning --config lightning.toml

# lightning.toml配置
[lightning]
level = "info"
tikv-importer = "local"
[mydumper]
data-source-dir = "/data/csv/"
[tikv-importer]
backend = "local"
sorted-kv-dir = "/data/sorted-kv/"

性能调优常见参数

-- 调整统计信息自动更新触发阈值
SET GLOBAL tidb_auto_analyze_ratio = 0.2;

-- 限制单条SQL内存使用
SET GLOBAL tidb_mem_quota_query = 1073741824;

-- 开启绑定执行计划(防止执行计划跳变)
CREATE SQL BINDING FOR
    SELECT * FROM order_detail WHERE user_id = 100
USING
    SELECT /*+ use_index(order_detail, idx_user) */ * FROM order_detail WHERE user_id = 100;

-- 查看绑定计划
SHOW SESSION BINDINGS;

TiDB的HTAP能力适合需要同时处理交易和分析的场景——电商订单系统在白天处理交易写入,夜间运行报表分析,无需ETL同步到独立数仓。TiFlash列存引擎在聚合查询上的性能优势明显,实测千万级数据量的GROUP BY查询,TiFlash比TiKV快5-10倍。代价是额外的存储空间和写入放大,需要根据分析查询频率权衡列存副本数量。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/tidbhtap-shu-ju-ku-shi-zhan-hang-lie-hun-he-cun-chu-yu-zai/

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

相关推荐