数据库|同城双中心 DR Auto-Sync 主中心意外故障恢复

news2024/12/23 15:24:28

一、前言

最近,我一直在各个地方进行 TiDB 的 Poc 测试。在这些测试中,客户特别关注同城双中心或者两地三中心的架构体系,经常会找我了解 TiDB 灾备架构的实现方案和底层逻辑。基于客户对 RPO =0 的要求,我一般会向他们介绍 DR Auto-Sync 架构,也就是官网中的自适应同步模式,这是唯一能保证 RPO =0 的灾备架构。

根据 PoC 测试的经验,结合专栏的文章,我总结了开启 DR Auto-Sync 和主中心故障恢复的流程及注意事项。

二、什么是 DR Auto-Sync

TiDB 通常采用多 AZ 部署方案保证集群高可用和容灾能力。多 AZ 部署方案包括单区域多 AZ 部署模式、双区域多 AZ 部署模式等多种部署模式。单区域双 AZ 部署方案,即在同一区域部署两个 AZ,成本更低,同样能满足高可用和容灾要求。该部署方案采用自适应同步模式,即 Data Replication Auto Synchronous,简称 DR Auto-Sync。

单区域双 AZ 部署方案下,两个 AZ 通常位于同一个城市或两个相邻城市(例如北京和廊坊),相距 50 km 以内,AZ 间的网络连接延迟小于 1.5 ms,带宽大于 10 Gbps。

  • 该集群采用推荐的 6 副本模式,其中 AZ1 中放 3 个 Voter,AZ2 中放 2 个 Follower 副本和 1 个 Learner 副本。TiKV 按机房的实际情况打上合适的 Label。
  • 副本间通过 Raft 协议保证数据的一致性和高可用,对用户完全透明。

该部署方案定义了三种状态来控制和标示集群的同步状态,该状态约束了 TiKV 的同步方式。集群的复制模式可以自动在三种状态之间自适应切换。要了解切换过程,请参考状态转换。

  • sync:同步复制模式,此时从 AZ (DR) 至少有一个副本与主 AZ (PRIMARY) 进行同步,Raft 算法保证每条日志按 Label 同步复制到 DR。
  • async:异步复制模式,此时不保证 DR 与 PRIMARY 完全同步,Raft 算法使用经典的 majority 方式复制日志。
  • sync-recover:恢复同步,此时不保证 DR 与 PRIMARY 完全同步,Raft 逐步切换成 Label 复制,切换成功后汇报给 PD。

三、设置 DR Auto-Sync 架构

本次准备的集群如下:

存储拓扑如下:

本次会设置 3+2+1 的架构,也就是6 副本(3 个 Voter 副本在主中心,2 个 Follower 副本和 1 个 Learner 副本在备中心)

Step1:设置 Label

在 PD 中的设置:

这里的zone 也可以写成 az 或是其他,但是一定要和后续配置保持一致。

TiKV 中的设置:

这里的 labels 要与 PD 的设置保持一致。

Step2:设置 Placement Rules 规划

新建一个文件 Untitled-1.json,写入如下代码:

[
{
"group_id": "pd",
"group_index": 0,
"group_override": false,
"rules": [
{
"group_id": "pd",
"id": "voters",
"start_key": "",
"end_key": "",
"role": "voter",
"count": 3,
"label_constraints": [{"key": "zone", "op": "in", "values": ["west"]}],
"location_labels": ["zone","rack","host"]},
{
"group_id": "pd",
"id": "followers",
"start_key": "",
"end_key": "",
"role": "follower",
"count": 2,
"label_constraints": [{"key": "zone", "op": "in", "values": ["east"]}],
"location_labels": ["zone", "rack", "host"]},
{
"group_id": "pd",
"id": "learners",
"start_key": "",
"end_key": "",
"role": "learner",
"count": 1,
"label_constraints": [{"key": "zone", "op": "in", "values": ["east"]}],
"location_labels": ["zone", "rack", "host"]
}
]
}
]

注意项:

  • id不能重复,建议写 voters,followers,learners 用于区分各副本用途
  • role 写副本的角色
  • location_labels 需要与 PD 的 label 保持一致
  • label_constraints 可以填写不同的颗粒度,比如中心、机架、机器。但是key的值,必须在 PD 的 label 中存在,比如颗粒度是中心,key 就需要写成 zone,颗粒度是机器,key需要写成host
  • 备份原始 Placement Rules,便于回退:pd-ctl config placement-rules rule-bundle load --out="default.json"

