外观
TiDB 自动调度机制
TiDB 集群的自动调度是由 PD (Placement Driver) 组件负责的,它通过一系列调度器实现集群的负载均衡、高可用性和性能优化。
调度目标
- 负载均衡:均衡集群中各个节点的负载,避免热点问题
- 高可用性:确保每个 Region 有足够的副本,并且副本分布在不同的节点和可用区
- 性能优化:优化数据分布,提高查询性能
- 资源利用率:提高集群的资源利用率
调度范围
- Region 调度:调整 Region 的分布和副本数量
- Leader 调度:调整 Region Leader 的分布
- 热点调度:处理热点 Region 问题
- 副本调度:调整副本的分布和数量
调度架构
- PD:负责集群的元数据管理和调度决策
- 调度器:实现具体的调度策略
- TiKV:执行 PD 下发的调度操作
- 监控系统:收集集群状态信息,为调度提供依据
调度器类型
1. 内置调度器
balance-region 调度器
功能:均衡集群中各个 TiKV 节点上的 Region 数量
工作原理:
- 统计每个 TiKV 节点上的 Region 数量
- 计算 Region 数量的平均值和标准差
- 将 Region 从数量多的节点迁移到数量少的节点
- 确保每个节点的 Region 数量在合理范围内
配置示例:
bash
# 查看调度器状态
tiup ctl pd -u http://<pd-host>:2379 config show scheduler
# 启用 balance-region 调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler add balance-region
# 禁用 balance-region 调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler remove balance-regionbalance-leader 调度器
功能:均衡集群中各个 TiKV 节点上的 Region Leader 数量
工作原理:
- 统计每个 TiKV 节点上的 Region Leader 数量
- 计算 Leader 数量的平均值和标准差
- 将 Leader 从数量多的节点迁移到数量少的节点
- 确保每个节点的 Leader 数量在合理范围内
配置示例:
bash
# 启用 balance-leader 调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler add balance-leader
# 禁用 balance-leader 调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler remove balance-leaderhot-region 调度器
功能:处理热点 Region 问题,将热点 Region 迁移到负载较低的节点
工作原理:
- 收集每个 Region 的读写热点信息
- 识别热点 Region 和热点节点
- 将热点 Region 迁移到负载较低的节点
- 或者将热点 Region 分裂,分散热点压力
配置示例:
bash
# 查看热点信息
tiup ctl pd -u http://<pd-host>:2379 hot read
tiup ctl pd -u http://<pd-host>:2379 hot write
# 启用 hot-region 调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler add hot-region
# 禁用 hot-region 调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler remove hot-regionreplicate 调度器
功能:确保每个 Region 有足够的副本,并且副本分布符合要求
工作原理:
- 检查每个 Region 的副本数量
- 检查副本的分布是否符合要求(如跨可用区)
- 如果副本数量不足,添加新副本
- 如果副本分布不符合要求,调整副本分布
配置示例:
bash
# 查看副本分布
tiup ctl pd -u http://<pd-host>:2379 store
# 启用 replicate 调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler add replicate
# 禁用 replicate 调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler remove replicatelabel-scheduler 调度器
功能:根据节点标签进行调度,确保副本分布符合标签约束
工作原理:
- 检查节点的标签信息
- 检查 Region 副本的标签分布
- 确保副本分布符合标签约束(如跨可用区、跨机架)
- 如果不符合约束,调整副本分布
配置示例:
bash
# 查看节点标签
tiup ctl pd -u http://<pd-host>:2379 store label
# 启用 label-scheduler 调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler add label-scheduler
# 禁用 label-scheduler 调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler remove label-scheduler2. 自定义调度器
除了内置调度器外,PD 还支持自定义调度器,用户可以根据自己的需求开发和部署自定义调度器。
开发步骤:
- 了解 PD 调度器 API
- 编写自定义调度器代码
- 编译和部署自定义调度器
- 在 PD 中启用自定义调度器
示例:
bash
# 启用自定义调度器
tiup ctl pd -u http://<pd-host>:2379 scheduler add custom-scheduler --args "--config=/path/to/config"调度策略
1. 副本分布策略
跨可用区部署
目标:确保每个 Region 的副本分布在不同的可用区,提高集群的可用性
配置方法:
bash
# 设置 PD 配置,要求副本分布在不同的可用区
tiup ctl pd -u http://<pd-host>:2379 config set replication.location-labels ["zone","rack","host"]
# 设置副本数量
tiup ctl pd -u http://<pd-host>:2379 config set replication.max-replicas 3跨机架部署
目标:确保每个 Region 的副本分布在不同的机架,提高集群的可用性
配置方法:
bash
# 设置 PD 配置,要求副本分布在不同的机架
tiup ctl pd -u http://<pd-host>:2379 config set replication.location-labels ["rack","host"]2. 负载均衡策略
资源感知调度
目标:根据节点的资源使用情况进行调度,避免节点过载
配置方法:
bash
# 启用资源感知调度
tiup ctl pd -u http://<pd-host>:2379 config set schedule.enable-cross-table-merge true
# 设置资源阈值
tiup ctl pd -u http://<pd-host>:2379 config set schedule.high-space-ratio 0.7
tiup ctl pd -u http://<pd-host>:2379 config set schedule.low-space-ratio 0.2流量感知调度
目标:根据节点的流量情况进行调度,避免热点问题
配置方法:
bash
# 启用流量感知调度
tiup ctl pd -u http://<pd-host>:2379 config set schedule.enable-hot-regions-schedule true
# 设置流量阈值
tiup ctl pd -u http://<pd-host>:2379 config set schedule.hot-region-schedule-limit 4
tiup ctl pd -u http://<pd-host>:2379 config set schedule.hot-region-cache-hits-threshold 33. 调度限制策略
调度速率限制
目标:限制调度操作的速率,避免调度操作影响集群性能
配置方法:
bash
# 设置调度速率限制
tiup ctl pd -u http://<pd-host>:2379 config set schedule.leader-schedule-limit 4
tiup ctl pd -u http://<pd-host>:2379 config set schedule.region-schedule-limit 20
tiup ctl pd -u http://<pd-host>:2379 config set schedule.replica-schedule-limit 64存储容量限制
目标:根据节点的存储容量进行调度,避免节点存储溢出
配置方法:
bash
# 设置存储容量限制
tiup ctl pd -u http://<pd-host>:2379 config set schedule.max-merge-region-size 20调度算法
1. Region 分裂算法
功能:将过大的 Region 分裂成多个小 Region,避免热点问题和性能瓶颈
触发条件:
- Region 大小超过阈值(默认 96MB)
- Region 的 key 数量超过阈值(默认 144000)
分裂方式:
- 大小分裂:根据 Region 的大小进行分裂
- key 数量分裂:根据 Region 包含的 key 数量进行分裂
- 手动分裂:通过 SQL 语句手动分裂 Region
配置示例:
bash
# 设置 Region 分裂阈值
tiup ctl pd -u http://<pd-host>:2379 config set split-region.max-size 962. Region 合并算法
功能:将过小的相邻 Region 合并,减少集群中的 Region 数量,提高集群性能
触发条件:
- 相邻的两个 Region 大小都小于阈值(默认 20MB)
- 合并后的 Region 大小不超过阈值(默认 96MB)
配置示例:
bash
# 设置 Region 合并阈值
tiup ctl pd -u http://<pd-host>:2379 config set schedule.max-merge-region-size 20
tiup ctl pd -u http://<pd-host>:2379 config set schedule.max-merge-region-keys 2000003. 调度优先级算法
功能:为不同类型的调度操作设置优先级,确保重要的调度操作优先执行
优先级顺序:
- 副本修复(replicate)
- 热点调度(hot-region)
- 负载均衡(balance-region, balance-leader)
- 其他调度
配置示例:
bash
# 设置调度优先级
tiup ctl pd -u http://<pd-host>:2379 config set schedule.priority-high 5
tiup ctl pd -u http://<pd-host>:2379 config set schedule.priority-normal 20
tiup ctl pd -u http://<pd-host>:2379 config set schedule.priority-low 50调度配置
1. PD 调度配置
查看当前配置
bash
# 查看所有调度相关配置
tiup ctl pd -u http://<pd-host>:2379 config show | grep schedule
# 查看特定配置项
tiup ctl pd -u http://<pd-host>:2379 config show schedule.leader-schedule-limit修改配置
bash
# 修改单个配置项
tiup ctl pd -u http://<pd-host>:2379 config set schedule.leader-schedule-limit 8
# 批量修改配置
tiup ctl pd -u http://<pd-host>:2379 config set replication.max-replicas 3 replication.location-labels ["zone","rack","host"]配置文件示例
toml
# PD 配置文件中的调度相关配置
[schedule]
# 启用调度器
enable-cross-table-merge = true
enable-hot-regions-schedule = true
enable-location-replacement = true
# 调度速率限制
leader-schedule-limit = 4
region-schedule-limit = 20
replica-schedule-limit = 64
hot-region-schedule-limit = 4
# 副本配置
max-replicas = 3
location-labels = ["zone", "rack", "host"]
# Region 配置
max-merge-region-size = 20
max-merge-region-keys = 200000
split-region.max-size = 96
split-region.max-keys = 144000
# 资源阈值
high-space-ratio = 0.7
low-space-ratio = 0.22. 动态调整配置
PD 支持动态调整调度配置,无需重启 PD 服务
bash
# 动态调整调度速率
tiup ctl pd -u http://pd-host:2379 config set schedule.region-schedule-limit 30
# 动态调整副本数量
tiup ctl pd -u http://pd-host:2379 config set replication.max-replicas 5
# 动态调整热点调度阈值
tiup ctl pd -u http://pd-host:2379 config set schedule.hot-region-cache-hits-threshold 5调度监控与分析
1. 调度指标监控
Prometheus 指标
- pd_scheduler_operator_total:调度操作的总数
- pd_scheduler_operator_create:创建的调度操作数
- pd_scheduler_operator_finish:完成的调度操作数
- pd_scheduler_operator_timeout:超时的调度操作数
- pd_hot_region:热点 Region 的数量
- pd_store_region_count:每个 TiKV 节点上的 Region 数量
- pd_store_leader_count:每个 TiKV 节点上的 Leader 数量
Grafana 监控面板
TiDB 提供了预配置的 Grafana 面板,用于监控调度情况:
- PD - Schedule:展示调度操作的数量和状态
- PD - Hot Regions:展示热点 Region 的分布和数量
- TiKV - Region:展示每个 TiKV 节点上的 Region 数量和分布
- TiKV - Leader:展示每个 TiKV 节点上的 Leader 数量和分布
2. 调度日志分析
bash
# 查看 PD 调度日志
grep -i schedule /tidb-deploy/pd-2379/log/pd.log
# 查看热点调度日志
grep -i hot /tidb-deploy/pd-2379/log/pd.log
# 查看 Region 分裂日志
grep -i split /tidb-deploy/pd-2379/log/pd.log3. 调度操作查看
bash
# 查看当前正在执行的调度操作
tiup ctl pd -u http://pd-host:2379 operator show
# 查看已完成的调度操作
tiup ctl pd -u http://pd-host:2379 operator history调度优化最佳实践
1. 合理配置副本策略
- 根据集群规模和可用性要求,设置合适的副本数量
- 对于跨可用区部署,确保副本分布在不同的可用区
- 对于跨机架部署,确保副本分布在不同的机架
2. 优化负载均衡
- 根据集群的实际情况,调整调度速率限制
- 启用资源感知调度,避免节点过载
- 启用热点调度,及时处理热点问题
3. 优化 Region 管理
- 根据业务需求,调整 Region 的分裂和合并阈值
- 对于热点表,考虑使用分区表分散热点
- 定期检查 Region 分布,及时调整不合理的分布
4. 监控和调整
- 定期查看调度监控面板,了解集群的调度情况
- 根据监控结果,及时调整调度配置
- 对于异常情况,及时分析日志和调度操作
5. 避免过度调度
- 避免频繁调整调度配置,导致集群不稳定
- 避免同时启用过多的调度器,导致调度冲突
- 对于稳定运行的集群,适当降低调度速率
常见调度问题及解决方案
1. 调度操作缓慢
问题描述
PD 下发的调度操作执行缓慢,导致集群负载不均衡
解决方案
- 检查 TiKV 节点的资源使用情况,确保节点有足够的资源执行调度操作
- 检查网络连接,确保节点之间的网络延迟较低
- 调整调度速率限制,避免调度操作过多
- 检查调度器状态,确保必要的调度器已启用
2. 热点问题无法解决
问题描述
热点 Region 问题持续存在,PD 无法有效处理
解决方案
- 检查热点调度器是否已启用
- 调整热点调度的阈值和速率
- 分析热点产生的原因,优化应用程序
- 考虑使用分区表或其他方式分散热点
3. 副本分布不符合要求
问题描述
Region 的副本分布不符合配置的标签约束
解决方案
- 检查 PD 配置中的 location-labels 是否正确设置
- 检查 TiKV 节点的标签是否正确配置
- 检查 replicate 调度器是否已启用
- 检查集群中是否有足够的节点满足副本分布要求
4. Region 数量过多
问题描述
集群中的 Region 数量过多,影响集群性能
解决方案
- 调整 Region 的合并阈值,鼓励 Region 合并
- 检查是否存在大量小表,考虑合并或删除
- 对于热点表,考虑使用分区表
- 调整 PD 配置,减少不必要的 Region 分裂
5. 调度操作失败
问题描述
PD 下发的调度操作执行失败
解决方案
- 查看调度操作的失败原因:
tiup ctl pd -u http://pd-host:2379 operator show - 检查 TiKV 节点的状态,确保节点正常运行
- 检查网络连接,确保节点之间的网络正常
- 检查节点的资源使用情况,确保节点有足够的资源
常见问题(FAQ)
Q1: 如何查看当前启用的调度器?
A1: 可以使用以下命令查看当前启用的调度器:
bash
tiup ctl pd -u http://pd-host:2379 scheduler showQ2: 如何临时禁用调度器?
A2: 可以使用以下命令临时禁用调度器:
bash
# 禁用所有调度器
tiup ctl pd -u http://pd-host:2379 scheduler pause
# 启用所有调度器
tiup ctl pd -u http://pd-host:2379 scheduler resume
# 禁用特定调度器
tiup ctl pd -u http://pd-host:2379 scheduler remove <scheduler-name>Q3: 如何调整 Region 的大小?
A3: 可以通过修改 PD 配置来调整 Region 的大小:
bash
# 调整 Region 分裂阈值
tiup ctl pd -u http://pd-host:2379 config set split-region.max-size 128
tiup ctl pd -u http://pd-host:2379 config set split-region.max-keys 200000
# 调整 Region 合并阈值
tiup ctl pd -u http://pd-host:2379 config set schedule.max-merge-region-size 32
tiup ctl pd -u http://pd-host:2379 config set schedule.max-merge-region-keys 250000Q4: 如何手动触发 Region 分裂?
A4: 可以使用以下 SQL 语句手动触发 Region 分裂:
sql
-- 手动分裂表
alter table table_name split table by range (1000, 2000, 3000);
-- 手动分裂索引
alter table table_name split index index_name by range (1000, 2000, 3000);Q5: 如何监控调度操作的执行情况?
A5: 可以通过以下方式监控调度操作的执行情况:
使用 PD 命令:
bashtiup ctl pd -u http://pd-host:2379 operator show tiup ctl pd -u http://pd-host:2379 operator history使用监控面板:
- 查看 Grafana 中的 PD - Schedule 面板
- 查看 PD - Hot Regions 面板
- 查看 TiKV - Region 面板
查看日志:
bashgrep -i schedule /tidb-deploy/pd-2379/log/pd.log
