一、背景
名称 | 数量 |
---|---|
tikv | 3 |
副本 | 3 |
1.故障:
因为某些原因,两台tikv不可连接,出现region不能访问的故障
2.几条理论:
2.1.多副本原则
存在一半以上的副本则集群访问不受影响(如n副本,存活(n+1)/ 2)
2.2.数据完整性
当副本数量等于tikv的数量的时候,每一个tikv都有全部的region,只不过不是每个region都是leader
2.3.集群不可访问
当副本存活数量小于(n+1)/ 2的时候,集群不可访问,只能使用unsafe recover来恢复
二、故障处理
1.查看不可连接的store
# 记录下 "state_name": "Disconnected"的store id(我的是1,7)
tiup ctl:v4.0.13 pd -u http://pd_ip:pd_port store
2.关闭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
3.停止tikv进程(防止执行unsafe-recover remove-fail-stores出现文件锁而失败)
tiup cluster stop cluster_name -R tikv
4.进行unsafe-recover remove-fail-stores
4.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
4.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 1,7 --all-regions
# 5.x 版本命令
./tikv-ctl --data-dir /data/tikv/tikv-data28016 unsafe-recover remove-fail-stores -s 1,7 --all-regions
5.恢复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
6.启动tikv集群
tiup cluster start cluster_name -R tikv
三、一些不成功的尝试方法
1.主要原因
看日志的原因是连接到几个已经down 掉的kv
2.解决
2.1尝试 --force缩容依旧报错
tiup cluster scale-in cluster_name -N tikv_ip:tikv_port --force
2.2 尝试store delete
# 进入交换模式
tiup ctl:v4.0.13 pd -u http://pd_ip:pd_port -i
# 查看当前都有哪些store
store
# 删除对应id的store
store delete 1
# 没有删除掉,这是因为状态不是Tombstone的状态无法进行delete
2.3 查看宕机store上的region
# 进入交换模式
tiup ctl:v4.0.13 pd -u http://pd_ip:pd_port -i
# 查看region
region store 1
# 这里可以看到pd的记录里,还有好多region再这个宕机的store上,那么这样的话就回向对应的kv发布消息,但kv收不到,所以就会有region不可用的报错
综上: 只有把宕机store上的region清除掉,才能让集群正常启动,所以这里就用到了unsafe-recover方法
感谢大佬的文章:
https://mp.weixin.qq.com/s/u5MBSIydf_ZQ1jxCJn4O2A
https://tidb.io/blog/9163546d