Step3:启用自适应同步模式

使用 pd-ctl 设置:

tiup ctl:v7.1.0pd -u http://10.3.65.146:2379-i

# 设置 placement-rules 
config placement-rules rule-bundle save --in="rule.json"

config set replication-mode dr-auto-sync
config set replication-mode dr-auto-sync label-key zone
config set replication-mode dr-auto-sync primary west
config set replication-mode dr-auto-sync dr east
config set replication-mode dr-auto-sync primary-replicas 3
config set replication-mode dr-auto-sync dr-replicas 2

说明:

  • replication-mode 为待启用的复制模式,以上示例中设置为 dr-auto-sync。默认使用 majority 算法。
  • label-key 用于区分不同的中心,需要和 Placement Rules 相匹配。
  • primary 是主中心 zone 的值,即 west。
  • dr 是备中心 zone 的值,即 east。
  • primary-replicas 是主中心副本的数量。
  • dr-replicas 是备中心副本的数量。

Step4:查看DR Auto-Sync架构状态

1. 设置自适应同步模式后region状态

我们能够观察到,刚设置自适应同步模式后,PD 会检测到大量 miss peer 和 pending peer,也就时说,设置完成后,集群的三副本会直接变为六副本,多出来的三个部分没有及时补全,才会出现丢失副本和补充副本的现象。所以我们需要等待一些时间,或者调整store limit 参数,加速补充副本,直到 learner peer 稳定。这个时候,DR Auto-Sync 架构状态才是正常的。

让我们看看稳定后的leader和region分布吧:

由于只设置了三个 voter,所以 leader 都集中在三个 voter 所在 TiKV 节点上,region 在所有节点上分布均衡。如果主中心停止两个 voter,还需要让集群正常提供服务,可以把两个 follower 副本改为 voter,一共五个 voter 就可以满足这类需求。

如果设置您设置好的 DR Auto-Sync 架构不满足以上 region 的状态及分布,可能是设置出现问题,需要重新检查。

2. 检查设置

config showall
config placement-rulesshow

3. 查看同步状态

curl http://10.3.65.146:2379/pd/api/v1/replication_mode/status

{
"mode": "dr-auto-sync",
"dr-auto-sync": {
"label_key": "zone",
"state": "sync",
"state_id": 64861,
"acid_consistent": true
}
}

四、主中心故障,集群恢复

在 DR Auto-Sync 架构中的集群,如果主中心突然故障无法启动,该怎么办呢?以下是官方文档,因为操作有丢失数据的风险,没有给出详细的解决方案。

以下是根据 PoC 测试的经验,结合专栏的文章整理的集群恢复步骤:

(一)主中心故障前的准备工作

Step1:查看主dc的store信息

selectSTORE_ID,STORE_STATE,ADDRESS fromINFORMATION_SCHEMA.TIKV_STORE_STATUS;

记录好主中心的 store_id 恢复数据时需要用到。

Step2:转移集群信息文件并删除主中心相关节点

scp -r .tiup/storage/cluster/clusters/tidb-bbg 10.3.65.146:/home/tidb/.tiup/storage/cluster/clusters/

vi .tiup/storage/cluster/clusters/tidb-bbg/meta.yaml

拷贝集群信息主要是保证在主中心访问不了的情况下,备中心还能够使用 tiup 对集群进行管理。如果 tiup 不在主中心可以忽略此步骤。删除主中心相关节点是因为备中心会以新集群启动,然后做有损恢复,主中心的 tikv 会作为不可能上线的情况处理。

ps:在 PoC 测试中,我发现不删除主中心相关节点也能正常恢复集群,但是对生产环境来说肯定还是有风险的。

(二)主中心故障后的处理

Step1:启动PD节点

如果备中心集群状态的 PD 是启动状态,可跳过对 PD 的操作。如果备中心集群状态的 PD 是 down,则需要登录到该 PD 节点机器上,增加启动参数:

scp -r .tiup/storage/cluster/clusters/tidb-bbg 10.3.65.146:/home/tidb/.tiup/storage/cluster/clusters/
vi .tiup/storage/cluster/clusters/tidb-bbg/meta.yaml

使用 tiup restart 重启 pd 节点:

tiupclusterrestarttidb-bbg-N10.3.65.136:2379

