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/