[转帖]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的设计哲学,比如,数据库就活该要么OLAP,要么OLTP么,为嘛就不能兼顾一下?数据量大了后,就一定要反人类的分库分表么?你当分库分表好玩么?分库一时爽,维护火葬场!
尤其在一些中小型团队里,为了数据分析搞一套Hadoop,约等于为了喝牛奶,从牛崽开始养一头奶牛。一路上明坑暗坑不断。
考虑到学习成本,迁移成本(高度兼容MySQL-但不是100%),运维成本(支持Ansible-团队有Ansible运维经验),使用成本(相比Hadoop),硬件成本(相比Hadoop),收益(不用分开分表,支持OLAP和OLTP,支持分布式事务,支持TiSpark,支持TiKV,自带同步工具)等。
好了,疑似广告的一段话说完了,回归正题,介绍是如何悲催的遇上整栋大厦停电,并且恰好TiKV文件损坏,以及如何在TiDB各位大佬的远程文字指导下,一步步把心态从删库跑路,转变成说不定还有救,以及,我擦,真救回来的坎坷心路旅程。
因为TiDB之前是别的同事负责,刚接过来不久,对TiDB整个的掌握还很初级。真·面向故障学习!
全文主要是对本次事故的回溯,琐碎细节较多,介意的可以直接看最后。
集群环境

悲催之始
上午coding正嗨,突发性停电
来电后 ssh 到 TiDB 的 Ansible 主控机 ansible-playbook start.yml

事情有点不妙,但是扔不死心的, stop and start 一通后,仍是这个结果。事情有点大条。
好在之前偷偷潜伏到TiDB的官方群里,没事就听各位大佬吹水打屁,多少受了点熏陶。撸起袖子,开搞。
定位问题
Round 1 懵逼树上懵逼果
先看官方文档

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

暴露的是连接两个TiKV报错,这是前期比较关键的线索,起码有初步排查方向了。
另外从日志看到,疑似报空间不足,实际上没意义,在两台tikv执行 df -i df -h 来看,都很充足。


群内 @张曾钧@PingCAP 大佬开始介入,并且开始了将近8个小时的细心和耐心的指导,讲真,PingCAP团队是我见过最热心耐心的团队,素未蒙面,但乐于助人[呲牙]
此时,通过看官方文档,尝试性,试了下Prometheus可以打开,

能看出有两个TiKV down掉,正好是上面两个。PS ,我是事后才发现的,当时我一直认为TiKV是起来的[捂脸]
插播一下,TiDB 整体架构 ,不多解释。建议看看,可以了解一下TiDB的架构原理,比如,TiDB,TiKV,PD等的职责。

小结: Round 1 以找出两个TiKV down结束,效率低到羞愧。
Round 2 懵逼树前排排坐
注意,下面如无特殊说明,一律是TiKV关掉状态下,执行命令。


使用@唐刘@PingCAP的方法 grep -B 50 Welcome ,开始接触事发原因了。
更多的grep的方法(-A -B -C),参考 man grep 或者 GREP(1) ,因为tikv启动会打印Welcome,所以有理由认为,每次的Welcome之前的,肯定是上次退出的原因。

至此,出现了第一个坏掉的region。
当时执行了 ./pd-ctl store -d -u http://127.0.0.1:2379


找到挂掉的两个TiKV的store id,跟上图的
68935能对起来。
此时救苦救难的 大佬 提供了 TiKV Control 使用说明#恢复损坏的-mvcc-数据


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

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 操作。

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

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

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


发现坏掉的 region是 31101(实际上因为用的是2.1.4,每次只显示一个,处理完后,才会显示下一个,效率很低,后来在 @戚铮 大佬的指导下,换用tikv-ctl 3.x ,每次可以显示全部的坏的region )
在好的节点上执行,也不是文中的all regions are healthy ,实际上是因为,数据文件被占用,没法获取句柄,停掉就行 ansible-playbook stop.yml -l tikv_servers 停掉全部tikv节点

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

