一、背景
名称 | 数量 |
---|---|
tikv | 4 |
副本 | 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
注: 这时候集群可以正常访问,但是数据会丢失,需要扩容节点保证三副本