本文档详细介绍TiDB数据库参数优化的生产最佳实践,包括TiDB、TiKV、PD各层参数的配置方法、优化策略、监控手段等内容。风哥教程参考TiDB官方文档配置参数手册、性能调优指南等内容,适合DBA在生产环境中进行TiDB参数优化。
Part01-基础概念与理论知识
1.1 TiDB参数体系概述
TiDB数据库参数分为三个层次:TiDB层参数、TiKV层参数、PD层参数。每个层次的参数负责不同的功能模块,合理的参数配置是保障TiDB集群高性能运行的关键。
- TiDB层参数:SQL执行、连接管理、事务控制等
- TiKV层参数:存储引擎、RocksDB、Raft协议等
- PD层参数:调度策略、负载均衡、副本管理等
1.2 参数类型与作用域
TiDB参数按作用域分为全局参数和会话参数:
- 全局参数(Global):影响整个集群,需要管理员权限修改
- 会话参数(Session):仅影响当前会话,普通用户可以修改
- 实例参数(Instance):仅影响单个实例,通过配置文件设置
1.3 参数优化原理
参数优化的核心原则:
- 了解业务场景:OLTP、OLAP、HTAP不同场景参数不同
- 基于监控数据:根据实际监控指标调整参数
- 渐进式调整:小步调整,观察效果
- 文档化记录:记录每次调整及效果
Part02-生产环境规划与建议
2.1 TiDB层参数规划
TiDB层核心参数配置建议:
# 1. 连接相关参数
max_connections = 1000 # 最大连接数,根据业务规模调整
max_execution_time = 300000 # 最大执行时间(ms),防止慢查询
wait_timeout = 28800 # 连接空闲超时时间(秒)
# 2. 内存相关参数
tidb_mem_quota_query = 1073741824 # 单条查询内存限制(1GB)
tidb_mem_quota_apply_cache = 33554432 # Apply缓存内存限制(32MB)
# 3. 并发相关参数
tidb_distsql_scan_concurrency = 15 # DistSQL扫描并发度风哥提示:
tidb_index_lookup_concurrency = 4 # 索引查找并发度
tidb_index_lookup_size = 20000 # 索引查找批量大小
tidb_hash_join_concurrency = 5 # Hash Join并发度
tidb_projection_concurrency = 4 # Projection并发度
# 4. 事务相关参数
tidb_txn_mode = “pessimistic” # 事务模式:乐观/悲观
tidb_disable_txn_auto_retry = 0 # 是否禁用事务自动重试
tidb_retry_limit = 10 # 事务重试次数限制
# 5. 执行计划相关参数
tidb_enable_pseudo_for_outdated_stats = 0 # 统计信息过期时使用伪统计信息
tidb_enable_stmt_summary = 1 # 开启Statement Summary
tidb_stmt_summary_history_size = 24 # Statement Summary历史记录数
2.2 TiKV层参数规划
TiKV层核心参数配置建议:
# 1. 存储相关参数
[rocksdb.defaultcf]
block-cache-size = “32GB” # 默认CF块缓存大小
write-buffer-size = “128MB” # 写缓冲区大小
max-write-buffer-number = 5 # 最大写缓冲区数量
level0-slowdown-writes-trigger = 20
level0-stop-writes-trigger = 36
[rocksdb.writecf]
block-cache-size = “16GB” # 写CF块缓存大小
write-buffer-size = “128MB”
[rocksdb.lockcf]
block-cache-size = “4GB” # 锁CF块缓存大小
# 2. Raft相关参数
[raftstore]
sync-log = true # 是否同步日志
raft-base-tick-interval = “1s” # Raft基础tick间隔
raft-heartbeat-ticks = 2 # Raft心跳tick数
raft-election-timeout-ticks = 10 # Raft选举超时tick数
max-peer-down-duration = “5m” # 最大Peer下线时间
# 3. 调度相关参数
[raftstore]
apply-max-batch-size = 2048 # Apply最大批量大小
apply-pool-size = 4 # Apply线程池大小
store-max-batch-size = 2048 # Store最大批量大小
store-pool-size = 4 # Store线程池大小
# 4. 存储引擎参数
[storage]
scheduler-worker-pool-size = 8 # 调度器工作线程池大小
enable-async-apply-prewrite = true # 开启异步Apply Prewrite
2.3 PD层参数规划
PD层核心参数配置建议:
# 1. 调度相关参数
[schedule]
max-merge-region-size = 20 # 最大合并Region大小(MB)
max-merge-region-keys = 200000 # 最大合并Region键数
merge-schedule-limit = 8 # 合并调度限制
region-schedule-limit = 2048 # Region调度限制
replica-schedule-limit = 64 # 副本调度限制
leader-schedule-limit = 4 # Leader调度限制
# 2. 副本相关参数
[replication]
max-replicas = 3 # 最大副本数
location-labels = [“zone”, “host”] # 位置标签
isolation-level = “zone” # 隔离级别
# 3. 负载均衡参数
[schedule]
leader-schedule-policy = “count” # Leader调度策略
enable-cross-table-merge = true # 开启跨表合并
enable-one-way-merge = false # 关闭单向合并
# 4. 热点处理参数
[hot-schedule]
hot-region-schedule-limit = 4 # 热点Region调度限制
hot-region-cache-hits-threshold = 3 # 热点Region缓存命中阈值
Part03-生产环境项目实施方案
3.1 参数配置实战
3.1.1 查看和修改TiDB参数
学习交流加群风哥QQ113257174
mysql> show variables;
+—————————————-+——————————–+
| Variable_name | Value |
+—————————————-+——————————–+
| max_connections | 1000 |
| tidb_mem_quota_query | 1073741824 |
| tidb_distsql_scan_concurrency | 15 |
| tidb_txn_mode | pessimistic |
| … | … |
+—————————————-+——————————–+
500 rows in set (0.02 sec)
# 2. 查看特定参数
mysql> show variables like ‘%concurrency%’;
+—————————————-+——-+
| Variable_name | Value |
+—————————————-+——-+
| tidb_distsql_scan_concurrency | 15 |
| tidb_index_lookup_concurrency | 4 |
| tidb_hash_join_concurrency | 5 |
| tidb_projection_concurrency | 4 |
+—————————————-+——-+
4 rows in set (0.01 sec)
# 3. 修改全局参数
mysql> set global max_connections = 2000;
Query OK, 0 rows affected (0.01 sec)
mysql> set global tidb_mem_quota_query = 2147483648;
Query OK, 0 rows affected (0.01 sec)
# 4. 修改会话参数
mysql> set session tidb_distsql_scan_concurrency = 30;
Query OK, 0 rows affected (0.00 sec)
# 5. 验证修改
mysql> show variables like ‘max_connections’;
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 2000 |
+—————–+——-+
1 row in set (0.00 sec)
3.1.2 修改TiKV参数
# vi /tidb/app/tikv-20160/conf/tikv.toml
[rocksdb.defaultcf]
block-cache-size = “32GB”
write-buffer-size = “128MB”
max-write-buffer-number = 5
[raftstore]
sync-log = true
raft-base-tick-interval = “1s”
raft-heartbeat-ticks = 2
raft-election-timeout-ticks = 10
# 2. 使用tikv-ctl在线修改参数(部分参数支持)
# tiup ctl:v7.5.0 tikv –host 192.168.1.11:20160 modify-tikv-config -n rocksdb.defaultcf.block-cache-size -v 32GB
# 3. 重启TiKV生效
# tiup cluster restart fgedudb -N 192.168.1.11:20160
# 4. 验证参数
# tiup ctl:v7.5.0 tikv –host 192.168.1.11:20160 get-config
{
“rocksdb”: {
“defaultcf”: {
“block-cache-size”: “32GB”,
“write-buffer-size”: “128MB”
}
},
“raftstore”: {
“sync-log”: true,
“raft-base-tick-interval”: “1s”
}
}
3.2 参数监控方法
3.2.1 使用Grafana监控参数效果
# http://192.168.1.10:3000
# 2. 查看TiDB监控Dashboard
# 关键监控指标:
– Query Duration:查询延迟
– QPS:每秒查询数
– Connection Count:连接数
– Memory Usage:内存使用
– Coprocessor Cache Hit:Coprocessor缓存命中率
# 3. 查看TiKV监控Dashboard
# 关键监控指标:
– Storage Size:存储大小
– Region Count:Region数量
– Leader Count:Leader数量
– CPU Usage:CPU使用率
– Memory Usage:内存使用率
– Block Cache Hit:块缓存命中率
# 4. 当前监控数据示例
Query Duration (99th percentile): 15ms
QPS: 3,500
Connection Count: 245
TiKV Memory Usage: 58GB/64GB
Block Cache Hit Ratio: 96.5%
3.2.2 使用Statement Summary分析
mysql> show variables like ‘tidb_enable_stmt_summary’;
+————————–+——-+
| Variable_name | Value |
+————————–+——-+
| tidb_enable_stmt_summary | ON |
+————————–+——-+
1 row in set (0.00 sec)
# 2. 查看Statement Summary表
mysql> select * from information_schema.statements_summary limit 5;
+——————-+———————————-+————+————+————+———-+
| SCHEMA_NAME | DIGEST_TEXT | EXEC_COUNT | AVG_LATENCY| MAX_LATENCY| AVG_MEM |
+——————-+———————————-+————+————+————+———-+
| fgedudb01 | select * from fgedu_users where | 12500 | 2.5ms | 150ms | 1.2MB |
| fgedudb01 | insert into fgedu_orders values | 8500 | 5.2ms | 200ms | 0.8MB |
| fgedudb01 | update fgedu_products set stock | 3200 | 8.1ms | 350ms | 0.5MB |
| fgedudb01 | delete from fgedu_logs where | 1500 | 12.3ms | 500ms | 2.1MB |
| fgedudb01 | select count(*) from fgedu_orders| 2800 | 150ms | 2000ms | 15MB |
+——————-+———————————-+————+————+————+———-+
5 rows in set (0.02 sec)
# 3. 分析慢查询
mysql> select * from information_schema.statements_summary
-> where avg_latency > 1000000000 # 大于1秒
-> order by avg_latency desc limit 10;
3.3 参数调优流程
3.3.1 标准调优流程
# tidb-param-tune.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# TiDB参数调优标准流程
# 步骤1:收集基线数据
echo “步骤1:收集基线数据”
# 记录当前参数配置
tidb-current-params.log
# 记录当前性能指标
# – QPS
# – 延迟
# – 资源使用率
# 步骤2:识别瓶颈
echo “步骤2:识别性能瓶颈”
# 分析慢查询日志
# 分析Grafana监控
# 分析Statement Summary
# 步骤3:制定优化方案
echo “步骤3:制定优化方案”
# 根据瓶颈类型选择优化参数
# – CPU瓶颈:增加并发度参数
# – 内存瓶颈:调整内存限制参数
# – IO瓶颈:调整缓存参数
# 步骤4:测试环境验证
echo “步骤4:测试环境验证”
# 在测试环境应用参数
# 运行压力测试
# 验证性能提升
# 步骤5:生产环境实施
echo “步骤5:生产环境实施”
# 选择低峰期实施
# 逐个参数调整
# 观察监控指标
# 步骤6:效果评估
echo “步骤6:效果评估”
# 对比优化前后指标
# 记录优化效果
# 文档化经验
echo “参数调优完成”
Part04-生产案例与实战讲解
4.1 OLTP场景优化案例
4.1.1 电商交易系统优化
# – 业务类型:电商交易系统
# – 数据量:500GB
# – 并发:2000连接
# – 特点:高并发、短事务、点查为主
# 优化前问题
# – QPS峰值时延迟升高
# – 部分查询超时
# – 内存使用不稳定
# 优化参数配置
# TiDB层参数
max_connections = 3000
tidb_mem_quota_query = 536870912 # 512MB,限制单查询内存
tidb_distsql_scan_concurrency = 8 # 降低并发,减少资源争抢
tidb_index_lookup_concurrency = 8
tidb_index_lookup_size = 5000 # 减小批量大小
tidb_txn_mode = “pessimistic”
tidb_enable_pseudo_for_outdated_stats = 0
tidb_enable_stmt_summary = 1
# TiKV层参数
[rocksdb.defaultcf]
block-cache-size = “24GB” # 增加缓存
write-buffer-size = “64MB” # 减小写缓冲
max-write-buffer-number = 3
[raftstore]
apply-pool-size = 8 # 增加Apply线程
store-pool-size = 8 # 增加Store线程
# 优化效果
# – QPS提升40%:从8000提升到11200
# – 平均延迟降低50%:从15ms降低到7.5ms
# – 99分位延迟降低60%:从150ms降低到60ms
# – 内存使用稳定
# 验证结果
mysql> show status like ‘QPS’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| QPS | 11234 |
+—————+——-+
1 row in set (0.00 sec)
mysql> select avg(latency) from information_schema.statements_summary
-> where digest_text like ‘select%fgedu_orders%’;
+————–+
| avg(latency) |
+————–+
| 7.2ms |
+————–+
1 row in set (0.01 sec)
4.2 OLAP场景优化案例
4.2.1 数据分析系统优化
# – 业务类型:数据分析报表系统
# – 数据量:2TB
# – 并发:50连接
# – 特点:复杂查询、全表扫描、聚合计算
# 优化前问题
# – 复杂查询执行时间长
# – 大量数据扫描
# – 临时内存不足
# 优化参数配置
# TiDB层参数
tidb_mem_quota_query = 8589934592 # 8GB,增加查询内存限制
tidb_distsql_scan_concurrency = 50 # 增加扫描并发
tidb_index_lookup_concurrency = 16
tidb_hash_join_concurrency = 16 # 增加Hash Join并发
tidb_hash_agg_partial_concurrency = 16
tidb_hash_agg_final_concurrency = 16
tidb_projection_concurrency = 16
tidb_enable_table_partition = 1 # 开启分区表支持
# TiKV层参数
[rocksdb.defaultcf]
block-cache-size = “64GB” # 大幅增加缓存
write-buffer-size = “256MB”
max-write-buffer-number = 6
[storage]
scheduler-worker-pool-size = 16 # 增加调度线程
# TiFlash参数(如果使用)
max_memory_usage = 68719476736 # 64GB
# 优化效果
# – 复杂查询性能提升300%
# – 全表扫描时间减少70%
# – 聚合查询性能提升200%
# 验证结果
# 优化前:select count(*) from fgedu_logs where created_at > ‘2024-01-01’
# 执行时间:120s
# 优化后
mysql> select count(*) from fgedu_logs where created_at > ‘2024-01-01’;
+———-+
| count(*) |
+———-+
| 50000000 |
+———-+
1 row in set (35.2 sec) # 提升3.4倍
4.3 HTAP场景优化案例
4.3.1 混合负载系统优化
# – 业务类型:实时风控系统
# – 数据量:1TB
# – 并发:TP 1000连接 + AP 20连接
# – 特点:同时处理交易和分析查询
# 优化策略
# – 使用TiFlash进行OLAP查询
# – TiKV专注于OLTP
# – 资源隔离
# 优化参数配置
# TiDB层参数
# 使用资源组进行隔离
mysql> create resource group if not exists fgedu_oltp ru_per_sec = 800;
Query OK, 0 rows affected (0.02 sec)
mysql> create resource group if not exists fgedu_olap ru_per_sec = 200;
Query OK, 0 rows affected (0.01 sec)
# 绑定用户到资源组
mysql> alter user fgedu_oltp resource group fgedu_oltp;
Query OK, 0 rows affected (0.01 sec)
mysql> alter user fgedu_olap resource group fgedu_olap;
Query OK, 0 rows affected (0.01 sec)
# TiDB层通用参数
max_connections = 2000
tidb_mem_quota_query = 2147483648 # 2GB
tidb_enable_tiflash_read_for_write_stmt = 1
tidb_isolation_read_engines = “tikv,tiflash”
# TiKV层参数
[rocksdb.defaultcf]
block-cache-size = “32GB”
# TiFlash层参数
max_memory_usage = 34359738368 # 32GB
max_threads = 16
# 优化效果
# – TP查询延迟稳定在10ms以内
# – AP查询性能提升250%
# – 资源争抢减少80%
# 验证资源隔离效果
mysql> select * from information_schema.resource_groups;
+————-+————+———-+————+
| NAME | RU_PER_SEC | PRIORITY | BURSTABLE |
+————-+————+———-+————+
| default | UNLIMITED | MEDIUM | YES |
| fgedu_oltp | 800 | HIGH | NO |
| fgedu_olap | 200 | LOW | NO |
+————-+————+———-+————+
3 rows in set (0.01 sec)
Part05-风哥经验总结与分享
5.1 参数优化最佳实践
TiDB参数优化最佳实践总结:
- 渐进式调整:每次只调整一个参数,观察效果后再调整下一个
- 基于数据:所有调整都基于监控数据和性能指标
- 文档记录:记录每次调整的内容、原因和效果
- 测试验证:所有调整先在测试环境验证
- 回滚准备:每次调整前准备好回滚方案
5.2 常见错误与避免
# 错误:认为并发度越高性能越好
# 正确:根据CPU核心数和业务类型设置合理并发度
# 建议:并发度 = CPU核心数 * 1.5
# 常见错误2:内存参数设置过大
# 错误:将所有内存都分配给TiDB/TiKV
# 正确:预留20-30%内存给操作系统和其他进程
# 建议:TiKV block-cache-size = 总内存 * 0.45
# 常见错误3:忽略RocksDB参数
# 错误:只调整TiDB层参数
# 正确:TiKV层RocksDB参数对性能影响巨大
# 建议:重点关注block-cache-size和write-buffer参数
# 常见错误4:生产环境直接修改
# 错误:未经测试直接在生产环境修改参数
# 正确:先在测试环境验证
# 建议:建立完整的测试流程
# 常见错误5:修改后不验证
# 错误:修改参数后不关注效果
# 正确:修改后持续监控关键指标
# 建议:修改后观察至少24小时
5.3 参数优化检查清单
# tidb-param-checklist.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# TiDB参数优化检查清单
echo “=== TiDB参数优化检查清单 ===”
# 1. 连接参数检查
echo “[ ] max_connections是否根据业务规模设置?”
echo “[ ] wait_timeout是否合理?”
echo “[ ] max_execution_time是否设置?”
# 2. 内存参数检查
echo “[ ] tidb_mem_quota_query是否设置上限?”
echo “[ ] TiKV block-cache-size是否合理?”
echo “[ ] 是否预留足够内存给OS?”
# 3. 并发参数检查
echo “[ ] 并发度参数是否与CPU核心数匹配?”
echo “[ ] distsql_scan_concurrency是否合理?”
echo “[ ] hash_join_concurrency是否合理?”
# 4. 事务参数检查
echo “[ ] 事务模式是否选择正确(乐观/悲观)?”
echo “[ ] 事务重试参数是否设置?”
echo “[ ] 事务超时参数是否设置?”
# 5. 存储参数检查
echo “[ ] RocksDB写缓冲区大小是否合理?”
echo “[ ] RocksDB块缓存大小是否合理?”
echo “[ ] sync-log是否开启?”
# 6. 监控参数检查
echo “[ ] Statement Summary是否开启?”
echo “[ ] 慢查询日志是否开启?”
echo “[ ] 监控采集是否完整?”
# 7. 备份参数检查
echo “[ ] 自动备份是否配置?”
echo “[ ] 备份保留策略是否设置?”
echo “=== 检查完成 ===”
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
