数据库|TiDB多副本损坏,别着急!有损恢复帮你化险为夷!

news2024/11/27 20:23:37

高文锋 |后端开发工程师

目录

一、前言

二、TiDB数据库的存储架构

三、集群信息

(一)Store情况

(二)测试表db 1.sbtest 1的region分布情况

(三)模拟tikv出现故障

(四)有损不安全恢复

四、总结


一、前言

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 内部,数据是以列式的形式进行存储,主要的功能是为分析型的场景加速。

三、集群信息

(一)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

(二)测试表db 1.sbtest 1的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

(三)模拟tikv出现故障

当模拟192.168.2.81:20160和192.1-68.2.83:20160出现故障时,即store id为1和4时,Region 5037,Region 5015,Region 6001将同时失去两个副本,包括leader和follower副本。 

考虑到当前环境是虚拟机多实例环境,我们需要通过关闭系统服务的自动拉起功能来模拟tikv故障环境。 

具体操作如下:

  1. 打开文件/etc/systemd/system/tikv-20160.service

  2. 将Restart的值修改为no,原来默认是always,即总是拉起服务的意思,改为no后,服务挂掉后不会自动拉起。

  3. 使修改生效,执行命令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]}

(四)有损不安全恢复

现在由于三副本已损坏大于等于一半副本数的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 都会被暂停,待恢复成功或失败后自动恢复

 

版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。

公众号搜索神州数码云基地,后台回复数据库,加入数据库技术交流群。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue【过滤器】

目录 1:过滤器的基本语法 1.1:示例代码 1.2:注意事项 2:使用Vue.filter定义全局过滤器 2.1:私有过滤器 2.2:全局过滤器 3:使用全局过滤器格式化时间 3.1:处理如图的时间 3.…

接口测试异常场景耗时耗力?一文帮你解决

背景 随着前后端分离、微服务等技术的广泛应用,接口测试在整个测试过程中扮演的角色越来越重要,如何更加高效地把接口测好、测得更加充分就成了一个亟待解决的难题。 当前在对具体的某一接口进行测试时,普遍采取的方法是测试人员按照接口文…

Vue3使用Markdown编辑器并显示

安装markdown-it npm i kangc/v-md-editornext -S 在main.js中全局注册 import { createApp } from vueimport VueMarkdownEditor from kangc/v-md-editor; import kangc/v-md-editor/lib/style/base-editor.css; import vuepressTheme from kangc/v-md-editor/lib/theme/vu…

null 类对象

这篇文章有助于理解类与对象。类是一种类型&#xff0c;而对象则是一种类型的具体的东西了&#xff0c;即对象是要分配内存的。下面看一下很简单的例子 #include <stdio.h> #include <stdlib.h> #include <memory>class CTest { public:CTest(): mValue(100…

Axure教程—表格新增(中继器)

本文介绍的是用Axure中的中继器制作表格新增功能效果 效果 预览地址&#xff1a;https://ure09q.axshare.com 功能 用户点击“新增”出现表单&#xff0c;填写数据后保存数据。 制作 一、所需元件 矩形元件、中继器 二、制作过程 1、表格 拖入一个表格元件&#xff0c;表格…

go-zero的路由机制解析

构建web服务 参考官方教程go-zero安装 //安装goctl插件 go install github.com/zeromicro/go-zero/tools/goctllatest//加载go-zero依赖 go get -u github.com/zeromicro/go-zerolatestzero构建一个http服务器&#xff0c;基于goctl命令创建&#xff1a; goctl api new demo…

Redis 7 常用数据结构

10大数据结构图示 10大数据类型&#xff1a; redis字符串(String)redis列表(ist)redis哈希表(Hash)redis集合(Set)redis有序集合(ZSet)redis地理空间(GEO)redis基数统计(HyperLogLog)redis位图(bitmap)redis位域(bitfield)redis流(Stream) Redis键(key) 命令不区分大小写&am…

Burp代理单个站点

这里写自定义目录标题 Burp代理问题解决代理单个站点&#xff08;核心&#xff09; Burp代理问题 平时进行渗透的时候为浏览器挂上代理后往往全部站点都进行代理&#xff0c;有很多没用的包被抓到&#xff0c;影响测试&#xff0c;且和在burp上设置单个站点抓包比较麻烦。 解…

奥威BI云星空标准方案:部署快、一站式的SaaS BI解决方案

