国产分布式数据库灾备高可用实现

news2024/11/21 1:31:06

最近在进行核心业务系统的切换演练测试,就在想一个最佳的分布式数据库高可用部署方案是如何保证数据不丢、系统可用的,做到故障时候可切换、可回切,并且业务数据的一致性。本文简要介绍了OceanBase数据库和GoldenDB数据库在灾备高可用的部署方案,以参考。


在生产环境数据库相关的变更操作时,可能因为DML或DDL操作导致数据被篡改或者表结构不可逆,此时需要数据库提供一种高可用机制和能力恢复到变更前的时点,以保证业务的连续性。主要有两种思路,一种是闪回功能将数据恢复到变更操作的时点;另一种是延迟复制,备节点和主节点之间的数据复制设置一个延迟时间,主节点出现逻辑上的误操作时,利用备节点延迟同步来恢复数据。

1)闪回功能

国产数据库中很多已支持闪回功能,比如TiDB、GaussDB、OpenGauss、OceanBase等。以GaussDB为例在Ustore引擎中闪回功能,通过参数enable_recyclebin控制回收站的实时打开和关闭。并通过recyclebin_retention_time参数设置回收站对象保留时间,超过该时间的回收站对象将被自动清理。

2)延迟复制

在主备部署架构的数据库中,基本都能实现延迟复制功能,像MySQL、OpenGauss这样的单实例数据库。比如在OpenGauss数据库中的延迟复制,允许将回放延时一段指定的时间后进行回放,提供一份可查询一段时间之前的数据副本;在MySQL数据库中通过MASTER_DELAY来配置主节点和备节点的复制延迟。

在集中式主备架构的延迟复制实现基础之上,分布式数据库在架构上如何实现延迟复制以保证高可用。对于分布式架构的难点之一是如何确保故障场景下各个分片之间的数据一致性。对于国产分布式数据库OceanBase、GoldenDB以及TiDB等,已经有不少成熟的方案。本文将重点介绍OceanBase数据库的物理备库方案和GoldenDB数据库的DRSP灾备集群方案,不仅仅实现了延迟复制功能,而且满足灾备切换方案的多样性和灵活性,如异地灾备方案和孤岛验证方案。

1、OceanBase数据库物理备库方案

OceanBase数据库支持多副本的高可用容灾方案,同时也支持基于物理备库的准实时热备份方案。当生产主库出现故障时,备库可以接管服务,最大限度降低服务停机时间,减少可能带来的数据损失。从V4.1.0版本开始,OceanBase数据库按照租户粒度提供物理备库能力,分为主租户和备租户:主租户是业务运行的租户,提供完整的数据库服务能力;备租户只提供容灾和只读服务能力。

OceanBase的物理备库主要通过日志传输服务和日志存储服务来完成日志的传输及存储,并通过日志回放服务来保证主备租户数据的一致,其中:

  • 日志传输服务在主租户和备租户之间实时同步 Redo 日志。当前OceanBase数据库物理备库仅提供异步同步模式。
  • 日志存储服务为物理备库提供高可用、高可靠的日志存储和读写能力。
  • 备租户写入日志存储服务的日志会通过日志回放服务实时或延后地应用到内存的MemStore之中,以保证主租户和备租户的数据完全一致。
1.1 物理备库的部署方案

OceanBase物理备库的部署方案中,可以按照集群中主租户和备租户进行不同的组合,主租户和备租户可以在同一个集群中,也可以在不同的集群中。典型的部署方案有几种:

  1. 集群中仅有主租户或备租户:包括多个OceanBase集群,业务租户在一个集群,备租户在另外一个集群,中间采用异步复制的方式,满足异地容灾的高可用需求;
  2. 集群中既有主租户又有备租户:多中心多活的部署架构,不同地域之间的集群互为主备;
  3. 主租户和备租户在同一个集群中:主备租户在同一个集群中进行管理,适用于数据库变更或升级的场景,又不需要增加额外的管理集群资源。

在这里插入图片描述

第三种部署架构适合租户在升级或者数据库变更操作前,在备租户中保留一份数据库快照,将被租户的同步暂停。业务在主租户上进行升级变更等操作,如果变更异常,将备租户切换为主租户对外提供服务,以保证业务的连续性。

