Skip to content

TiDB 集群缩容操作

缩容前准备

1. 集群状态检查

bash
# 检查集群状态
tiup cluster display <cluster-name>

# 检查集群健康状态
tiup cluster check <cluster-name> --run-all-checks

# 检查 PD 调度状态
tiup ctl pd -u http://<pd-address>:2379 config show schedule

# 检查 Region 分布
tiup ctl pd -u http://<pd-address>:2379 store

2. 数据迁移评估

bash
# 查看节点上的 Region 数量
tiup ctl pd -u http://<pd-address>:2379 store | grep -E 'store_id|region_count'

# 查看节点上的 leader 数量
tiup ctl pd -u http://<pd-address>:2379 store | grep -E 'store_id|leader_count'

# 估算数据迁移时间
# 数据迁移时间 ≈ (节点数据量 ÷ 迁移速度) + (Region 数量 × 每个 Region 迁移时间)

3. 备份数据

bash
# 使用 TiDB Backup & Restore (BR) 进行全量备份
tiup br backup full --pd <pd-address>:2379 --storage s3://<bucket-name>/<backup-path> --ratelimit 128

# 备份集群配置
tiup cluster export <cluster-name> --output ./cluster-config.yaml

4. 调整 PD 调度参数

bash
# 临时调整 PD 调度参数,加快缩容速度
tiup ctl pd -u http://<pd-address>:2379 config set schedule.leader-schedule-limit 64
tiup ctl pd -u http://<pd-address>:2379 config set schedule.region-schedule-limit 128
tiup ctl pd -u http://<pd-address>:2379 config set schedule.replica-schedule-limit 256

执行缩容操作

1. 缩容节点选择

  • TiKV 节点:优先选择 Region 数量较少的节点
  • TiDB 节点:优先选择负载较低的节点
  • PD 节点:确保缩容后仍有奇数个 PD 节点(3、5 等)
  • TiFlash 节点:确保缩容后数据可用性不受影响

2. 使用 TiUP 执行缩容

bash
# 查看集群节点信息
tiup cluster display <cluster-name>

# 执行缩容操作
tiup cluster scale-in <cluster-name> --node <node-address>:<port>

# 示例:缩容 TiKV 节点
tiup cluster scale-in <cluster-name> --node 192.168.1.10:20160

# 示例:缩容多个节点
tiup cluster scale-in <cluster-name> --node 192.168.1.10:20160,192.168.1.11:20160

3. 缩容过程监控

bash
# 监控缩容进度
tiup cluster display <cluster-name>

# 查看缩容日志
tiup cluster log <cluster-name> --follow

# 监控 Region 迁移进度
tiup ctl pd -u http://<pd-address>:2379 operator show

# 查看节点上剩余的 Region 数量
tiup ctl pd -u http://<pd-address>:2379 store <store-id> | grep region_count

4. 缩容操作原理

  1. 标记节点为下线:PD 将目标节点标记为下线状态
  2. 迁移 Leader:将该节点上的 Leader 迁移到其他节点
  3. 迁移数据:将该节点上的 Region 副本迁移到其他节点
  4. 移除节点:当节点上的所有 Region 都迁移完成后,从集群中移除该节点

缩容后验证

1. 集群状态验证

bash
# 检查集群状态
tiup cluster display <cluster-name>

# 检查所有节点状态
tiup cluster health <cluster-name>

# 检查 PD 存储状态
tiup ctl pd -u http://<pd-address>:2379 store

2. 数据一致性验证

bash
# 使用 sync-diff-inspector 验证数据一致性
tiup sync-diff-inspector --config ./sync-diff-config.toml

# 运行简单查询测试
mysql -h <tidb-address> -P 4000 -u root -p -e "SELECT COUNT(*) FROM <database-name>.<table-name>"

3. 性能验证

bash
# 运行性能测试
tiup bench tpcc --db tpcc --host <tidb-address> --port 4000 --user root --password <password> --warehouses 10 run --time 300

# 监控系统资源利用率
top
iostat -dx 1

4. 恢复 PD 调度参数

bash
# 恢复 PD 调度参数到默认值
tiup ctl pd -u http://<pd-address>:2379 config set schedule.leader-schedule-limit 4
tiup ctl pd -u http://<pd-address>:2379 config set schedule.region-schedule-limit 20
tiup ctl pd -u http://<pd-address>:2379 config set schedule.replica-schedule-limit 64

强制缩容

