fgedu.net.cn
目录
一、基础概念
1.1 容量规划定义
容量规划是指根据业务需求和数据增长趋势,合理规划TiDB集群的硬件资源和配置,确保系统能够满足当前和未来的业务需求。容量规划涉及存储、计算、网络等多个方面。
1.2 性能优化定义
性能优化是指通过调整系统配置、SQL语句、索引设计等方式,提高TiDB集群的性能和响应速度。性能优化是一个持续的过程,需要根据业务需求和系统状态不断调整。
1.3 关键指标
- 存储容量:数据存储所需的空间
- 计算资源:CPU和内存的使用情况
- 网络带宽:网络传输的速度和容量
- QPS:每秒查询数
- 响应时间:SQL语句的执行时间
- 并发数:同时处理的请求数
二、规划建议
2.1 容量规划步骤
- 需求分析:分析业务需求和数据增长趋势
- 资源评估:评估当前资源使用情况
- 容量计算:计算所需的存储、计算和网络资源
- 扩展策略:制定资源扩展策略
- 监控与调整:持续监控和调整容量规划
2.2 存储容量规划
- 数据量估算:根据业务数据量和增长趋势估算存储需求
- 副本因子:考虑TiKV的多副本存储
- 预留空间:预留足够的空间用于数据增长和操作
- 存储介质:选择合适的存储介质(SSD、HDD)
2.3 计算资源规划
- CPU需求:根据QPS和查询复杂度估算CPU需求
- 内存需求:根据数据量和缓存需求估算内存需求
- 节点数量:根据业务需求和高可用要求确定节点数量
2.4 网络带宽规划
- 内部网络:集群内部节点间的网络带宽
- 外部网络:客户端与集群间的网络带宽
- 网络延迟:网络延迟对性能的影响
三、实施方案
3.1 容量计算
存储容量计算
# 存储容量计算公式
# 总存储容量 = 原始数据量 × 副本因子 × 压缩系数 × 预留系数
# 示例:
# 原始数据量:1TB
# 副本因子:3(TiKV默认3副本)
# 压缩系数:0.5(假设压缩率50%)
# 预留系数:1.5(预留50%空间)
# 总存储容量 = 1TB × 3 × 0.5 × 1.5 = 2.25TB
# 计算TiKV存储需求
tiup ctl:v7.5.0 pd -u http://192.168.1.10:2379 store
{"count": 3, "stores": [
{"store": {"id": 1, "address": "192.168.1.15:20160", "state": 0, "state_name": "Up", "version": "v7.5.0", "block_cache_capacity": "4GB", "capacity": "1073741824000", "available": "858993459200", "used_size": "214748364800", "leader_count": 100, "leader_weight": 1, "leader_score": 100, "leader_size": 1000000, "region_count": 300, "region_weight": 1, "region_score": 300, "region_size": 3000000, "start_ts": "2024-04-09T00:00:00Z", "last_heartbeat": "2024-04-09T10:00:00Z"},
{"store": {"id": 2, "address": "192.168.1.16:20160", "state": 0, "state_name": "Up", "version": "v7.5.0", "block_cache_capacity": "4GB", "capacity": "1073741824000", "available": "858993459200", "used_size": "214748364800", "leader_count": 100, "leader_weight": 1, "leader_score": 100, "leader_size": 1000000, "region_count": 300, "region_weight": 1, "region_score": 300, "region_size": 3000000, "start_ts": "2024-04-09T00:00:00Z", "last_heartbeat": "2024-04-09T10:00:00Z"},
{"store": {"id": 3, "address": "192.168.1.17:20160", "state": 0, "state_name": "Up", "version": "v7.5.0", "block_cache_capacity": "4GB", "capacity": "1073741824000", "available": "858993459200", "used_size": "214748364800", "leader_count": 100, "leader_weight": 1, "leader_score": 100, "leader_size": 1000000, "region_count": 300, "region_weight": 1, "region_score": 300, "region_size": 3000000, "start_ts": "2024-04-09T00:00:00Z", "last_heartbeat": "2024-04-09T10:00:00Z"}
]}
计算资源计算
# CPU需求估算
# 一般来说,每1000 QPS需要1个CPU核心
# 示例:预计QPS为5000,则需要5个CPU核心风哥提示:
# 内存需求估算
# TiDB内存需求:每100GB数据需要8GB内存
# TiKV内存需求:每100GB数据需要4GB内存
# PD内存需求:一般为8GB
# 查看当前资源使用情况
# 查看TiDB资源使用
top -p $(pgrep -f tidb-server)
# 查看TiKV资源使用
top -p $(pgrep -f tikv-server)
# 查看PD资源使用
top -p $(pgrep -f pd-server)
3.2 性能优化
系统参数优化
# TiDB参数优化
# 修改tidb.toml
[server]
port = 4000
status_port = 10080
host = "0.0.0.0"
[performance]
max-procs = 8 # 设置为CPU核心数
stmt-count-limit = 10000
txn-total-size-limit = 1073741824
[prepared-plan-cache]
enable = true
capacity = 1000
[txn]
enable-async-commit = true
enable-1pc = true
enable-pessimistic-txn = true
# TiKV参数优化
# 修改tikv.toml
[server]
grpc-concurrency = 8
[storage]
enable-prefetch = true
[rocksdb]
max-background-jobs = 4
max-open-files = 4096
[raftdb]
max-background-jobs = 4
[readpool]
unified-max-thread-count = 8
[writepool]
normal-max-thread-count = 8
# PD参数优化
# 修改pd.toml
[server]
leader-priority = 5
[scheduler]
enable-cross-table-merge = true
enable-location-replacement = true
[replication]
max-replicas = 3
location-labels = ["zone", "rack", "host"]
SQL优化
# 分析SQL执行计划
EXPLAIN ANALYZE SELECT * FROM fgedudb.fgedu_users WHERE age > 30 ORDER BY created_at;
# 优化SQL语句
# 优化前:全表扫描
SELECT * FROM fgedudb.fgedu_users WHERE age > 30;
# 优化后:使用索引
CREATE INDEX idx_age ON fgedudb.fgedu_users (age);
SELECT * FROM fgedudb.fgedu_users WHERE age > 30;
# 优化前:使用SELECT *
SELECT * FROM fgedudb.fgedu_users WHERE id = 1;
# 优化后:只查询需要的列
SELECT id, username, email FROM fgedudb.fgedu_users WHERE id = 1;
# 优化前:未使用索引排序
SELECT * FROM fgedudb.fgedu_users WHERE age > 30 ORDER BY created_at;
# 优化后:使用复合索引
CREATE INDEX idx_age_created_at ON fgedudb.fgedu_users (age, created_at);学习交流加群风哥QQ113257174
SELECT * FROM fgedudb.fgedu_users WHERE age > 30 ORDER BY created_at;
索引优化
# 查看表的索引
SHOW INDEX FROM fgedudb.fgedu_users;
# 创建合适的索引
# 为频繁查询的列创建索引
CREATE INDEX idx_email ON fgedudb.fgedu_users (email);
# 为联合查询创建复合索引
CREATE INDEX idx_age_gender ON fgedudb.fgedu_users (age, gender);
# 删除无用的索引
DROP INDEX idx_old ON fgedudb.fgedu_users;
# 分析索引使用情况
SELECT * FROM information_schema.statistics WHERE table_schema = 'fgedudb' AND table_name = 'fgedu_users';
3.3 监控与调整
使用TiDB Dashboard
# 访问TiDB Dashboard
# 地址:http://pd-host:2379/dashboard
# 查看集群状态
# Dashboard > 集群信息
# 查看SQL语句分析
# Dashboard > SQL语句分析
# 查看慢查询
# Dashboard > 慢查询
# 查看资源使用情况
# Dashboard > 资源监控
使用Prometheus和Grafana
# 访问Grafana
# 地址:http://grafana-host:3000
# 查看TiDB面板
# 面板 > TiDB Overview
# 查看TiKV面板
# 面板 > TiKV Overview
# 查看PD面板
# 面板 > PD Overview
# 查看服务器面板
# 面板 > Node Exporter Full
四、实战案例
4.1 容量规划实战
场景:企业需要为新的业务系统规划TiDB集群容量,预计数据量为500GB,QPS为3000。
步骤1:存储容量计算
# 存储容量计算
# 原始数据量:500GB
# 副本因子:3
# 压缩系数:0.5
# 预留系数:1.5
# 总存储容量 = 500GB × 3 × 0.5 × 1.5 = 1125GB ≈ 1.1TB
# 每个TiKV节点存储容量 = 1.1TB ÷ 3 ≈ 375GB
# 考虑到实际部署,每个TiKV节点分配500GB存储
步骤2:计算资源规划
# CPU需求
# QPS:3000
# 每1000 QPS需要1个CPU核心
# 所需CPU核心数 = 3000 ÷ 1000 = 3
# 每个TiDB节点分配4核CPU
# 内存需求
# TiDB内存:每100GB数据需要8GB内存
# 500GB数据需要40GB内存
# 每个TiDB节点分配16GB内存
# TiKV内存:每100GB数据需要4GB内存
# 500GB数据需要20GB内存
# 每个TiKV节点分配8GB内存
# PD内存:8GB
# 节点数量
# TiDB节点:2个(高可用)
# TiKV节点:3个(3副本)
# PD节点:3个(高可用)
步骤3:网络带宽规划
# 内部网络
# 集群内部节点间需要高带宽、低延迟的网络
# 建议使用10Gbps以太网
# 外部网络
# 客户端与集群间的网络带宽
# 预计QPS:3000
# 每个查询平均大小:1KB
# 所需带宽 = 3000 × 1KB × 8 = 24Mbps
# 建议使用1Gbps以太网
4.2 性能优化实战
场景:生产环境TiDB集群性能下降,需要进行性能优化。
步骤1:分析性能瓶颈
# 查看TiDB Dashboard
# 发现CPU使用率高,慢查询增多
# 查看慢查询日志
cat /tidb/log/tidb-slow.log | head -20
# 分析SQL执行计划
EXPLAIN ANALYZE SELECT * FROM fgedudb.fgedu_orders WHERE user_id = 1001 ORDER BY created_at DESC LIMIT 10;
+-------------------------+----------+-----------+------------------------+---------------------------------------+ | id | estRows | task | access object | operator info | +-------------------------+----------+-----------+------------------------+---------------------------------------+ | Limit_7 | 10.00 | root | | limit offset:0, count:10 | | └─Sort_6 | 10.00 | root | | sort by:created_at DESC | | └─TableReader_5 | 100.00 | root | | data:Selection_4 | | └─Selection_4 | 100.00 | cop[tikv] | | where:user_id = 1001 | | └─TableScan_3 | 1000.00 | cop[tikv] | table:fgedu_orders | range:[-inf,+inf], keep order:false | +-------------------------+----------+-----------+------------------------+---------------------------------------+
步骤2:优化索引
# 创建复合索引
CREATE INDEX idx_user_id_created_at ON fgedudb.fgedu_orders (user_id, created_at DESC);
步骤3:优化SQL语句
-- 优化前:使用SELECT *
SELECT * FROM fgedudb.fgedu_orders WHERE user_id = 1001 ORDER BY created_at DESC LIMIT 10;
-- 优化后:只查询需要的列
SELECT id, order_no, total_amount, status, created_at FROM fgedudb.fgedu_orders WHERE user_id = 1001 ORDER BY created_at DESC LIMIT 10;
步骤4:优化系统参数
# 修改tidb.toml
[performance]
max-procs = 16 # 增加CPU核心数
prepared-plan-cache-capacity = 5000 # 增加预编译计划缓存
[txn]
enable-async-commit = true
enable-1pc = true
# 修改tikv.toml
[readpool]
unified-max-thread-count = 16 # 增加读线程数
[writepool]
normal-max-thread-count = 16 # 增加写线程数
# 重启集群
tiup cluster restart tidb-cluster
步骤5:验证优化效果
# 查看执行计划
EXPLAIN ANALYZE SELECT id, order_no, total_amount, status, created_at FROM fgedudb.fgedu_orders WHERE user_id = 1001 ORDER BY created_at DESC LIMIT 10;
+-------------------------+----------+-----------+------------------------+---------------------------------------+ | id | estRows | task | access object | operator info | +-------------------------+----------+-----------+------------------------+---------------------------------------+ | Limit_5 | 10.00 | root | | limit offset:0, count:10 | | └─IndexReader_4 | 10.00 | root | | index:Limit_3 | | └─Limit_3 | 10.00 | cop[tikv] | | limit offset:0, count:10 | | └─IndexScan_2 | 100.00 | cop[tikv] | table:fgedu_orders, index:idx_user_id_created_at(user_id, created_at) | range:[1001,1001], keep order:true | +-------------------------+----------+-----------+------------------------+---------------------------------------+
# 查看QPS和响应时间
# 通过Grafana面板查看优化后的QPS和响应时间
五、经验总结
5.1 容量规划最佳实践
- 充分调研:了解业务需求和数据增长趋势
- 合理估算:使用科学的方法估算资源需求
- 预留空间:预留足够的资源用于未来增长
- 定期评估:定期评估容量使用情况,及时调整
- 弹性扩展:设计弹性扩展的架构
5.2 性能优化最佳实践
- 从瓶颈入手:先解决主要性能瓶颈
- 系统参数调优:根据硬件配置和业务负载调整系统参数
- SQL优化:编写高效的SQL语句
- 索引优化:设计合理的索引
- 监控与分析:持续监控系统性能,分析性能瓶颈
- 定期维护:定期进行数据库维护,如统计信息更新、碎片整理等
5.3 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 存储不足 | 数据增长过快 | 增加TiKV节点,或清理历史数据 |
| CPU使用率高 | SQL执行效率低,并发数过高 | 优化SQL语句,增加CPU资源 |
| 内存不足 | 内存配置不足,内存泄漏 | 增加内存,检查应用程序 |
| 网络带宽不足 | 网络流量过大 | 增加网络带宽,优化网络配置 |
| 响应时间长 | SQL执行效率低,系统资源不足 | 优化SQL语句,增加系统资源 |
5.4 容量规划与性能优化检查清单
| 检查项 | 配置要求 | 状态 |
|---|---|---|
| 存储容量 | 预留足够的存储空间 | □ |
| 计算资源 | CPU和内存配置合理 | □ |
| 网络带宽 | 网络带宽满足需求 | □ |
| 系统参数 | 系统参数优化 | □ |
| SQL语句 | SQL语句优化 | □ |
| 索引设计 | 索引设计合理 | □ |
| 监控系统 | 监控系统运行正常 | □ |
| 定期维护 | 定期进行数据库维护 | □ |
更多视频教程www.fgedu.net.cn
© 2024 TiDB数据库培训文档
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
