适用的场景
- TiKV 的 data 目录被删除,或者 data 目录操作系统级别损坏
- 注意仅仅针对 3 个 tikv 节点,多个 tikv 节点通常为了不影响其他节点操作,仅在执行多副本恢复后,等待副本补充到其他节点即可,无需重启集群。
环境信息
- 单机模拟
tiup cluster display tidb-test
模拟 TiKV 损坏
- 删除 两个 TiKV data 目录数据
cd /home/tidbtest/tidb-data/tikv-43642
rm -rf *
cd /home/tidbtest/tidb-data/tikv-43643
rm -rf *
查看集群状态
tiup cluster display tidb-test
- 查看 tikv日志
- 查看被删除的 tikv 日志(日志在 deploy dir 下),提示无 db 目录
[2021/02/23 11:26:26.808 +08:00] [ERROR] [pd.rs:604] [“get disk stat for rocksdb failed”] [err=“Os { code: 2, kind: NotFound, message: "No such file or directory" }”] [engine_path=/home/tidbtest/tidb-data/tikv-43642/db]
恢复步骤
- 使用 pd ctl 命令查看 store 信息,获得 Disconnected 状态的 store id
tiup ctl pd -u 172.16.5.138:14239 store
查看结果 Disconnected 状态对应的 id 为 1,4
- 查看 schedule-limit 的值,修改为 0 ,并等待一段时间直到没有正在运行的调度了,即 pd-ctl 中 operator show 输出空列表。
tiup ctl pd -u 172.16.5.138:14239 config show grep schedule-limit
“hot-region-schedule-limit”: 4,
“leader-schedule-limit”: 4,
“merge-schedule-limit”: 8,
“region-schedule-limit”: 2048,
“replica-schedule-limit”: 64,
tiup ctl pd -u 172.16.5.138:14239 -i
config set leader-schedule-limit 0
config set region-schedule-limit 0
config set replica-schedule-limit 0
config set merge-schedule-limit 0
config set hot-region-schedule-limit 0
- 关闭正常的 up 节点
tiup cluster stop tidb-test -N 172.16.5.138:43641
关闭的节点通过 display 查看状态是 Disconnected
- 在关闭后的节点,使用 tikv-ctl 强制 Region 从多副本失败状态恢复服务
可以从中控机 scp tikv-ctl 到目标机器
scp /home/tidbtest/.tiup/components/ctl/v5.0.0-rc/tikv-ctl xxx
tikv-ctl --db /home/tidbtest/tidb-data/tikv-43641/db unsafe-recover remove-fail-stores -s 4,1 --all-regions
Starting component ctl
: /home/tidbtest/.tiup/components/ctl/v5.0.0-rc/ctl tikv --db /home/tidbtest/tidb-data/tikv-43641/db unsafe-recover remove-fail-stores -s 4,1 --all-regions
removing stores [4, 1] from configurations…
success
- 修改参数配置为原参数值
tiup ctl pd -u 172.16.5.138:14239 -i
config set leader-schedule-limit 4
config set region-schedule-limit 2048
config set replica-schedule-limit 64
config set merge-schedule-limit 8
config set hot-region-schedule-limit 4
- 删除两个丢失数据的 tikv 的目录
cd /home/tidbtest/tidb-data
rm -rf tikv-43632
rm -rf tikv-43643
- 重启集群,这时候丢失的 data 目录会自动补数据,但是 tikv 日志会报重复 store 的错误
tiup cluster restart tidb-test
查看确认其他两个节点目录已经重新补充
查看 tikv 日志
[FATAL] [server.rs:590] [“failed to start node: Grpc(RpcFailure(RpcStatus { status: 2-UNKNOWN, details: Some("duplicated store address: id:4016 address:\"172.16.4.136:43641\" version:\"4.0.10\" status_address:\"172.16.4.136:43644\" git_hash:\"2ea4e608509150f8110b16d6e8af39284ca6c93a\" start_timestamp:1614139043 deploy_path:\"/home/tidbtest/tidb-deploy/tikv-43641/bin\" , already registered by id:88 address:\"172.16.4.136:43641\" state:Offline version:\"4.0.10\" status_address:\"172.16.4.136:43644\" git_hash:\"2ea4e608509150f8110b16d6e8af39284ca6c93a\" start_timestamp:1614133151 deploy_path:\"/home/tidbtest/tidb-deploy/tikv-43641/bin\" last_heartbeat:1614137661726372908 ") }))”]
查看集群状态
- 停止正常的 tikv 集群
tiup cluster stop tidb-test -N 172.16.5.138:43641
- 删除之前的 store id
tiup ctl pd -u 172.16.5.138:14239 -i
store delete 1
store delete 4
- 重启 tikv 集群后正常
tiup cluster restart tidb-test