1.2 物理备库的日志传输

物理备库通过日志传输服务在主租户和备租户之间实时同步Redo日志,备租户既可以通过主租户的日志归档来获取日志,也可以通过网络直连主租户所在的集群来获取日志。

  • 基于日志归档的物理备库:主租户开启日志归档将日志归档到目标存储(OSS/NFS)中,备租户恢复归档日志实现数据同步;需要主租户和备租户开启归档模式。
  • 基于网络传输的物理备库:备租户直接通过网络连接主租户或其他备租户读取日志,类似于MySQL数据库的复制方式。

在这里插入图片描述

在基于网络传输的部署模式下,备租户从主租户读取的日志,既可以是主租户的在线日志,也可以是主租户的归档日志。同时这种模式下支持集群级别的限速。

1)暂停或开启日志同步

#登录备租户或所在集群的sys租户,执行命令暂停租户日志同步
ALTER SYSTEM RECOVER STANDBY [TENANT = tenant_name] CANCEL ;
#登录备租户或所在集群的sys租户,执行命令开启租户日志同步
ALTER SYSTEM RECOVER STANDBY [TENANT = tenant_name] UNTIL UNLIMITED;

需要注意的是,暂停日志同步后,备租户不会再从主租户同步任何日志,尽量避免因暂停日志同步而导致的备租户日志断流。

2)查看日志同步进度

#执行SQL查看备租户同步进度
SELECT TENANT_NAME, TENANT_ID, TENANT_ROLE, SCN_TO_TIMESTAMP(SYNC_SCN) 
FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'standby_tenant';
+----------------+-----------+-------------+----------------------------+
| TENANT_NAME    | TENANT_ID | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) |
+----------------+-----------+-------------+----------------------------+
| standby_tenant |      1004 | STANDBY     | 2023-04-14 16:38:53.938774 |
+----------------+-----------+-------------+----------------------------+
1 row in set

3)设置同步限速

适用于集群之间备租户同步限速

  • standby_fetch_log_bandwidth_limit:用于设置备租户所在集群中,可用于备租户从主租户或源端租户进行日志同步的所有带宽的总和。
  • _server_standby_fetch_log_bandwidth_limit:用于设置备租户所在集群的单个 OBServer 节点中,可用于备租户从主租户或源端租户进行日志同步的带宽。
1.3 日志存储服务

OceanBase数据库中日志存储服务使用Paxos协议实现高可用,其中主租户和备租户中的日志存储服务使用了不同的工作模式:

  • APPEND模式:主租户上使用APPEND模式。在该模式下,主租户日志流的Leader会接收事务、DDL等上层模块写入的数据,并将这些数据在主租户的多个副本之间使用 Paxos 协议进行同步并持久化。
  • RAW_WRITE模式:备租户上使用RAW_WRITE模式。在该模式下,备租户日志流的Leader拒绝任何上层模块直接写入的数据,仅允许通过日志传输服务从主租户同步物理日志,且这些物理日志的内容、LSN、SCN等信息均由主租户生成。

在数据同步过程中,每一条日志都会在主租户上生成一组唯一的LSN和SCN值。其中,LSN用于定位这条日志在存储服务中的物理位置信息;SCN用于代表这条日志在存储服务中的时序关系,上层服务可以使用SCN值对多个日志流之间的日志进行定序。

另外,无论是主租户还是备租户,在Paxos Group日志流副本中都会有LEADER和FOLLOWER两种角色。对于主租户,其业务数据是在日志流的Leader节点上写入,再同步给所有Follower节点;对于备租户,日志流的Leader节点主要负责通过日志传输服务从主租户同步日志,并将同步过来的日志再同步给Paxos Group中的Follower节点。

1.4 主租户和备租户切换

OceanBase数据库的主租户和备租户可以通过SwitchOver和Failover操作动态改变租户角色:

  • Switchover:在用户计划内对租户角色进行变更。执行 Switchover操作后,主租户会与对应的备租户会交换租户角色,整个过程数据不丢失RPO = 0,执行时间一般为秒级。
