Skip to content

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-region

balance-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-leader

hot-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-region

replicate 调度器

功能:确保每个 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 replicate

label-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-scheduler

2. 自定义调度器

除了内置调度器外,PD 还支持自定义调度器,用户可以根据自己的需求开发和部署自定义调度器。

开发步骤

  1. 了解 PD 调度器 API
  2. 编写自定义调度器代码
  3. 编译和部署自定义调度器
  4. 在 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 3

3. 调度限制策略

调度速率限制

目标:限制调度操作的速率,避免调度操作影响集群性能

配置方法

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 96

2. 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 200000

3. 调度优先级算法

功能:为不同类型的调度操作设置优先级,确保重要的调度操作优先执行

优先级顺序

  1. 副本修复(replicate)
  2. 热点调度(hot-region)
  3. 负载均衡(balance-region, balance-leader)
  4. 其他调度

配置示例

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.2

2. 动态调整配置

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.log

3. 调度操作查看

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 show

Q2: 如何临时禁用调度器?

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 250000

Q4: 如何手动触发 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: 可以通过以下方式监控调度操作的执行情况:

  1. 使用 PD 命令

    bash
    tiup ctl pd -u http://pd-host:2379 operator show
    tiup ctl pd -u http://pd-host:2379 operator history
  2. 使用监控面板

    • 查看 Grafana 中的 PD - Schedule 面板
    • 查看 PD - Hot Regions 面板
    • 查看 TiKV - Region 面板
  3. 查看日志

    bash
    grep -i schedule /tidb-deploy/pd-2379/log/pd.log