https://tidb.net/blog/b1ae4ee7
 

TiDB分布式数据库采用多副本机制,数据副本通过 Multi-Raft 协议同步事务日志,确保数据强一致性且少数副本发生故障时不影响数据的可用性。在三副本情况下,单副本损坏可以说对集群没什么影响,但当遇到多副本损坏的损坏丢失的时候,如何快速恢复也是DBA需要面对的问题,本次主要讲述对TiDB对多副本损坏丢失的处理方法。

二、TiDB 数据库的存储架构

TiDB Server:SQL 层,对外暴露 MySQL 协议的连接 endpoint,负责接受客户端的连接,执行 SQL 解析和优化,最终生成分布式执行计划。TiDB 层本身是无状态的,实践中可以启动多个 TiDB 实例,通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址,客户端的连接可以均匀地分摊在多个 TiDB 实例上以达到负载均衡的效果。TiDB Server 本身并不存储数据,只是解析 SQL,将实际的数据读取请求转发给底层的存储节点 TiKV(或 TiFlash)。

PD (Placement Driver) Server:整个 TiDB 集群的元信息管理模块,负责存储每个 TiKV 节点实时的数据分布情况和集群的整体拓扑结构,提供 TiDB Dashboard 管控界面,并为分布式事务分配事务 ID。PD 不仅存储元信息,同时还会根据 TiKV 节点实时上报的数据分布状态,下发数据调度命令给具体的 TiKV 节点,可以说是整个集群的“大脑”。此外,PD 本身也是由至少 3 个节点构成,拥有高可用的能力。建议部署奇数个 PD 节点。