#将主租户切换为备租户
ALTER SYSTEM SWITCHOVER TO STANDBY TENANT = tenant_name;
#将备租户切换为主租户
ALTER SYSTEM SWITCHOVER TO PRIMARY TENANT = tenant_name;
  • Failover:在主租户出现无法恢复的故障时所做的切换行为。执行Failover操作后,对应的备租户角色会变换成主。同时,如果对主租户故障前一直正常同步的备租户执行Failover操作,则执行Failover操作后,一般会产生百毫秒级别的数据损失,执行时间一般为秒级。
#将备租户切换为主租户
ALTER SYSTEM ACTIVATE STANDBY TENANT = tenant_name;

Failover操作需要在操作执行完成后达到数据一致的状态,故系统会选择所有日志流的同步位点中SCN最小的值作为Failover的执行位点。执行Failover操作后,租户下的所有日志流都会统一回退到该位点。

2、GoldenDB数据库

在这里插入图片描述

GoldenDB分布式数据库除了支持同一套集群多中心的部署架构外,还支持DRSP的灾备部署方案。DRSP高可用架构包括生产库和灾备库/应急库,生产库是正常对外提供服务的GoldenDB集群;灾备库正常情况不提供服务,从生产库复制数据的GoldenDB系统,用于提供灾难、应急等场景下的紧急启动能力,代替生产库提供服务。如果所示,DRSP灾备集群运行有三种模式:

  1. 数据同步模式:元数据、GTM数据、数据节点分别从源端生产库同步到目标端灾备库,可通过配置延时时间让同步过来的数据延时应用到灾备库上。
  2. 数据恢复模式:应用、检查、修复同步过来的数据,使最终数据满足分布式一致性要求。
  3. 服务模式:启用灾备集群,对外提供服务,,提供GoldenDB系统绝大部分正常功能。

这种部署方案的优点是生产集群和灾备集群单独维护,故障互不影响。相比较异地故障切换或者灾备孤岛演练,在切换方案上更为迅速灵活。相对应的缺点就是需要单独维护两套系统,增加了运维的复杂度。

2.1 不同模式切换

1)数据同步模式

正常情况下,生产库处于服务模式,此时灾备库应当进入延时复制模式(sync模式)接入生产库。执行以下命令进入延时复制模式:

sh AllControl.sh -sync 1 -delay_time=

delay_time填写延时应用的时间,单位为秒;如果不需要延时则填0

2)数据恢复模式

当生产库发生故障或误操作时,需要切换至灾备库进行接管,此时灾备库应当先进入数据恢复模式(recovery模式)恢复数据,再切换至服务模式对外提供服务。

  • 命令退出延时复制模式
sh AllControl.sh -stopsync 1
  • 指定需要回放到的时刻或GTID
#指定回放时刻
sh bat_mod_relaytime.sh 1 "RELAY_TIME"
#回放所有relay log
sh bat_mod_relaytime.sh 1 ""
#指定回放的GTID

三种场景中记录下的回放时刻在回切时会作为生产库元数据同步的起始时刻

  • 进入灾备库数据恢复模式
sh AllControl.sh -recover 1

3)数据服务模式

数据恢复完成后,通过以下步骤切换至服务模式

sh AllControl.sh -service 1

当灾备库不再需要服务时,执行命令退出服务模式

2.2 灾备库回切

当灾备库服务一段时间以后,需要将服务回切至生产库,要求生产库数据和灾备库基本一致。此时可以将生产库和灾备库角色对调,将生产库接入当前已服务的灾备库中,从灾备库同步数据。停止灾备库业务,等待生产库同步数据完成后启动生产库,由生产库提供服务。

  • 登录生产库某一管理节点服务器,将生产库退出服务模式
sh AllControl.sh -stopservice 1
  • 生产库集群1停服
sh start_stop_service.sh -stop_dbproxy 1
  • 修改元数据同步起始时刻,回滚生产库集群至一致性时刻,并进行分片数据一致性校验
sh bat_mod_laststamp.sh "1" "2024-01-01 10:00:00"
其中1为集群ID,"2024-01-01 10:00:00"为元数据同步起始时刻,该时刻根据灾备库进行恢复时设置的恢复时间确定
  • purge生产库完成回滚且主备数据一致的分片
  • 生产库进入延时复制模式
