外观
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 store2. 数据迁移评估
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.yaml4. 调整 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:201603. 缩容过程监控
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_count4. 缩容操作原理
- 标记节点为下线:PD 将目标节点标记为下线状态
- 迁移 Leader:将该节点上的 Leader 迁移到其他节点
- 迁移数据:将该节点上的 Region 副本迁移到其他节点
- 移除节点:当节点上的所有 Region 都迁移完成后,从集群中移除该节点
缩容后验证
1. 集群状态验证
bash
# 检查集群状态
tiup cluster display <cluster-name>
# 检查所有节点状态
tiup cluster health <cluster-name>
# 检查 PD 存储状态
tiup ctl pd -u http://<pd-address>:2379 store2. 数据一致性验证
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 14. 恢复 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> --force3. 风险提示
- 强制缩容可能导致数据丢失
- 可能破坏数据一致性
- 可能导致集群可用性降低
- 建议仅在紧急情况下使用
不同组件的缩容注意事项
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: 如果缩容过程中节点出现故障,可以采取以下措施:
- 评估影响:检查故障节点上的 Region 数量和数据重要性
- 选择处理方式:
- 如果数据已备份且可以恢复,使用强制缩容
- 如果数据重要,尝试恢复节点后继续缩容
- 监控集群状态:密切关注集群状态,确保其他节点正常运行
Q2: 如何加快缩容速度?
A2: 可以通过以下方式加快缩容速度:
- 调整 PD 调度参数,增加并发迁移数量
- 确保目标节点有足够的资源接收迁移的数据
- 缩容前减少节点上的 Region 数量
- 避免在缩容过程中进行其他大规模操作
Q3: 缩容后如何处理残留的配置文件?
A3: 可以通过以下方式处理残留的配置文件:
清理节点上的部署目录:
bashrm -rf /tidb-deploy/<component>-<port>/ rm -rf /tidb-data/<component>-<port>/更新集群配置:
bashtiup cluster edit-config <cluster-name>
Q4: 缩容后如何验证数据完整性?
A4: 可以通过以下方式验证数据完整性:
- 使用 sync-diff-inspector 工具进行数据一致性检查
- 运行业务查询,验证数据正确性
- 检查 Region 状态,确保所有 Region 都有足够的副本
- 运行全量备份,验证备份成功
Q5: 如何处理缩容过程中的 Region 迁移失败?
A5: 如果遇到 Region 迁移失败,可以采取以下措施:
查看迁移失败的原因:
bashtiup ctl pd -u http://<pd-address>:2379 operator show根据失败原因进行处理:
- 如果是资源不足,增加目标节点资源
- 如果是网络问题,检查网络连接
- 如果是配置问题,调整相关配置
手动重试迁移:
bashtiup ctl pd -u http://<pd-address>:2379 operator add transfer-leader <region-id> <target-store-id>
Q6: 缩容后集群性能下降怎么办?
A6: 如果缩容后集群性能下降,可以采取以下措施:
- 检查集群状态,确保所有节点正常运行
- 检查 Region 分布,确保负载均衡
- 调整 PD 调度参数,优化 Region 分布
- 考虑增加其他节点的资源配置
- 检查业务负载,是否有异常流量
Q7: 如何缩容 PD 节点?
A7: 缩容 PD 节点需要特别注意,确保缩容后仍有奇数个 PD 节点:
- 检查 PD Leader 位置,确保不在要缩容的节点上
- 执行缩容操作:bash
tiup cluster scale-in <cluster-name> --node <pd-address>:2379 - 缩容后检查 PD 集群状态:bash
tiup ctl pd -u http://<pd-address>:2379 member
Q8: 如何缩容 TiFlash 节点?
A8: 缩容 TiFlash 节点的步骤:
- 检查 TiFlash 副本状态,确保缩容后数据可用性不受影响
- 执行缩容操作:bash
tiup cluster scale-in <cluster-name> --node <tiflash-address>:9000 - 缩容后检查 TiFlash 副本状态:sql
SELECT * FROM information_schema.tiflash_replica;
Q9: 缩容过程中如何监控 Region 迁移进度?
A9: 可以通过以下方式监控 Region 迁移进度:
使用 PD CTL 查看 operator 状态:
bashtiup ctl pd -u http://<pd-address>:2379 operator show查看节点上的 Region 数量变化:
bashtiup ctl pd -u http://<pd-address>:2379 store <store-id> | grep region_count通过 TiDB Dashboard 监控:
- 登录 TiDB Dashboard
- 进入 "集群信息" -> "存储节点"
- 查看节点的 Region 数量变化
Q10: 如何取消正在进行的缩容操作?
A10: 如果需要取消正在进行的缩容操作,可以采取以下措施:
将节点重新标记为上线状态:
bashtiup ctl pd -u http://<pd-address>:2379 store <store-id> --state up清理正在进行的 operator:
bashtiup ctl pd -u http://<pd-address>:2379 operator remove检查集群状态,确保恢复正常:
bashtiup cluster display <cluster-name>
Q11: 缩容后如何调整负载均衡?
A11: 缩容后可以通过以下方式调整负载均衡:
- 调整 PD 调度参数,优化 Region 分布
- 调整 TiDB 负载均衡配置
- 监控各节点的资源利用率,确保负载均衡
- 根据实际情况调整业务请求分发
Q12: 如何缩容整个 TiDB 集群?
A12: 缩容整个 TiDB 集群的步骤:
- 备份所有数据
- 停止业务访问
- 逐步缩容各个组件:
- 先缩容 TiDB 节点
- 再缩容 TiFlash 节点
- 然后缩容 TiKV 节点
- 最后缩容 PD 节点
- 清理所有部署目录和数据目录
- 删除集群配置
Q13: 缩容过程中出现 "store not found" 错误怎么办?
A13: 如果遇到 "store not found" 错误,可能是因为节点已经被移除或者 store ID 不正确:
检查 store ID 是否正确:
bashtiup ctl pd -u http://<pd-address>:2379 store如果节点已经被移除,检查集群状态:
bashtiup cluster display <cluster-name>如果是临时错误,等待一段时间后重试
Q14: 缩容后如何更新监控配置?
A14: 缩容后需要更新监控配置,确保监控系统正常工作:
- 检查监控目标,移除已缩容的节点
- 更新 Prometheus 配置
- 重启 Prometheus 服务
- 验证监控数据是否正常
Q15: 如何处理缩容后残留的 PD 成员?
A15: 如果缩容后仍有残留的 PD 成员,可以手动移除:
查看 PD 成员列表:
bashtiup ctl pd -u http://<pd-address>:2379 member移除残留的成员:
bashtiup ctl pd -u http://<pd-address>:2379 member remove <member-id>验证成员列表,确保只保留正常的 PD 节点
Q16: 缩容过程中如何避免影响业务?
A16: 可以通过以下方式减少缩容对业务的影响:
- 在业务低峰期进行缩容
- 控制迁移速率,避免占用过多资源
- 逐步缩容,每次只缩容少量节点
- 密切监控业务指标,及时调整缩容策略
- 准备应急预案,处理突发情况
