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

最近在进行核心业务系统的切换演练测试,就在想一个最佳的分布式数据库高可用部署方案是如何保证数据不丢、系统可用的,做到故障时候可切换、可回切,并且业务数据的一致性。本文简要介绍了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.mzph.cn/diannao/39619.shtml

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

相关文章

kafka的架构

一、架构图 Broker:一台 kafka 服务器就是一个 broker。一个kakfa集群由多个 broker 组成。一个 broker 可以容纳多个 topic。 Producer:消息生产者,就是向 kafka broker 发消息的客户端 Consumer:消息消费者,向 kafk…

深海电波,智能驾驭:海上发电系统中的先进网关技术

随着技术的不断演进,海上风电场逐渐走向深海,随之而来的高速通信保障成为一大难题。同时,海上风电特殊的环境与部署技术,也给运维带来了作业难、成本高、响应慢等困难。通过在沿海岸边建立高站,结合超远覆盖、载波聚合…

springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver 应该如何解决

遇到的问题:项目中引用了外部的达梦jar包 在idea中正常使用 也能找到dm.jdbc.driver.DmDriver 驱动 但是当通过jenkins 构建部署到服务器上 总是报 ClassNotFoundException: dm.jdbc.driver.DmDriver 找不到驱动 应用到的驱动代码如下格式 排查步骤 1.首先看你的项…

ROS2仿真工具-gazebo

gazebo独立于ROS2,就像插件一样,需要安装。 1.安装 sudo apt install gazebo sudo apt install ros-humble-gazebo-* 2.运行测试demo gazebo /opt/ros/humble/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world 查看所有话题 ros2 top…

使用css做一个旋转的八卦图

使用css做一个旋转的八卦图 1, html部分 <div class"tai"><div class"bai"></div><div class"hei"></div> </div>2, css部分 .tai{width: 200px;height: 200px;border: 1px solid #000;background: linea…

STM32-I2C硬件外设

本博文建议与我上一篇I2C 通信协议​​​​​​共同理解 合成一套关于I2C软硬件体系 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担 特点&#xff1a; 多主机功能&#x…

Shiro框架

入门概述 1 shiro是什么? Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程…

计算机网络网络层复习题1

一. 单选题&#xff08;共27题&#xff09; 1. (单选题)以太网 MAC 地址、IPv4 地址、IPv6 地址的地址空间大小分别是&#xff08; &#xff09;。 A. 2^48&#xff0c;2^32&#xff0c;2^128B. 2^32&#xff0c;2^32&#xff0c;2^96C. 2^16&#xff0c;2^56&#xff0c;2^6…

浅谈k8s中cni0和docker0的关系和区别

最近在复习k8s网络方面的知识&#xff0c;查看之前学习时整理的笔记和文档还有过往自己总结的博客之后发现一个问题&#xff0c;就是在有关flannel和calico这两个k8s网络插件的文章和博客中&#xff0c;会涉及到cni0和docker0这两个网桥设备&#xff0c;但是都没有明确说明他们…

C# WPF自制批注工具(方便标记重点和演示)

在教学和演示中&#xff0c;我们通常需要对重点进行批注&#xff0c;下载安装第三方工具批注显得很麻烦。本篇使用WPF开发了一个批注工具&#xff0c;工具小巧&#xff0c;功能丰富&#xff0c;非常使用日常免费使用&#xff0c;或者进行再次开发。 自制批注工具具有以下功能特…

Flask 数据创建时出错

当我们在使用 Flask 创建数据时遇到错误&#xff0c;可能有多种原因&#xff0c;包括代码错误、数据库配置问题或依赖项错误。具体情况我会总结成一篇文章记录下&#xff0c;主要是归类总结一些常见的解决方法和调试步骤&#xff0c;帮助大家解决问题&#xff1a; 1、问题背景 …

OFDM技术概述8——FBMC

Filter bank multicarrier(FBMC&#xff0c;滤波器组多载波)&#xff0c;是一种类似于OFDM的调制方式&#xff0c;用滤波器抑制子载波的旁瓣大小&#xff0c;使用FFT/IFFT或多相滤波器实现&#xff0c;其应用于5G的主要优势&#xff1a; 子载波信号带限&#xff0c;带外泄漏小…

LiveNVR监控流媒体Onvif/RTSP用户手册-视频广场:状态记录、播放、回放入口、筛选在线离线、搜索

LiveNVR监控流媒体Onvif/RTSP用户手册-视频广场:状态记录、播放、回放入口、筛选在线离线、搜索 1、视频广场1.1、搜索筛选1.2、状态记录1.3、播放1.4、视频信息1.5、回放入口 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、视频广场 1.1、搜索筛选 可以下拉筛选 在线、离线 &a…

C++部分复习笔记上

C语法复习 1. C入门基础 缺省参数 半缺省参数必须从右往左依次来给出&#xff0c;不能间隔着给缺省参数不能在函数声明和定义中同时出现缺省值必须是常量或者全局变量C语言不支持&#xff08;编译器不支持&#xff09; 函数重载 函数重载是函数的一种特殊情况&#xff0c;…

William Yang:从区块链先锋到艺术平台创始人

在区块链技术和加密货币市场飞速发展的今天&#xff0c;William Yang无疑是这一领域的佼佼者。他不仅在学术和媒体领域取得了显著成就&#xff0c;更在创业之路上不断探索&#xff0c;成为了业内知名的KOL&#xff08;关键意见领袖&#xff09;。今天&#xff0c;我们有幸采访到…

AI姓氏头像生成微信小程序系统源码

&#x1f525;【科技新潮流】AI姓氏头像生成系统&#xff0c;你的专属个性新名片&#xff01;&#x1f389; &#x1f31f; 开篇惊艳&#xff1a;一键解锁你的姓氏魅力 ✨ Hey小伙伴们&#xff0c;今天我要安利一个超酷炫的科技小玩意——AI姓氏头像生成系统&#xff01;是不…

爬虫笔记20——票星球抢票脚本的实现

以下内容仅供交流学习使用&#xff01;&#xff01;&#xff01; 思路分析 前面的爬虫笔记一步一步走过来我们的技术水平也有了较大的提升了&#xff0c;现在我们来进行一下票星球抢票实战项目&#xff0c;实现票星球的自动抢票。 我们打开票星球的移动端页面&#xff0c;分…

视频字幕提取在线工具有哪些?总结5个字幕提取工具

平时在沉浸式追剧的时候&#xff0c;我们常常都会被影视剧中的各种金句爆梗而逗得开怀大笑~而真正要用到时候却总是一片头脑空白。其实要记住它们最好的办法便是将其提取留档下来&#xff0c;每次有需要的时候打开就能一下子回顾到~ 今天就来带大家盘一盘视频字幕提取的软件好…

高考假期预习指南

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Rust: polars行遍历,从dataframe到struct及Bar设计比较

pandas提供了iterrows()、itertuples()、apply等行遍历的方式&#xff0c;还是比较方便的。 polars的列操作功能非常强大&#xff0c;这个在其官网上有详细的介绍。由于polars底层的arrow是列存储模式&#xff0c;行操作效率低下&#xff0c;官方也不推荐以行方式进行数据操作。…