1. 适用场景

  • 节点已经无法恢复
  • 数据已经备份,允许丢失该节点上的数据
  • 紧急情况下需要快速移除节点

2. 执行强制缩容

bash
# 强制缩容节点
tiup cluster scale-in <cluster-name> --node <node-address>:<port> --force

3. 风险提示

  • 强制缩容可能导致数据丢失
  • 可能破坏数据一致性
  • 可能导致集群可用性降低
  • 建议仅在紧急情况下使用

不同组件的缩容注意事项

1. TiKV 节点缩容

  • 确保缩容后每个 Region 仍有足够的副本
  • 监控 Region 迁移进度,避免影响集群性能
  • 缩容过程中避免进行其他大规模操作

2. TiDB 节点缩容

  • 缩容前确保负载均衡正常
  • 逐步缩容,避免突然减少太多 TiDB 节点
  • 缩容后调整负载均衡配置

3. PD 节点缩容

  • 确保缩容后仍有奇数个 PD 节点
  • 确保 PD Leader 不在要缩容的节点上
  • 缩容后检查 PD 集群状态

4. TiFlash 节点缩容

  • 确保缩容后数据仍有足够的 TiFlash 副本
  • 监控 TiFlash 数据同步状态
  • 缩容后检查 TiFlash 副本状态

缩容最佳实践

1. 缩容策略

  • 逐步缩容:每次只缩容少量节点,避免影响集群性能
  • 低峰期操作:在业务低峰期进行缩容操作
  • 监控优先:密切监控缩容过程,及时处理异常情况
  • 备份先行:缩容前一定要备份数据

2. 性能优化

  • 缩容前调整 PD 调度参数,加快迁移速度
  • 缩容过程中限制迁移速率,避免影响业务
  • 缩容后恢复正常调度参数

3. 风险控制

  • 制定详细的缩容计划
  • 准备回滚方案
  • 缩容过程中安排专人值守
  • 及时处理告警信息

4. 后续维护

  • 缩容后验证集群状态和数据一致性
  • 更新集群配置文件
  • 记录缩容操作日志
  • 总结缩容经验,优化后续操作

常见问题(FAQ)

Q1: 缩容过程中节点出现故障怎么办?

A1: 如果缩容过程中节点出现故障,可以采取以下措施:

  1. 评估影响:检查故障节点上的 Region 数量和数据重要性
  2. 选择处理方式
    • 如果数据已备份且可以恢复,使用强制缩容
    • 如果数据重要,尝试恢复节点后继续缩容
  3. 监控集群状态:密切关注集群状态,确保其他节点正常运行

Q2: 如何加快缩容速度?

A2: 可以通过以下方式加快缩容速度:

  1. 调整 PD 调度参数,增加并发迁移数量
  2. 确保目标节点有足够的资源接收迁移的数据
  3. 缩容前减少节点上的 Region 数量
  4. 避免在缩容过程中进行其他大规模操作

Q3: 缩容后如何处理残留的配置文件?

A3: 可以通过以下方式处理残留的配置文件:

  1. 清理节点上的部署目录

    bash
    rm -rf /tidb-deploy/<component>-<port>/
    rm -rf /tidb-data/<component>-<port>/
  2. 更新集群配置

    bash
    tiup cluster edit-config <cluster-name>

Q4: 缩容后如何验证数据完整性?

A4: 可以通过以下方式验证数据完整性:

  1. 使用 sync-diff-inspector 工具进行数据一致性检查
  2. 运行业务查询,验证数据正确性
  3. 检查 Region 状态,确保所有 Region 都有足够的副本
  4. 运行全量备份,验证备份成功

Q5: 如何处理缩容过程中的 Region 迁移失败?

A5: 如果遇到 Region 迁移失败,可以采取以下措施:

  1. 查看迁移失败的原因:

    bash
    tiup ctl pd -u http://<pd-address>:2379 operator show
  2. 根据失败原因进行处理:

    • 如果是资源不足,增加目标节点资源
    • 如果是网络问题,检查网络连接
    • 如果是配置问题,调整相关配置
  3. 手动重试迁移:

    bash
    tiup ctl pd -u http://<pd-address>:2379 operator add transfer-leader <region-id> <target-store-id>

Q6: 缩容后集群性能下降怎么办?

A6: 如果缩容后集群性能下降,可以采取以下措施:

  1. 检查集群状态,确保所有节点正常运行
  2. 检查 Region 分布,确保负载均衡
  3. 调整 PD 调度参数,优化 Region 分布
  4. 考虑增加其他节点的资源配置
  5. 检查业务负载,是否有异常流量