查看集群状态,如果 PD 启动后,则需要执行:

tiup pd-recover--from-old-member --endpoints=http://10.3.65.136:2379

模拟主中心故障:

启动 PD 节点:

Step2:切换 Placement Rules 规划

用初始值来代替 DR Auto-Sync 的 Placement Rules 规划:

config placement-rules rule-bundle save --in="default.json"

Step3:取消DR Auto-sync

设置成以前的三副本:

config setreplication-modemajority

Step4:有损恢复

去掉主中心的store,这里的 id 是之前用 sql 查出来的 store_id:

unsaferemove-failed-stores 1,4,5

Step5:查看 store 状态

unsaferemove-failed-stores show

看到如下字样,即表示恢复完成,集群可正常提供服务。

集群状态如下,备中心的节点均正常。(由于 PD 分布不太对,我把137上的 PD 当成主中心做的实践)

region分布:

到此,集群恢复已经完成。

五、总结

  1. 在开启 DR Auto-Sync 架构之前,务必要仔细核对各项配置的准确性。由于我之前不熟悉,配置写错了,而且没有报错信息,导致 DR Auto-Sync 架构的 region 状态一直与预期不符。
  2. DR Auto-Sync 架构对网络延迟和带宽有一定要求,必须满足才能避免出现问题。例如,插入的数据会一直等待 learner 写入完成才算插入完成,而网络延迟越高,写入速度就越慢。
  3. 在生产环境中,必须做好数据备份和备中心的准备工作,以确保数据的安全性。数据量越大,备中心的恢复耗时就会越长,需要合理安排时间来完成这些工作。

作者:蔡一凡|后端开发工程师

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

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

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

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

相关文章

Flume原理剖析

一、介绍 Flume是一个高可用、高可靠,分布式的海量日志采集、聚合和传输的系统。Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制&…

软件安全测试包含哪些内容和方法?安全测试报告的必要性

软件安全测试是一种通过模拟真实攻击的方式,对软件系统进行全面的安全性评估和测试,以发现潜在的安全漏洞和弱点,是确保软件系统安全性的重要措施。在进行软件安全测试时,我们需要了解测试的内容和方法,以及为什么进行…

《高性能MySQL》——查询性能优化(笔记)

文章目录 六、查询性能优化6.1 查询为什么会慢6.2 慢查询基础:优化数据访问6.2.1 是否向数据库请求了不需要的数据查询不需要的记录多表关联时返回全部列总是取出全部列重复查询相同的数据 6.2.2 MySQL 是否在扫描额外的记录响应时间扫描的行数与返回的行数扫描的行…

项目经理和PMO如何穿越低谷,激活自己与团队——WOOP给你答案

2023年,已经还剩下不到5个月了。因为今年整体大环境不好,很多人会因为遇到各种问题,让自己掉入低谷,也有可能让自己带的团队毫无生气。我期待这篇文章能够给你带来向上的力量,在困境中看到希望与可能性。 相信有很多人…

如何在轻量级RTSP服务支持H.264扩展SEI发送接收自定义数据?

为什么开发轻量级RTSP服务? 开发轻量级RTSP服务的目的是为了解决在某些场景下用户或开发者需要单独部署RTSP或RTMP服务的问题。这种服务的优势主要有以下几点: 便利性:通过轻量级RTSP服务,用户无需配置单独的服务器,…

无涯教程-Perl - formline函数

描述 格式功能和相关的运算符使用此功能。它根据PICTURE的内容将LIST格式化为输出累加器变量$^ A。写入完成后,该值将写出到文件句柄中。 语法 以下是此函数的简单语法- formline PICTURE, LIST返回值 该函数总是返回1。 Perl 中的 formline函数 - 无涯教程网无涯教程网提…

中小企业在数字化转型上所面对的问题都有哪些?_光点科技

随着科技的飞速发展,数字化转型已经成为企业持续发展的必由之路。尤其是中小企业,数字化转型不仅可以提高效率,降低成本,还可以拓展市场,增强竞争力。然而,数字化转型并非一帆风顺,中小企业在这…

arcgis更改图层字段名脚本

话不多说,上脚本源码,复制黏贴即可 #-*- coding:utf-8 -*- __author__ lumen import arcpy #输入图层 InputFeature arcpy.GetParameterAsText(0) #原始字段 oldField arcpy.GetParameterAsText(1) # 获取原始字段类型 oldFieldType desc arcpy.…