sh AllControl.sh -sync 1 -delay_time=0
  • 逐步停掉灾备库上的业务,让proxy上所有事务都提交。禁用灾备库集群1,停止该集群绑定的所有proxy进程。
  • 生产库退出复制模式并进入服务模式
  • 灾备库退出服务模式并进入延迟复制模式
2.3 灾备演练场景回切

在灾备孤岛等演练场景下,灾备站点和生产站点孤岛隔离,演练结束后,需要将灾备站点的数据回滚到演练前的时刻。GoldenDB数据库的DRSP复制方案中提供了闪回功能,将数据闪回到灾备库恢复之后,提供服务之前的一个时刻。

  1. 快照持久化:针对灾备库,在灾备库执行服务模式起连接实例之前,将当前灾备库的快照点持久化到RDB库。为后续的闪回提供服务。
  2. 闪回:将灾备库服务模式下产生的业务恢复至快照点,方法是执行性反向sql,所以灾备库服务期间,如果有DDL,可能会失败。此时根据实际情况,看是否需要备份恢复。
  3. 备机回放检查:闪回功能是通过在主机上执行反向sql来完成回滚操作,所以备机可以以同步回放的方式进行数据同步。所以需要所有备机回放完全完成才可以下一步的purge。
  4. purge:闪回通过反向sql实现的,所有本身的灾备库gtid_set会一直增加,所以需要通过purge操作将gtid_set恢复至快照时刻。

以上是OceanBase数据库和GoldenDB数据库延迟复制和灾备的高可用实现方案简单总结,实际实现过程更为复杂,以官方的文档材料为准。


参考资料:

  1. https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000818706
  2. GoldenDB数据库DRSP双集群同步

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

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

相关文章

leetCode-hot100-动态规划专题