Q7: 如何缩容 PD 节点?

A7: 缩容 PD 节点需要特别注意,确保缩容后仍有奇数个 PD 节点:

  1. 检查 PD Leader 位置,确保不在要缩容的节点上
  2. 执行缩容操作:
    bash
    tiup cluster scale-in <cluster-name> --node <pd-address>:2379
  3. 缩容后检查 PD 集群状态:
    bash
    tiup ctl pd -u http://<pd-address>:2379 member

Q8: 如何缩容 TiFlash 节点?

A8: 缩容 TiFlash 节点的步骤:

  1. 检查 TiFlash 副本状态,确保缩容后数据可用性不受影响
  2. 执行缩容操作:
    bash
    tiup cluster scale-in <cluster-name> --node <tiflash-address>:9000
  3. 缩容后检查 TiFlash 副本状态:
    sql
    SELECT * FROM information_schema.tiflash_replica;

Q9: 缩容过程中如何监控 Region 迁移进度?

A9: 可以通过以下方式监控 Region 迁移进度:

  1. 使用 PD CTL 查看 operator 状态:

    bash
    tiup ctl pd -u http://<pd-address>:2379 operator show
  2. 查看节点上的 Region 数量变化:

    bash
    tiup ctl pd -u http://<pd-address>:2379 store <store-id> | grep region_count
  3. 通过 TiDB Dashboard 监控:

    • 登录 TiDB Dashboard
    • 进入 "集群信息" -> "存储节点"
    • 查看节点的 Region 数量变化

Q10: 如何取消正在进行的缩容操作?

A10: 如果需要取消正在进行的缩容操作,可以采取以下措施:

  1. 将节点重新标记为上线状态:

    bash
    tiup ctl pd -u http://<pd-address>:2379 store <store-id> --state up
  2. 清理正在进行的 operator:

    bash
    tiup ctl pd -u http://<pd-address>:2379 operator remove
  3. 检查集群状态,确保恢复正常:

    bash
    tiup cluster display <cluster-name>

Q11: 缩容后如何调整负载均衡?

A11: 缩容后可以通过以下方式调整负载均衡:

  1. 调整 PD 调度参数,优化 Region 分布
  2. 调整 TiDB 负载均衡配置
  3. 监控各节点的资源利用率,确保负载均衡
  4. 根据实际情况调整业务请求分发

Q12: 如何缩容整个 TiDB 集群?

A12: 缩容整个 TiDB 集群的步骤:

  1. 备份所有数据
  2. 停止业务访问
  3. 逐步缩容各个组件:
    • 先缩容 TiDB 节点
    • 再缩容 TiFlash 节点
    • 然后缩容 TiKV 节点
    • 最后缩容 PD 节点
  4. 清理所有部署目录和数据目录
  5. 删除集群配置

Q13: 缩容过程中出现 "store not found" 错误怎么办?

A13: 如果遇到 "store not found" 错误,可能是因为节点已经被移除或者 store ID 不正确:

  1. 检查 store ID 是否正确:

    bash
    tiup ctl pd -u http://<pd-address>:2379 store
  2. 如果节点已经被移除,检查集群状态:

    bash
    tiup cluster display <cluster-name>
  3. 如果是临时错误,等待一段时间后重试

Q14: 缩容后如何更新监控配置?

A14: 缩容后需要更新监控配置,确保监控系统正常工作:

  1. 检查监控目标,移除已缩容的节点
  2. 更新 Prometheus 配置
  3. 重启 Prometheus 服务
  4. 验证监控数据是否正常

Q15: 如何处理缩容后残留的 PD 成员?

A15: 如果缩容后仍有残留的 PD 成员,可以手动移除:

  1. 查看 PD 成员列表:

    bash
    tiup ctl pd -u http://<pd-address>:2379 member
  2. 移除残留的成员:

    bash
    tiup ctl pd -u http://<pd-address>:2379 member remove <member-id>
  3. 验证成员列表,确保只保留正常的 PD 节点

Q16: 缩容过程中如何避免影响业务?

A16: 可以通过以下方式减少缩容对业务的影响:

  1. 在业务低峰期进行缩容
  2. 控制迁移速率,避免占用过多资源
  3. 逐步缩容,每次只缩容少量节点
  4. 密切监控业务指标,及时调整缩容策略
  5. 准备应急预案,处理突发情况