[转帖]038-拯救大兵瑞恩之 TiDB 如何在 TiKV 损坏的情况下恢复

拯救,大兵,tidb,如何,tikv,损坏,情况,恢复 · 浏览次数 : 0

小编点评

## Round 1 * 发现服务器有两个问题, region 31101 和 31102 * 尝试强制恢复,但是失败 * 尝试恢复,但是失败 ## Round 2 * 由于服务器有两个问题,无法从 region 31101 和 31102 中恢复 * 尝试恢复,但是失败 ## Round 3 * 尝试从 region 31101 和 31102 中恢复 * 发现其中一个 region 已经删除 * 尝试从 region 31101 中恢复,但是失败 ## Round 4 * 尝试从 region 31101 中恢复,但是失败 * 尝试从 region 31102 中恢复,但是失败 ## Round 5 * 尝试从 region 31101 中恢复,但是失败 * 尝试从 region 31102 中恢复,但是失败 ## Round 6 * 由于服务器有两个问题,无法从 region 31101 和 31102 中恢复 * 尝试恢复,但是失败 ## Round 7 * 尝试从 region 31101 中恢复,但是失败 * 尝试从 region 31102 中恢复,但是失败 ## Round 8 * 由于服务器有两个问题,无法从 region 31101 和 31102 中恢复 * 尝试恢复,但是失败 ## Round 9 * 尝试从 region 31101 中恢复,但是失败 ## Round 10 * 尝试从 region 31101 中恢复,但是失败 ## Round 11 * 尝试从 region 31101 中恢复,但是失败 ## Round 12 * 由于服务器有两个问题,无法从 region 31101 和 31102 中恢复 * 尝试恢复,但是失败

正文

https://tidb.net/blog/4b5451bb?utm_source=tidb-community&utm_medium=referral&utm_campaign=repost#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99

 

很喜欢TiDB的设计哲学,比如,数据库就活该要么OLAP,要么OLTP么,为嘛就不能兼顾一下?数据量大了后,就一定要反人类的分库分表么?你当分库分表好玩么?分库一时爽,维护火葬场!

尤其在一些中小型团队里,为了数据分析搞一套Hadoop,约等于为了喝牛奶,从牛崽开始养一头奶牛。一路上明坑暗坑不断。

考虑到学习成本,迁移成本(高度兼容MySQL-但不是100%),运维成本(支持Ansible-团队有Ansible运维经验),使用成本(相比Hadoop),硬件成本(相比Hadoop),收益(不用分开分表,支持OLAP和OLTP,支持分布式事务,支持TiSpark,支持TiKV,自带同步工具)等。

好了,疑似广告的一段话说完了,回归正题,介绍是如何悲催的遇上整栋大厦停电,并且恰好TiKV文件损坏,以及如何在TiDB各位大佬的远程文字指导下,一步步把心态从删库跑路,转变成说不定还有救,以及,我擦,真救回来的坎坷心路旅程。

因为TiDB之前是别的同事负责,刚接过来不久,对TiDB整个的掌握还很初级。真·面向故障学习!

全文主要是对本次事故的回溯,琐碎细节较多,介意的可以直接看最后。

集群环境

WX20190916-173756%402x

 

悲催之始

上午coding正嗨,突发性停电

 
来电后 ssh 到 TiDB 的 Ansible 主控机 ansible-playbook start.yml

 

16c4d9d97f56a169

事情有点不妙,但是扔不死心的, stop and start 一通后,仍是这个结果。事情有点大条。

好在之前偷偷潜伏到TiDB的官方群里,没事就听各位大佬吹水打屁,多少受了点熏陶。撸起袖子,开搞。

 

定位问题

 

Round 1 懵逼树上懵逼果

先看官方文档

16c4d9d97f38a1e7

好吧,跟没看区别不大。