存储节点
TiKV Server:负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range(从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region。TiKV 的 API 在 KV 键值对层面提供对分布式事务的原生支持,默认提供了 SI (Snapshot Isolation) 的隔离级别,这也是 TiDB 在 SQL 层面支持分布式事务的核心。TiDB 的 SQL 层做完 SQL 解析后,会将 SQL 的执行计划转换为对 TiKV API 的实际调用。所以,数据都存储在 TiKV 中。另外,TiKV 中的数据都会自动维护多副本(默认为三副本),天然支持高可用和自动故障转移。

TiFlash:TiFlash 是一类特殊的存储节点。和普通 TiKV 节点不一样的是,在 TiFlash 内部,数据是以列式的形式进行存储,主要的功能是为分析型的场景加速。

三、集群信息

1.store情况

192.168.2.81:20160  --->  id=4

192.168.2.82:20160  --->  id=5

192.168.2.83:20160  --->  id=1

192.168.2.81:20161  --->  id=6247

192.168.2.82:20161  --->  id=6246

192.168.2.83:20161  --->  id=6248

2.测试表db1.sbtest1的region分布情况

查看各4个region的分布情况

Region 5037    ---> leader:4    follower:1,5

Region 5015    ---> leader:6247 follower:1,4

Region 5029    ---> leader:6248 follower:4,6246

Region 6001    ---> leader:4    follower:1,6246

3.模拟tikv出现故障

模拟192.168.2.81:20160和192.168.2.83:20160出现故障即store id 为1,4,那Region 5037,Region 5015,Region 6001都会同时失去两副本,其中包括leader和follower副本。

由于是虚拟机多实例环境,通过kill掉进程进行模拟tikv故障环境,所以需要关闭 systemctl 自动拉起 tikv 服务功能

/etc/systemd/system/tikv-20160.service

Restart=no   #默认是 always,总是拉起服务的意思,改no,发现服务挂掉不拉起

#使修改生效

systemctl daemon-reload

杀掉192.168.2.81:20160和192.168.2.83:20160进程

查看集群状态,192.168.2.81:20160和192.168.2.83:20160出现Disconnected

这时候查看db1.sbtest1的表,出现tikv超时

使用 pd-ctl 检查大于等于一半副本数在故障节点上的 Region,并记录它们的 ID(故障节点为store id 1,4)

region --jq=".regions[] | {id: .id, peer_stores: [.peers[].store_id] | select(length as $total | map(if .==(1,4) then . else empty end) | length>=$total-length) }"
{"id":3001,"peer_stores":[5,1,4]}
{"id":5015,"peer_stores":[4,1,6247]}
{"id":3021,"peer_stores":[5,1,4]}
{"id":6037,"peer_stores":[1,4,6248]}
{"id":6001,"peer_stores":[4,1,6246]}
{"id":6051,"peer_stores":[4,1,6246]}
{"id":5037,"peer_stores":[4,1,5]}

db1.sbtest1表上面包含这3个region

{"id":5015,"peer_stores":[4,1,6247]}

{"id":5037,"peer_stores":[4,1,5]}

{"id":6001,"peer_stores":[4,1,6246]}

4.有损不安全恢复

现在由于3副本已损坏大于等于一半副本数的region,此时对应表访问不了,这时通过有损恢复,但无法保证数据索引一致性和事务完整性。

在使用 Online Unsafe Recovery 功能进行数据有损恢复前,请确认以下事项:

  • 离线节点导致部分数据确实不可用。

  • 离线节点确实无法自动恢复或重启。

[tidb@tidb80 ~]$ tiup ctl:v6.1.0 pd -u http://192.168.2.81:2379 -i
» unsafe remove-failed-stores 1,4
Success! » unsafe remove-failed-stores show
[
{
"info": "Unsafe recovery enters collect report stage: failed stores 1, 4",
"time": "2023-03-31 14:46:06.462"
},
{
"info": "Unsafe recovery enters force leader stage",
"time": "2023-03-31 14:46:13.675",
"actions": {
"store 5": [
"force leader on regions: 3021, 3001, 5037"
],
"store 6246": [
"force leader on regions: 6001, 6051"
],
"store 6247": [
"force leader on regions: 5015"
],
"store 6248": [
"force leader on regions: 6037"
]
}
},
{
"info": "Unsafe recovery enters demote failed voter stage",
"time": "2023-03-31 14:46:54.721",
"actions": {
"store 5": [
"region 3021 demotes peers { id:6068 store_id:1 }, { id:6208 store_id:4 }",
"region 3001 demotes peers { id:6209 store_id:1 }, { id:6217 store_id:4 }",
"region 5037 demotes peers { id:5039 store_id:4 }, { id:6123 store_id:1 }"
],
"store 6246": [
"region 6001 demotes peers { id:6019 store_id:4 }, { id:6238 store_id:1 }",
"region 6051 demotes peers { id:6142 store_id:4 }, { id:6206 store_id:1 }"
],
"store 6247": [
"region 5015 demotes peers { id:5017 store_id:4 }, { id:6242 store_id:1 }"
],
"store 6248": [
"region 6037 demotes peers { id:6039 store_id:1 }, { id:6041 store_id:4 }"
]
}
},
{
"info": "Unsafe recovery finished",
"time": "2023-03-31 14:47:05.170",
"details": [
"affected table ids: 201, 309, 314"
]
}
]

检查数据索引一致性

#若结果有不一致的索引,可以通过重命名旧索引、创建新索引,然后再删除旧索引的步骤来修复数据索引不一致的问题

通过有损修复后,数据表可恢复读写

总结

1.在 TiDB 中,根据用户定义的多种副本规则,一份数据可能会同时存储在多个节点中,从而保证在单个或少数节点暂时离线或损坏时,读写数据不受任何影响。但是,当一个 Region 的多数或全部副本在短时间内全部下线时,该 Region 会处于暂不可用的状态,无法进行读写操作

2.一旦执行了unsafe recovery,所指定的节点将被设为 Tombstone 状态,不再允许启动,执行过程中,所有调度以及 split/merge 都会被暂停,待恢复成功或失败后自动恢复

[转帖]TiDB损坏多副本之有损恢复处理方法的更多相关文章

  1. 数据库页已标记为 RestorePending,可能表明磁盘已损坏。要从此状态恢复,请执行还原操作。

    错误提示: 消息 829,级别 21,状态 1,第 1 行 数据库 ID 15,页 (1:21826) 已标记为 RestorePending,可能表明磁盘已损坏.要从此状态恢复,请执行还原操作. 引 ...

  2. tidb损坏tikv节点怎么恢复集群

    tikv节点宕机(机器再起不来),或者数据节点被rm -rf 掉了怎么办 正常情况下tikv节点down掉了.此时不要去执行store delete  store_id .数据一般可以正常访问,但是如 ...

  3. Mysql ibdata 丢失或损坏如何通过frm&ibd 恢复数据

    mysql存储在磁盘中,各种天灾人祸都会导致数据丢失.大公司的时候我们常常需要做好数据冷热备,对于小公司来说要做好所有数据备份需要支出大量的成本,很多公司也是不现实的.万一还没有做好备份,数据被误删除 ...

  4. 此windows副本不是正版解决方法

    老爸的win7今天黑屏 右下角出现 Windows7 内部版本7601 此windows副本不是正版 网上零散地找到了解决办法 写博汇总一下 我的情况是 电脑属性中的windows激活显示: 状态不可 ...

  5. mongodb的副本集|备份|恢复备份

    复制(副本集) 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性 复制还允许从硬件故障和服务中断中恢复数据 为什么要复制 数据备份 数据灾 ...

  6. 一次Linux磁盘损坏导致系统不可用恢复实例

    Linux操作系统的server重新启动后.系统启动报错,系统无法正常使用. 1.报错信息 1.1.报错屏幕信息 1.2.报错信息提取关键信息 (1)/dev/sda3:File -(inode #1 ...

  7. 在Windows上使用Docker 创建MongoDB 副本集的极简方法(翻译)

    这篇博客介绍下在Windows上使用Docker 创建MongoDB 三节点副本集的最简单的方法.以下命令需要Docker for Windows并使用Linux 容器. 1: 为每个节点创建数据卷 ...

  8. 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...

  9. [转帖]Windows7/2008中批量删除隧道适配器的方法

    https://www.jb51.net/os/windows/479838.html 客户现场的硬件信息总是发生变化 这里查找一下资料 尝试一下. 1.在网卡属性的“网络”中,将“Internet协 ...

  10. [转帖]四个修改Docker默认存储位置的方法

    四个修改Docker默认存储位置的方法 https://blog.51cto.com/forangela/1949947 易改乾坤关注0人评论27435人阅读2017-07-22 09:18:48   ...

随机推荐

  1. rime中州韵 输入效果一览 100+增强功能效果

    rime是一个定制化程度很高的输入法框架, 我们可以在该框架上搭建适合自己的输入法程序.我们将在专栏 小狼毫 Rime 保姆教程 中完成以下近百种定制化效果的配置与演示.欢迎订阅. 以下为个性化定制的 ...

  2. Typora 掘金小册主题

    主题说明 此主题样式基本来源于掘金小册学习界面 下载地址:https://github.com/easylee1996/typora-juejin-theme 主题预览 主题文档示例 如何使用 克隆仓 ...

  3. Spring源码学习笔记3——根据BeanDefinition实例化Bean的前置准备

    一丶前言 笔记1和笔记2中我们分析了如何根据xml和注解加载生成BeanDefinition,并注册到BeanFactory,接下载便是Bean的加载,在加载之前会进行一些前置准备 二丶前置准备 和B ...

  4. 面试官问我:线程锁导致的kafka客户端超时,如何解决?

    本文分享自华为云社区<线程锁导致的kafka客户端超时问题>,作者: 张俭 . 问题背景 有一个环境的kafka client发送数据有部分超时,拓扑图也非常简单 定位历程 我们先对客户端 ...

  5. 字节跳动开源数据集成引擎 BitSail 的演进历程与能力解析

    导读 BitSail 是字节跳动开源数据集成引擎,支持多种异构数据源间的数据同步,并提供离线.实时.全量.增量场景下全域数据集成解决方案,目前支撑了字节内部和火山引擎多个客户的数据集成需求.经过字节跳 ...

  6. PPT 表格设计

    顶级商业图表在哪找 https://www.mckinsey.com.cn/ 麦肯锡 图表 https://www.cbnweek.com 第一财经 https://data.163.com/ DAT ...

  7. 使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(NFS网络存储)

    使用 Kubeadm 部署 Kubernetes(K8S) 安装 使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- Ingress-Ngnix Volume 是 Pod 中能够被 ...

  8. 在 SDXL 上用 T2I-Adapter 实现高效可控的文生图

    T2I-Adapter 是一种高效的即插即用模型,其能对冻结的预训练大型文生图模型提供额外引导.T2I-Adapter 将 T2I 模型中的内部知识与外部控制信号结合起来.我们可以根据不同的情况训练各 ...

  9. BBS项目(五):xss攻击 上传图片问题 文章编辑、删除功能 用户头像修改 扩展部分

    目录 添加文章功能完善 富文本编辑器上传图片问题 文章编辑功能 文章删除功能 用户头像修改 扩展部分 补充 项目总结 添加文章功能完善 下载第三方模块: pip install bs4 pip ins ...

  10. LVS Nginx HAProxy区别

    LVS 抗负载能力强,性能高,能达到F5硬件的60%,对内存和cpu资源消耗比较低 工作在四层仅作分发之用,通过vrrp协议转发,具体流量由linux内核处理,没有流量的产生 稳定性.可靠性好,自身有 ...