通过执行 pd-ctl region 31101 发现


这个region有两个副本是在坏节点上,超过一半损坏(剧透一下,实际上最后发现,出问题的都是损坏超过1半的,1/3的都自己恢复了)
尝试执行 operator add remove-peer 发现删不掉。

此时 戚铮 大佬出场。

经过一番测试,发现 region31101很坚挺,使用 recover-mvcc 恢复不了,前面说了是因为损失超过一半副本的原因,使用 operator add remove-peer 删不了,估计也是。
Round 4 貌似解决
不能因为一颗老鼠屎,坏了一锅汤,部分region坏掉了,先尝试强制恢复试试,保证别的正常吧。

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

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

此时执行

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

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

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

218这个有6个坏的

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

Round 4 服务已可以启动,总结一下
先stop TiKV
如果坏的region少于一半,可以尝试 recover-mvcc
如果超过一半,就玄乎了,是在不行就 unsafe-recover remove-fail-stores,然后再 tikv-ctl --db /path/to/tikv/db tombstone -p 127.0.0.1:2379 -r 31101,xx,xx,xx
再start TiKV
Round 5 最终局
你以为万事大吉了?命运就是爱捉弄人。


回到原点。
最后还是损失了部分,但是量不大。
总结
对TiDB不够熟悉,很多流于表面
对TiDB的文档和工具使用不熟练
TiDB的文档不太清晰,比如在故障处理里,没有内链像是pd-ctl,tikv-ctl,甚至都没有提,在pd-ctl和tikv-ctl等工具没有提如何下载,在工具下载里,没有提包含啥工具。很佛系
多亏了群内各位大佬的热心指导
如果是TiKV有问题,先stop TiKV
如果对于损坏数小于半数的,可以尝试 recover-mvcc
对于超过半数的,可以尝试 unsafe-recover remove-fail-stores ,再 将store设置 tombstone
再start TiKV
可以结合 tidb损坏tikv节点怎么恢复集群 来做。
多试验,尤其是做极限测试,并且尝试处理,会积累很多经验。
虽然没有瑞恩没有全须全尾的拯救回来,但是缺胳膊少腿总好过没命啊。
一点小广告
其实如果不考虑OLTP的场景,还可以尝试使用clickhouse。这是之前整理的clickhouse的一些文章。
[转帖]038-拯救大兵瑞恩之 TiDB 如何在 TiKV 损坏的情况下恢复的更多相关文章
- HDU 4845 拯救大兵瑞恩(分层图状压BFS)
拯救大兵瑞恩 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Sub ...
- 【TIDB】4、业界使用情况
一.小米 1.背景 小米关系型存储数据库首选 MySQL,单机 2.6T 磁盘.由于小米手机销量的快速上升和 MIUI 负一屏用户量的快速增加,导致负一屏快递业务数据的数据量增长非常快, 每天的读写量 ...
- TiDB在X86和ARM混合平台下的离线部署和升级
[是否原创]是 [首发渠道]TiDB 社区 背景 在之前我们团队发布了TiDB基于X86和ARM混合部署架构的文章:TiDB 5.0 异步事务特性体验--基于X86和ARM混合部署架构,最近有朋友问到 ...
- [CTSC 1999]拯救大兵瑞恩&[网络流24题]孤岛营救问题
Description $1944$ 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫 ...
- 拯救大兵瑞恩 HDU - 4845(状压bfs || 分层最短路)
1.状压bfs 这个状压体现在key上 我i们用把key状压一下 就能记录到一个点时 已经拥有的key的种类 ban[x1][y1][x2][y1]记录两个点之间的状态 是门 还是墙 还是啥都没有 ...
- hdu 4845 : 拯救大兵瑞恩 (bfs+状态压缩)
题目链接 #include<bits/stdc++.h> using namespace std; typedef long long LL; int n,m,p,s,k; ,,,-}; ...
- 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)
首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...
- 如何在没有代理的情况下编译 tidb server
这里主要介绍 tidb server 的编译, ti kv 和 ti pd 的编译不在本文范围内: go 语言 1.11 版本之后支持 go.mod, 依赖包在 go.mod 里生成, 如果 go. ...
- Apache DolphinScheduler&TiDB联合Meetup | 聚焦开源生态发展下的应用开发能力
在软件开发领域有一个流行的原则:Don't Repeat Yourself(DRY),翻译过来就是:不要重复造轮子.而开源项目最基本的目的,其实就是为了不让大家重复造轮子. 尤其是在大数据这样一个高速 ...
- [转帖]「白帽黑客成长记」Windows提权基本原理(下)
「白帽黑客成长记」Windows提权基本原理(下) https://www.cnblogs.com/ichunqiu/p/10968674.html 提权.. 之前还在想 为什么 我的 sqlserv ...
随机推荐
- 如何从零开始实现TDOA技术的 UWB 精确定位系统(3)
这是一个系列文章<如何从零开始实现TDOA技术的 UWB 精确定位系统>第3部分. 重要提示(劝退说明): Q:做这个定位系统需要基础么?A:文章不是写给小白看的,需要有电子技术和软件 ...
- rime中州韵 输入效果一览 100+增强功能效果
rime是一个定制化程度很高的输入法框架, 我们可以在该框架上搭建适合自己的输入法程序.我们将在专栏 小狼毫 Rime 保姆教程 中完成以下近百种定制化效果的配置与演示.欢迎订阅. 以下为个性化定制的 ...
- cookie的一些知识点总结
一.cookie的种类 sessionID 这个ID是会话性的,只要关闭了当前浏览器,这个ID会消失,需要调用getSessoin重新获取一个新的session 会话性cookie 这个cookie也 ...
- gitee图床不能用了,心态崩了
起因 大概上周五晚上吧,想着可以正常下班了.也没啥事,正好可以逛逛自己的小破站,看看有没有小伙伴留言什么的. 然后发现小破站图片显示不出来了... 一开始也没在意,想着可能是Gitee又挂了,可能一会 ...
- Java 设置Excel页面背景
本文介绍通过Java 程序在Excel表格中设置页面背景的方法,可设置颜色背景(即指定单一颜色作为背景色).图片背景(即加载图片设置成页面背景).程序中需要使用免费版Excel类库工具 Free Sp ...
- 第五部分_Shell脚本条件判断语法结构
条件判断语法结构 思考:何为真(true)?何为假(false)? 1. 条件判断语法格式 格式1: test条件表达式 格式2: [ 条件表达式 ] 格式3: [[ 条件表达式 ]] (支持正则~) ...
- 实战案例丨GaussDB for DWS如何识别坏味道的SQL
摘要:SQL中的坏味道,你知道吗? SQL语言是关系型数据库(RDB)的标准语言,其作用是将使用者的意图翻译成数据库能够理解的语言来执行.人类之间进行交流时,同样的意思用不同的措辞会产生不同的效果. ...
- 用 Java?试试国产轻量的 Solon v1.10.1
相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) qps 高 2- 3 倍. (更高) 运行时内存节省 1/3 ~ 1/2. (更少) 打包 ...
- Jenkins + SVN/Git + Maven + Docker + 阿里云镜像 + Kubernetes(K8S)
Jenkins 2361.2 + Maven Integration + SVN/GIT + Docker + 阿里云镜像 + Kubernetes(K8S) 本文用于学习,了解原理,和实际应用,有所 ...
- Java 网络编程 —— 实现非阻塞式的客户端
创建阻塞的 EchoClient 客户程序一般不需要同时建立与服务器的多个连接,因此用一个线程,按照阻塞模式运行就能满足需求 public class EchoClient { private Soc ...