既然是TiDB起不来,就先看TiDB的日志(实际上应该看http://prometheus:9090/targets ,因为不太熟悉,所以走了弯路,为嘛不看Grafana,是因为TiDB那卡到后,Ansible就自动退出了,没有起Grafana)

16c4d9d97f81aca6

暴露的是连接两个TiKV报错,这是前期比较关键的线索,起码有初步排查方向了。

 
另外从日志看到,疑似报空间不足,实际上没意义,在两台tikv执行 df -i df -h 来看,都很充足。

 

16c4d9d97facde58

5-16c4d9d9825cdaee

群内 @张曾钧@PingCAP 大佬开始介入,并且开始了将近8个小时的细心和耐心的指导,讲真,PingCAP团队是我见过最热心耐心的团队,素未蒙面,但乐于助人[呲牙]

此时,通过看官方文档,尝试性,试了下Prometheus可以打开,

7-16c4d9d980a935a4

能看出有两个TiKV down掉,正好是上面两个。PS ,我是事后才发现的,当时我一直认为TiKV是起来的[捂脸]

 
插播一下,TiDB 整体架构 ,不多解释。建议看看,可以了解一下TiDB的架构原理,比如,TiDB,TiKV,PD等的职责。

 

88-16c4d9d9a8ce24f3

小结: Round 1 以找出两个TiKV down结束,效率低到羞愧。

 

Round 2 懵逼树前排排坐

注意,下面如无特殊说明,一律是TiKV关掉状态下,执行命令。

9-16c4d9d9aac2fe61

10-16c4d9d9ab8b8ffd

使用@唐刘@PingCAP的方法 grep -B 50 Welcome ,开始接触事发原因了。

更多的grep的方法(-A -B -C),参考 man grep 或者 GREP(1) ,因为tikv启动会打印Welcome,所以有理由认为,每次的Welcome之前的,肯定是上次退出的原因。

16c4d9d9abdf265d

至此,出现了第一个坏掉的region。

 
当时执行了 ./pd-ctl store -d -u http://127.0.0.1:2379

 

12-16c4d9d9ae871295

16c4d9d9b4e81fcf

找到挂掉的两个TiKV的store id,跟上图的16c4d9d9d317421f 68935能对起来。

此时救苦救难的 大佬 提供了 TiKV Control 使用说明#恢复损坏的-mvcc-数据

14-16c4d9d9d4558de2

15-16c4d9d9d6d57cfc

实际上执行后,没啥效果,后来发现是因为此region超过一半副本出问题了,recover-mvcc 没法恢复。

16-16c4d9d9d751ce0c

Round 2 结束,找到了救命稻草,TiKV Control 和PD Control,但是,事情远没这么简单。

 

Round 3 渐入佳境

中间出了个差点搞死自己的小插曲

 
/home/tidb/tidb-ansible/resources/bin/pd-ctl -u "http://172.16.10.1:2379" -d store delete 10 自作聪明的以为,TiKV 已经没救了,执行了store delete 操作。

 

17-16c4d9d9e51bd5db

但是实际上还有救,所以又变成了,如何把已经delete掉的store,再度挂上去。

21-16c4d9d9e16fb5c1

根据 大佬的 curl -X POST http://${pd_ip}:2379/pd/api/v1/store/${store_id}/state?state=Up 成功挂上,当然还是down的状态。

根据

18-16c4d9d9f99141ce

tikv-ctl --db /path/to/tikv/db bad-regions 两台坏的,分别如下

16c4d9da015851ff

16c4d9da0f9aba1c

发现坏掉的 region是 31101(实际上因为用的是2.1.4,每次只显示一个,处理完后,才会显示下一个,效率很低,后来在 @戚铮 大佬的指导下,换用tikv-ctl 3.x ,每次可以显示全部的坏的region )

 
在好的节点上执行,也不是文中的all regions are healthy ,实际上是因为,数据文件被占用,没法获取句柄,停掉就行 ansible-playbook stop.yml -l tikv_servers 停掉全部tikv节点

 

16c4d9da0fa0656b

此时@张曾钧@PingCAP 提示用 tikv-ctl --db /path/to/tikv/db tombstone -p 127.0.0.1:2379 -r 把坏的 region 设置为tombstone ,但是报错

16c4d9da105c1163

通过执行 pd-ctl region 31101 发现

24-16c4d9da177e939e

16c4d9da289cb2bf

这个region有两个副本是在坏节点上,超过一半损坏(剧透一下,实际上最后发现,出问题的都是损坏超过1半的,1/3的都自己恢复了)

尝试执行 operator add remove-peer 发现删不掉。

266-16c4d9da2ac151cf

此时 戚铮 大佬出场。

27-16c4d9da3510ac03

经过一番测试,发现 region31101很坚挺,使用 recover-mvcc 恢复不了,前面说了是因为损失超过一半副本的原因,使用 operator add remove-peer 删不了,估计也是。

 

Round 4 貌似解决

不能因为一颗老鼠屎,坏了一锅汤,部分region坏掉了,先尝试强制恢复试试,保证别的正常吧。

288-16c4d9da2ead55c3

注意此命令是在好的store上执行

29-16c4d9da3fd6614c

此时启动TiKV集群,执行region 31101,坏掉的已经删掉了,但是服务还是起不来。

16c4d9da40d2bdbb

此时执行

16c4d9da4d0a76cf

此时在 @戚铮 老大的指导下,升级 tikv-ctl ,

16c4d9da66188eef

结果202这台,一共三个region坏了,处理了俩,感觉遥遥无期,下了tikv-ctl 3.x后发现,就还有一个坏的。胜利在望。

313-WX20190916-180213%402x

重复上述操作后,此节点终于up了

32-WX20190916-180254%402x

218这个有6个坏的

33-WX20190916-180343%402x

unsafe-recover remove-fail-stores 一通后,终于起来服务了。

16c4d9da6d1741f6

Round 4 服务已可以启动,总结一下

  1. 先stop TiKV

  2. 如果坏的region少于一半,可以尝试 recover-mvcc

  3. 如果超过一半,就玄乎了,是在不行就 unsafe-recover remove-fail-stores,然后再 tikv-ctl --db /path/to/tikv/db tombstone -p 127.0.0.1:2379 -r 31101,xx,xx,xx

  4. 再start TiKV

 

Round 5 最终局

你以为万事大吉了?命运就是爱捉弄人。

1

16c4d9da6dd80702

回到原点。

最后还是损失了部分,但是量不大。

 

总结

  1. 对TiDB不够熟悉,很多流于表面

  2. 对TiDB的文档和工具使用不熟练

  3. TiDB的文档不太清晰,比如在故障处理里,没有内链像是pd-ctl,tikv-ctl,甚至都没有提,在pd-ctl和tikv-ctl等工具没有提如何下载,在工具下载里,没有提包含啥工具。很佛系

  4. 多亏了群内各位大佬的热心指导

  5. 如果是TiKV有问题,先stop TiKV

  6. 如果对于损坏数小于半数的,可以尝试 recover-mvcc

  7. 对于超过半数的,可以尝试 unsafe-recover remove-fail-stores ,再 将store设置 tombstone

  8. 再start TiKV

  9. 可以结合 tidb损坏tikv节点怎么恢复集群 来做。

  10. 多试验,尤其是做极限测试,并且尝试处理,会积累很多经验。

  11. 虽然没有瑞恩没有全须全尾的拯救回来,但是缺胳膊少腿总好过没命啊。

 

一点小广告

其实如果不考虑OLTP的场景,还可以尝试使用clickhouse。这是之前整理的clickhouse的一些文章。

与[转帖]038-拯救大兵瑞恩之 TiDB 如何在 TiKV 损坏的情况下恢复相似的内容:

[转帖]038-拯救大兵瑞恩之 TiDB 如何在 TiKV 损坏的情况下恢复

https://tidb.net/blog/4b5451bb?utm_source=tidb-community&utm_medium=referral&utm_campaign=repost#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99 很喜欢TiDB的设计哲学,比如,

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

[转帖]ISV 、OSV、 SIG 概念

ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

[转帖]HTTPS中间人攻击原理

https://www.zhihu.com/people/bei-ji-85/posts 背景 前一段时间,公司北京地区上线了一个HTTPS防火墙,用来监听HTTPS流量。防火墙上线之前,邮件通知给管理层,我从我老大那里听说这个事情的时候,说这个有风险,然后意外地发现,很多人原来都不知道HTTPS防

[转帖]关于字节序(大小端)的一点想法

https://www.zhihu.com/people/bei-ji-85/posts 今天在一个技术群里有人问起来了,当时有一些讨论(不完全都是我个人的观点),整理一下: 为什么网络字节序(多数情况下)是大端? 早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地

[转帖]awk提取某一行某一列的数据

https://www.jianshu.com/p/dbcb7fe2da56 1、提取文件中第1列数据 awk '{print $1}' filename > out.txt 2、提取前2列的文件 awk `{print $1,$2}' filename > out.txt 3、打印完第一列,然后打

[转帖]awk 中 FS的用法

https://www.cnblogs.com/rohens-hbg/p/5510890.html 在openwrt文件 ar71xx.sh中 查询设备类型时,有这么一句, machine=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /machine/ {print $2}' /

[转帖]Windows Server 2022 简体中文版、英文版下载 (updated Oct 2022)

https://sysin.org/blog/windows-server-2022/ Windows Server 2022 正式版,2022 年 10 月更新,VLSC Posted by sysin on 2022-10-27 Estimated Reading Time 8 Minutes