电机基础知识::(1、电磁力;2力与运动)

永磁同步电机基础知识(一)_哔哩哔哩_bilibili

led台灯哪些牌子性价比高?推荐几款性价比高的护眼台灯

作为学龄期儿童的家长,最担心的就是孩子长时间学习影响视力健康。无论是上网课、写作业、玩桌游还是陪伴孩子读绘本,都需要一个足够明亮的照明环境,因此选购一款为孩子视力发展保驾护航的台灯非常重要。为大家推荐几款性价比高的护眼台灯。 …

influxDB

文章目录 版本2.0 数据结构Organization 组织Bucket 存储桶Measurementtagfieldtimestamp retention policy (RP) 保留策略Point 一条数据Series 一组数据 写入gzip压缩 查询FluxInfluxQL 官网 https://docs.influxdata.com/v1.8 中文翻译文档 https://influxdb-v1-docs-cn.cno…

iPhone手机怎么恢复出厂设置(详解)

如果您的iPhone遇到了手机卡顿、软件崩溃、内存不足或者忘记手机解锁密码等问题,恢复出厂设置似乎是万能的解决方法。 什么是恢复出厂设置?简单来说,就是让手机重新变成一张白纸,将手机所有数据都进行格式化,只保留原…

TIA博途选型工具Selection Tool的基本使用方法介绍

TIA博途选型工具Selection Tool的基本使用方法介绍 如下图所示,下载选型工具后,解压缩,可以看到SelectionTool.exe执行程序, 感兴趣的可从以下链接获取该软件: TIA博途选型工具TIA Selection Tool-2023最新 无需安装,直接双击打开该软件, 如下图所示,进入软件后(默认…

用栈判断是否匹配

1 问题 写代码的时候用到的括号都是成双成对的出现,并且大小也相同。在集成编辑环境中,IDE就会为我们自己动检查括号是否匹配。那么为了避免在报错,如何判断是否有无括号不匹配? 2 方法 利用栈来实现这种功能。当遇见一个左括号&a…

为什么Mendix的OQL比SQL更方便,以及如何实现类似MySQL的workbench?

前言 在当今信息时代,数据的价值变得越来越重要。数据处理是任何软件系统都非常关注的核心功能。无论是电子商务网站、移动应用程序还是企业管理系统,这些系统都需要处理和管理大量的数据。例如,当用户在电子商务网站上搜索特定商品时&#…

【技术】Web实时消息推送方式整理

【技术】Web实时消息推送方式整理 SSE 单向 服务器 --> 客户端 text/event-stream类型的数据流信息 实现 客户端 <script>let source null;let userId 7777if (window.EventSource) {// 建立连接source new EventSource(http://localhost:7777/sse/sub/userId);…

DC电源模块关于多路输出的问题

BOSHIDA DC电源模块关于多路输出的问题 DC电源模块通常具备多路输出功能&#xff0c;这使得它在实际应用中具有极高的灵活性和可扩展性。当需要为多个不同的负载提供电源时&#xff0c;多路输出的设计可以降低整个系统的成本和复杂度&#xff0c;同时也可以减少系统空间的占用。…

docker菜谱大全

记录docker常用软件安装&#xff0c;欢迎大家投稿。&#x1f60e;&#x1f60e;&#x1f60e; 相关文档&#xff1a; DockerHub&#xff1a;https://hub.docker.com/Linux手册&#xff1a;https://linuxcool.com/Docker文档&#xff1a;https://docs.docker.com/Docker中文网&a…

Java加密算法的应用与实现(MD5、SHA、DES、3DES、AES、RSA、ECC)

文章目录 一、散列加密算法1、概述2、常见算法&#xff08;MD5、SHA&#xff09;3、应用4、Java实现 二、对称加密算法1、概述2、常见算法&#xff08;DES、3DES、AES&#xff09;3、应用4、Java实现AES 三、非对称加密算法1、概述2、常见算法&#xff08;RSA、ElGamal、Rabin、…

C++数学知识模板

试除法判定质数 模板 bool check_primes(int x) {for(int i 2; i * i < x; i) {if(x % i 0) return false;}return true; } 模板题 866. 试除法判定质数 给定 n个正整数 ai&#xff0c;判定每个数是否是质数。 输入格式 第一行包含整数 n。 接下来 n行&#xff0c…