奥威BI云星空标准方案是一种基于奥威BI数据云&#xff08;SaaS平台&#xff09;的商业智能解决方案&#xff0c;提供一站式的销售管理、客户关系管理、人力资源管理、财务管理等业务流程。该方案提供了从数据连接、数据建模到数据分析与价值挖掘的全链路数据应用服务&#xff0…

[AJAX]使用fetch发送请求

fetch是浏览器原生的函数&#xff0c;不需要像原生AJAX新建实例就可以用于发送AJAX请求。 支持Promise获取异步的HTTP响应&#xff0c;和支持流式获取。 服务端代码 // 服务端准备 // 1、引入express const express require(express); // 2、创建应用对象 const app expre…

springcloud+docker+k8s发布脚本

项目结构如图&#xff1a; Dockerfile 文件 构建镜像&#xff1a; #基础镜像&#xff0c;如果本地仓库没有&#xff0c;会从远程仓库拉取 openjdk:8 FROM openjdk:8 #暴露端口 EXPOSE 9301 #容器中创建目录 RUN mkdir -p /usr/local/java #编译后的jar包copy到容器中创建到目录…

PyTorch的安装(ANACONDA+PyCharm)

文章目录 一、概念1.什么是PyTorch2.什么是ANACONDA3.什么是PyCharm 二、PyTorch的安装1.安装ANACONDA和PyCharm&#xff08;一路Next即可&#xff09;2.将ANACONDA与pycharm进行配置3.安装pytorch环境 一、概念 1.什么是PyTorch PyTorch是一个开源的机器学习框架&#xff0c…

软件测试需求分析方法

目录 前言&#xff1a; 1.1 什么是测试需求&#xff1f; 1.2 为什么要做测试需求&#xff1f; 2.测试需求分析方法 2.1 测试需求分析依据 2.2 测试需求架构划分 2.3 测试需求分析过程 2.3.1 测试需求收集 2.3.1.1 测试类型划分 2.3.1.2 测试类型细化 2.3.1.3 生成测…

华为OD机试真题 Python 实现【查找重复代码】【2023Q1 100分】

目录 一、题目描述二、输入描述三、输出描述四、Python算法源码五、效果展示1、输入2、输出 一、题目描述 小明负责维护项目中的代码&#xff0c;需要查找出重复代码&#xff0c;用以支撑后续的代码优化&#xff0c;请你帮助小明找出重复的代码。 重复代码查找方法&#xff1…

高频前端面试题汇总之JavaScript篇

近期整理了一下高频的前端面试题&#xff0c;分享给大家一起来学习。如有问题&#xff0c;欢迎指正&#xff01; 前端面试题系列文章&#xff1a; 【1】「2021」高频前端面试题汇总之HTML篇 【2】「2021」高频前端面试题汇总之CSS篇 【3】「2021」高频前端面试题汇总之Java…

超详细,Pytest自动化测试框架 token全局设置-多套环境使用(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在做自动化测试时…

LAMP环境搭建

文章目录 LAMP环境搭建LAMP概述LAMP搭建安装Apache服务器安装mariadb(mysql)安装PHP PHP连接MySQLLAMP搭建论坛 LAMP环境搭建 LAMP概述 LAMP是一个常用的Web应用程序开发和部署平台&#xff0c;它是由以下四个开源软件的首字母组成&#xff1a; Linux&#xff08;操作系统&a…

【开发问题】sqlserver怎么开启cdc

怎么开启 执行sql1、创建cdc​2.如上执行完毕之后&#xff0c;会在<database_name>数据库下的“系统表”中创建如下六个系统表&#xff1a;3.验证SQLServer库级别CDC是否启用4.启用SQLServer表级别CDC功能&#xff08;针对某一张表&#xff09;5、验证SQLServer表级别是否…

计算机毕业论文内容参考|基于微信小程序和云开发的小区垃圾分类知识手册平台的设计与实现

文章目录 导文摘要前言绪论1课题背景2国内外现状与趋势相关技术与方法介绍系统分析总结与展望1本文总结2后续工作展望导文 计算机毕业论文内容参考|基于微信小程序和云开发的小区垃圾分类知识手册平台的设计与实现 摘要 本文介绍了基于微信小程序和云开发的小区垃圾分类知识手…

智慧餐厅系统(外卖、堂食)

智慧餐厅是基于物联网和云计算技术为餐饮店量身打造的智能管理系统&#xff0c;通过客人自主点餐系统、服务呼叫系统、后厨互动系统、前台收银系统、预定排号系统以及信息管理系统等可显著节约用工数量、降低经营成本、提升管理绩效。 系统功能介绍 客户端 1、自助点餐系统&…