TiDB-unsafe recover(tikv宕机数大于等于一半副本数)

一、背景

名称数量
tikv4
副本3

二、环境准备

1.安装jq

# ubuntu
apt install jq
# centos
yum install jq

2.准备数据

可以采用sysbench或者自己写脚本来做

3.模拟宕机操作

删除对应tikv的数据目录或者强制缩容tikv

4.现象

mysql> select * from region_1 limit 10;
ERROR 9005 (HY000): Region is unavailable
ERROR 9002 (HY000): TiKV server timeout

三、模拟场景

1.宕机两个tikv

因为有三个副本,只是宕机了两个tikv,并不会丢失数据,恢复方法可以参考三kv宕机两台

2.宕机三个tikv

2.1.查看不可连接的store

#  记录下 "state_name": "Disconnected"的store id(我的是4,5,1253)
tiup ctl:v4.0.13 pd -u http://pd_ip:pd_port store

2.2.查看副本丢失情况

# 查看丢失一半以上副本的region
region --jq='.regions[] | {id: .id, peer_stores: [.peers[].store_id] | select(length as $total | map(if .==(1253,4,5) then . else empty end) | length>=$total)}'
# 查看丢失全部副本的region
 region --jq='.regions[] | {id: .id, peer_stores: [.peers[].store_id] | select(length as $total | map(if .==(1253,4,5) then . else empty end) | length>=$total)}'
 # jq的使用可参考https://asktug.com/t/topic/63086

2.3.关闭pd调度,避免恢复过程中产生异常

# 进入交互模式
tiup ctl:v4.0.13 pd -u http://pd_ip:pd_port -i
# 分别执行以下命令
config set region-schedule-limit 0
config set replica-schedule-limit 0
config set leader-schedule-limit 0
config set merge-schedule-limit 0
# 查看调度是否关闭
operator show

2.4.停止tikv进程(防止执行unsafe-recover remove-fail-stores出现文件锁而失败)

tiup cluster stop cluster_name -R tikv

2.5.进行unsafe-recover remove-fail-stores

2.5.1 将tikvctl挪移到所有状态正常kv机器中

scp /data/tidb/.tiup/components/ctl/v4.0.13/tikv-ctl tidb@192.168.1.1:/home/tidb
scp /data/tidb/.tiup/components/ctl/v4.0.13/tikv-ctl tidb@192.168.1.2:/home/tidb
scp /data/tidb/.tiup/components/ctl/v4.0.13/tikv-ctl tidb@192.168.1.3:/home/tidb

2.5.2 执行tikvctl命令

# 4.0.x 版本命令,-s是指store id,--all-regions是指所有region,-r 可以用来指定的region来代替--all-regions
# unsafe-recover remove-fail-stores(故障机器从指定 Region 的 peer 列表中移除)

./tikv-ctl --db /data/tikv/tikv-data28016/db unsafe-recover remove-fail-stores -s 1253,4,5 --all-regions

# 5.x 版本命令

./tikv-ctl --data-dir /data/tikv/tikv-data28016 unsafe-recover remove-fail-stores -s 1253,4,5 --all-regions

上面的步骤已经把丢失两副本的region恢复过来,接下来就是三副本全部丢失的region的恢复

2.6 修复三副本丢失的region

2.6.1 查看region的情况

curl http://tidb_ip:10080/regions/1189
{
 "start_key": "dIAAAAAAAAAZ",
 "end_key": "dIAAAAAAAAAb",
 "start_key_hex": "748000000000000019",
 "end_key_hex": "74800000000000001b",
 "region_id": 52,
 "frames": [
  {
   "db_name": "mysql",
   "table_name": "stats_buckets",
   "table_id": 25,
   "is_record": false,
   "index_name": "tbl",
   "index_id": 1
  },
  {
   "db_name": "mysql",
   "table_name": "stats_buckets",
   "table_id": 25,
   "is_record": true
  }
 ]

2.6.2 创建空region

# v4 版本
./tikv-ctl --db /data/tidb/tidb-data/tikv-20160/db recreate-region -p pd_ip:pd_port -r region_id
# v5 版本
./tikv-ctl --data-dir /data/tidb/tidb-data/tikv-20160/ recreate-region -p pd_ip:pd_port -r region_id

2.7.恢复pd调度

# 进入交互模式
tiup ctl:v4.0.13 pd -u http://pd_ip:pd_port -i
# 分别执行以下命令(值为关闭之前的值就可以)
config set region-schedule-limit 2048
config set replica-schedule-limit 64
config set leader-schedule-limit 4
config set merge-schedule-limit 8

2.8.启动tikv集群

tiup cluster start cluster_name -R tikv

注: 这时候集群可以正常访问,但是数据会丢失,需要扩容节点保证三副本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值