动态规划 动态规划定义动态规划的核心思想动态规划的基本特征动态规划的基本思路例题322.零钱兑换53.最大子数组和72.编辑距离139.单词拆分62.不同路径63.不同路径Ⅱ64.最小路径和70.爬楼梯121.买卖股票的最佳时机152.乘积最大子数组 动态规划定义 动态规划(Dynami…

嫦娥六号成功带回月球背面土壤,嫦娥七号整装待发,2030年前实现载人登月!

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 嫦娥六号圆满成功 嫦娥六号任务是中国探月工程的一次重大成功,探测器于5月3日在中国文昌航天发射场发射升空并进入地月转移轨道。经…

【SQL】已解决:SQL分组去重并合并相同数据

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:SQL分组去重并合并相同数据 在数据库操作中,数据的分组、去重以及合并是常见需求。然而,初学者在编写SQL语句时,可能会遇到一…

2024华为OD机试真题- 电脑病毒感染-(C++/Python)-C卷D卷-200分

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用 t 表示。 其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果…

整合、速通 版本控制器-->Git 的实际应用

目录 版本控制器 -- Git1、Git 和 SVN 的区别2、Git 的卸载和安装2-1:Git 卸载1、先查下原本的Git版本2、删除环境变量3、控制面板卸载 Git 2-2:Git 下载安装1、官网下载2、详细安装步骤3、安装成功展示 3、Git 基础知识3-1:基本的 Linux 命令…

逆向开发环境准备

JDK安装 AndroidStudio安装 默认sdk路径 C:\Users\Administrator\AppData\Local\Android\Sdk 将platform-tools所在的目录添加到path C:\Users\Administrator\AppData\Local\Android\Sdk\platform-tools 主要目的是使用该目录下的adb等命令 将tools所在的目录添加到path C:\Us…

LabVIEW风机跑合监控系统

开发了一种基于LabVIEW的风机跑合监控系统,提高风机测试的效率和安全性。系统通过自动控制风机的启停、实时监控电流和功率数据,并具有过流保护功能,有效减少了人工操作和安全隐患,提升了工业设备测试的自动化和智能化水平。 项目…

解决注册表删除Google报错问题

删除注册表中的Google时报错: 解决方式: 1、右键com.microsoft.browsercore,选择【权限】,在弹出的窗口中点击【高级】 2、可以看到现在的所有者是:TrustedInstaller,点击【更改】 3、点击选择用户和组中的…

东方航空逆向

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! …

问题解决|endnote文献手工导入

一、背景介绍 手工导入一篇文献是指手动编辑文献的相关信息Preference。为什么要手动这么麻烦?因为有的文献比较老只有纸质版本,有的文献信息不全,有的则是没有编码无法识别等等,需要手工录入;一般需要手工录入的情况比…

使用gradio搭建私有云ChatGLM3网页客户端

【图书推荐】《ChatGLM3大模型本地化部署、应用开发与微调》-CSDN博客 通过简单的代码领略一下ChatGLM3大模型_chatglm3 history怎么写-CSDN博客 对于一般使用网页端完成部署的用户来说,最少需要准备一个自定义的网页端界面。在网页端界面上,可以设置文…

5.SQL注入-通过union进行获取数据-字符型

通过union进行获取数据-字符型 在pikachu上查询kobe,出现了两个字段id和email 在后台和前端查询是一样的出现数据,也就是有两个字段:id和email 通过sql语句order by 以列的形式排序,没有第三列,所以order by 3 报…

快速将网页封装成APP:小猪APP分发助您一臂之力

你是否曾经有一个绝妙的网页,但苦于无法将其变成手机APP?其实,你并不孤单。越来越多的企业和开发者希望将自己的网站封装成APP,以便更好地接触到移动端用户。我们就来聊聊如何快速将网页封装成APP,并探讨小猪APP分发在…

可燃气体报警器检测机构:严格遵守的安全标准

随着工业、商业和家庭领域对安全要求的不断提高,可燃气体报警器作为预防火灾和爆炸事故的重要设备,其性能稳定性和可靠性越来越受到关注。 可燃气体报警器检测机构应运而生,为确保这些设备的有效运行发挥着不可替代的作用。 接下来&#xf…

Python中的数据结构

一.堆 堆的建立可以通过导入heapq库来实现 在Python中建立的是最小堆 即heap[k]<heap[2*k1]and heap[k]<heap[2*k2] 下面是一些 堆使用的方法 heapq.heappush([],加入的元素) heapq.heappop(heap)弹出最小的元素 heapq.nlargest(3,heap)返回最大的三个元素 hea…

Vue笔记-vue中使用JS创建的函数

主要是公司对前端要求不高&#xff0c;能解决问题就行了&#xff0c;前端不太熟&#xff0c;用js这种处理起来方便&#xff0c;在此记录下。 在src中创建一个api目录&#xff0c;新建custom.js export const getDivHeightByClass (className) > {let divElements docume…

Java面试题--JVM大厂篇之G1 GC的分区管理方式如何减少应用线程的影响

目录 引言: 正文: 1. 区域划分&#xff08;Region&#xff09; 2. 并行和并发回收 3. 区域优先回收&#xff08;Garbage First&#xff09; 4. 可预测的停顿时间 5. 分阶段回收 6. 复制和压缩 实际效果: 场景举例 1. 减少单次GC的影响 2. 支持高并发环境 3. 优…

设计模式-代理模式和装饰者模式

二者都是结构型的设计模式. 1.代理模式 1.1定义 为其他对象提供一种代理以控制对这个对象的访问. 代理从code实现方面分为静态代理和动态代理两种&#xff1b; 从适用范围来看,分为远程代理,虚拟代理,保护代理,智能引用几种. 远程代理:为某个对象在不同的内存地址空间提供…

张小凡砍灵竹

题目 张小凡刚入青云门时&#xff0c;拜入大竹峰田不易门下&#xff0c;师父要求他上山砍灵竹锻炼体力。第一天他砍了1根&#xff0c;之后的九天他分别砍了2&#xff0c;4&#xff0c;5&#xff0c;5&#xff0c;8&#xff0c;7&#xff0c;9&#xff0c;12&#xff0c;2根&am…

【Python】已解决:AttributeError: ‘Series‘ object has no attribute ‘sortlevel‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;AttributeError: ‘Series‘ object has no attribute ‘sortlevel‘ 一、分析问题背景 在数据分析和处理过程中&#xff0c;Pandas库是一个非常强大的工具。它…