数据库主备副本物理复制和逻辑复制对比

数据库主从节点的数据一致性是保证数据库高可用的基本要求,各个数据库在实现方式上也各有异同。而主备复制的方式无外乎两种:物理复制和逻辑复制,本文简要对比下两种方式的不同,并分析下国产数据库是如何实现的。


1、数据库复制基本概念

数据库主从复制是保证金融级数据库高可用的重要手段,通过在多个数据库节点上保留相同数据的副本,从而确保即使某个节点发生故障,其他节点仍然能提供数据服务,从而提高系统的整体可用性。主备复制的分类有很多种:按照同步方式的复制分为同步、半同步和异步的方式;按照复制方向分为单向复制和双向复制,像数据库迁移这种有时候需要做反向同步;按照复制的实现技术分为存储级别复制和数据库级别复制。本文主要介绍不同数据库主备节点之间的物理复制和逻辑复制实现。

1.1 物理复制

物理复制也称为二进制或流式复制,数据库主库(或源数据库)将数据库的物理文件(如数据文件、日志文件等)或其变化(如二进制日志中的变化)以byte2byte的方式发送给从库(或目标数据库),从库则应用这些文件或变化来保持与主库数据的一致性。物理复制具有以下好处:

  • 数据高度一致性:主从节点的数据在物理层面保持一致性,满足金融级的可靠性要求,不用担心数据在逻辑层面的不一致;
  • 低时延:事务在执行过程中产生的Redo记录会实时的apply到备库,事务结束后就能看到数据,具备较低的复制时延;
  • 复制效率高:物理层面复制数据,能达到较高的复制效率。

以PostgreSQL数据库为例,当用户执行DML或DDL操作后,产生的WAL日志会通过wal sender进程实时发送到备库,备库的wal receiver进程接收后写入本地wal日志,之后startup进程会读取wal日志并应用到备库。

在这里插入图片描述

在PostgreSQL9.0之前不支持流式复制,而是等主库写完一个WAL日志文件后,才把WAL日志文件传送到备库,这样的方式导会致主备延迟特别大。9.0版本之后引入了流式复制机制,通过流复制,备库几乎实时的从主库同步相应的WAL记录。
不过基于物理数据块的物理复制也有缺点,有一些使用上的限制和无法覆盖的场景:

  • 数据页损坏:物理复制直接复制数据文件,如果复制过程中发生文件读写错误或磁盘损坏等问题,可能会导致数据损坏。
  • 只支持实例级别的复制,无法进行表级别或逻辑对象的过滤,比如某类DDL操作不想复制到备库
  • 主从库间版本兼容性:主从库在不同版本和不同操作系统之间进行复制可能存在兼容性问题,在版本升级或操作系统升级时候尤其需要关注
1.2 逻辑复制

逻辑复制是基于SQL层的数据复制技术,通过解析和复制数据库中的逻辑变化(如INSERT、UPDATE、DELETE等SQL语句)来实现数据同步。逻辑复制有以下特性:

  • 灵活度高:可以选择性的复制特定的表或数据操作,不需要整个数据库实例;
  • 异构数据库同步:由于逻辑复制是基于SQL层的操作,因此可以实现不同数据库实例之间的数据同步,甚至可以在不同数据库系统之间同步数据。
  • 可能存在延迟:由于需要解析和转换SQL语句,受限于备机性能或大事务语句可能存在一定的复制延迟

以MySQL数据库为例,当主库上有提交或数据更改时(如INSERT、UPDATE、DELETE),这些变更操作会被记录到二进制日志binlog中。从库上有一个I/O线程,它负责连接主库并从主库的二进制日志中读取数据。这些数据在从库上会被写入中继日志(Relay Log),中继日志是从库上的二进制日志的副本。从库上的SQL线程会读取中继日志中的事件,并将这些事件逐条应用到从库数据库上,从而使从库的数据与主库保持一致。

在这里插入图片描述

逻辑复制由于网络IO问题、大事务或者备机性能差及高并发等场景可能会导致relay log无法及时的写入备机,从而出现主从节点之间复制延迟过大。通常在主库高并发的场景下可以保证binlog日志已经传到备机,也就是RPO=0。

1.3 物理复制和逻辑复制特性对比

数据库主从节点间的复制方式是由各数据库自身的能力决定的,比如PostgreSQL数据库原生的支持物理复制,而不会选用更为复杂的逻辑复制实现;MySQL原生的使用逻辑复制实现。像PostgreSQL如果要实现跨数据库之间的数据同步,就需要将WAL日志解析为逻辑上的事务流,再同步到目标数据库中。物理复制和逻辑复制之间的特性对比如下:

  • 数据一致性:物理复制是基于物理层面数据块的复制,可以确保数据的高一致性;逻辑复制则是基于SQL语句的复制,可能出现数据不一致,比如主键冲突、数据丢失等,当出现主备机数据不一致时需要通过修复备机的方式应急。
  • 数据复制效率:物理复制直接复制数据文件来同步数据,相比逻辑复制执行大量SQL语句的方式,其速度更快。
  • 数据文件完整性:物理复制在数据文件传输过程中可能可能会出现数据损坏的情况,备机无法读取文件的时候也需要修复备机或者重传文件修复。
  • 兼容性问题:当主备库版本不同或者操作系统版本不同,可能存在兼容性问题,逻辑复制是基于SQL重做的,不会存在兼容性问题。
  • 数据复制灵活性:逻辑复制允许自定义复制过程中使用的SQL语句,因此可以实现更灵活的数据复制策略,比如不需要复制哪一类表或语句。
  • 数据复制延迟:逻辑复制主备节点间的复制延迟影响因素较多,比如住备库之间的网络IO、备库的性能、主库高并发事务写入等,可能会存在一定的复制延迟;物理复制主要受限于主备节点之间的网络和备节点的性能情况。

在这里插入图片描述

除了以上还有其他一些限制,比如PostgreSQL逻辑复制中不能同步DDL、Sequence和大对象不能复制,物理复制中备机只读、备机逻辑复制中和备份会出现冲突等情况。

2、国产数据库复制类型对比
2.1 MySQL系的数据库

国产数据库中MySQL系数据库指的是数据库存储引擎是兼容MySQL的,比如GoldenDB、TDSQL for MySQL,这一类数据库的主从节点复制方式是逻辑复制的,基于binlog日志的同步和解析实现备机的数据同步。

2.2 PostgreSQL系的数据库

国产数据库中PostgreSQL系的数据库如openGauss、GaussDB(for opengauss)等,主从节点的复制方式是集成了PG数据库原生的能力,基于WAL日志的物理复制方式实现的。

2.3 OceanBase数据库

OceanBase是基于Paxos协议的多副本复制架构,通过数据分区复制、日志同步等方式将数据同步到多个副本之上。OB中通过RedoLog来保证事务性,事务提交时利用Paxos协议在多个节点间同步RedoLog达成多数派提交,从而维护副本间数据的一致性。首先分区的所有副本(包括主副本自身)会在日志落盘成功后发起投票。当多数派副本都表决日志落盘成功后,业务事务在主副本提交返回。而备副本在接收到主副本同步过来的日志后,会按照日志中的操作指令进行数据的重放。Paxos协议保证了即使主副本发生故障,备副本也能够从多数派副本中找到完整的日志记录,并应用在新的主副本上,从而确保数据的高可用性和一致性。因此可以看到OceanBase数据库主备复制之间的数据同步是物理复制的方式实现的。

2.4 TiDB数据库

TIDB是基于Raft协议保证多副本数据一致性,每个Region会有多个副本,其中一个副本是leader,任何写请求都只能在 Leader 上写入,并且需要写入多数副本后才会返回客户端写入成功。

  • Leader将写操作写入其日志(Region Raft Log),并并行地将该操作发送给所有Follower副本。
  • Follower副本将写操作写入自己的日志,并向Leader发送确认。
  • 当Leader收到足够数量的确认(通常是大多数副本)后,它将操作应用到其状态机,并向客户端发送成功响应。
  • Leader随后通知所有Follower副本应用该操作到它们的状态机。

因此TIDB同一个Region的副本之间的同步方式是物理复制实现的。另外在跨Region的高可用架构中,使用TiCDC实现跨集群的高可用。TiCDC通过拉取上游TiKV的数据变更日志,将数据解析为有序的行级变更数据输出到下游。TiCDC实时监听上游TiKV各个Region Raft Log的信息,并根据每个事务前后数据的差异生成对应多条SQL语句的数据变更信息。TiCDC只保证输出的变更事件和上游TiDB的变更是等价的,不保证能准确还原上游TiDB引起数据变更的SQL语句。

在这里插入图片描述

基于TiCDC的数据复制是逻辑复制,在使用上还有一些限制,比如不支持创建Sequence的DDL操作、同步过程中不支持对同步的表或库的恢复或导入操作等。

2.5 达梦数据库

达梦数据库的主备实例由主库、备库、守护进程和监视器组成,DM数据守护将主库产生的Redo日志传输到备库,备库接收并重新应用Redo日志,从而实现备库与主库的数据同步。其核心思想是监控数据库状态,获取主、备库数据同步情况,为Redo日志传输与repay过程中出现的各种异常情况提供一系列的解决方案。可以看到主备间是物理复制的方式。

在这里插入图片描述

达梦数据库的主备同步方式分为实时主备模式(高性能模式)和即时主备模式(高可靠模式)

  • 在实时主备模式下,数据同步的实时性较高,但更注重性能表现。这种模式下,主库在将Redo日志(RLOG_PKG)写入联机日志文件之前,会先将Redo日志发送到备库。备库在收到Redo日志后,会将其标记为KEEP_PKG,并立即将原KEEP_PKG加入日志重演任务系统,同时马上响应主库,而不需要等待Redo日志重演结束。主库在收到备库的响应消息,确认备库已经收到Redo日志后,再将Redo日志写入联机日志文件中。
  • 即时主备模式则更注重数据的一致性和完整性。在这种模式下,主库先将Redo日志写入联机日志文件,然后通过MAL系统(可能是指达梦特有的消息传递和日志系统)将Redo日志发送到备库。备库在收到Redo日志后,会进行即时归档,并在重演完Redo日志后响应主库。这种模式的同步机制可以保证备库的Redo日志不会比主库的Redo日志多,从而确保数据在事务层面的一致性。
2.6 总结

本文简要介绍了不同数据库主备副本之间的物理复制和逻辑复制方式,各类数据库在底层引擎构建设计时多有不同,比如MySQL系的数据库以逻辑复制为主,而PostgreSQL系或其它分布式数据库类似Oracle数据库的物理复制。两种方式不是非此即彼的关系,各自都有些优缺点和适用场景。不管使用何种实现方式,最终目的是要能够保证主备节点之间数据的一致性,满足高复制性能、低复制时延的基本要求。

数据库类型集群内主备同步跨集群
达梦数据库集中式物理复制
OceanBase分布式物理复制物理复制
GoldenDB分布式逻辑复制逻辑复制
TDSQL(for MySQL)分布式逻辑复制逻辑复制
OpenGauss集中式物理复制物理复制
GaussDB(for opengauss)分布式物理复制物理复制
TiDB分布式物理复制逻辑复制

参考资料:

  1. https://www.modb.pro/db/52463
  2. https://blog.csdn.net/Laugh_xiaoao/article/details/127033658
  3. https://docs.pingcap.com/zh/tidb/stable/ticdc-overview

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

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

相关文章

初试Bootstrap前端框架

文章目录 一、Bootstrap概述二、Bootstrap实例1、创建网页2、编写代码3、代码说明4、浏览网页,查看结果5、登录按钮事件处理6、浏览网页,查看结果 三、实战小结 一、Bootstrap概述 大家好,今天我们将一起学习一个非常流行的前端框架——Boot…

Redis --- redis事务和分布式事务锁

redis事务基本实现 Redis 可以通过 MULTI,EXEC,DISCARD 和 WATCH 等命令来实现事务(transaction)功能。 > MULTI OK > SET USER "Guide哥" QUEUED > GET USER QUEUED > EXEC 1) OK 2) "Guide哥"使用 MULTI命令后可以输入…

Java数据库连接jdbc

Java数据库连接jdbc 导入java包 1、根目录,新建一个lib目录(Dire) 2、将jar包放入lib目录下 3、File -> Project Structure(项目结构) 4、Libraries-> ->java->找到项目的lib目录 5、Apply->OK使用JD…

navicat无法连接远程mysql数据库1130报错的解决方法

出现报错:1130 - Host ipaddress is not allowed to connect to this MySQL serve navicat,当前ip不允许连接到这个MySQL服务 解决当前ip无法连接远程mysql的方法 1. 查看mysql端口,并在服务器安全组中放开相应入方向端口后重启服务器 sud…

二叉树的基本概念(下)

文章目录 🍊自我介绍🍊二叉树的分类满二叉树完全二叉树 🍊二叉树的存储顺序存储[完全二叉树]链式存储 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ &#x1f34…

顶点缓存对象(VBO)与顶点数组对象(VAO)

我们的顶点数组在CPU端的内存里是以数组的形式存在,想要GPU去绘制三角形,那么需要将这些数据传输给GPU。那这些数据在显存端是怎么存储的呢?VBO上场了,它代表GPU上的一段存储空间对象,表现为一个unsigned int类型的变量,GPU端内存对象的一个ID编号、地址、大小。一个VBO对…

利用探空站数据(怀俄明和IGRA)和ERA5计算ZTD、ZHD和ZWD

1.有关 Matlab 获取代码关注咸鱼获取: 怀俄明探空站数据解算PWV和Tm 怀俄明多线程下载探空站数据(包括检查和下载遗漏数据的代码) 对IGRAv2进行质量控制得到PWV和Tm的 matlab 代码 算 IGRAv2 探空站的 Tm 和 PWV 提取探空站 IGRAv2 全部数…

单片机串口AT指令操作SIM800、900拨打电话

文章目录 一、前言1.1 功能简介1.2 拨打电话功能的应用场景1.3 SIM900A与SIM800C模块介绍1.4 原理图 三、模块调试3.1 工具软件下载3.2 准备好模块3.3 串口调试助手的设置3.4 初始化配置3.5 拨打电话的测试流程 四、代码实现4.1 底层的命令发送接口4.2 底层数据接收接口4.3 检测…

基于Next.js和TailwindCss的TailwindCss

最近在研究 Next.js 和 TailwindCss ,这两天没事的时候就搞了一个 c。 目前工具部署在 Vercel ,欢迎各位体验(能提出意见更好嘿嘿) 体验地址: https://icon.999872.xyz/ 图片预览 👇

MySQL Performance Schema 详解及运行时配置优化

引言 MySQL 的 Performance Schema 是一套性能监控与诊断工具,帮助开发者和数据库管理员收集、分析 MySQL 实例的运行状态,找出性能瓶颈并进行优化。通过 Performance Schema,我们能够监控不同的内部事件、线程、会话、语句执行等关键性能指…

LabVIEW界面输入值设为默认值

在LabVIEW中,将前面板上所有控件的当前输入值设为默认值,可以通过以下步骤实现: 使用控件属性节点:你可以创建一个属性节点来获取所有控件的引用。 右键点击控件,选择“创建” > “属性节点”。 设置属性节点为“D…

Pandas和Seaborn可视化详解

1.Pandas绘图-单变量 概述 pandas库是Python数据分析的核心库 它不仅可以加载和转换数据,还可以做更多的事情:它还可以可视化 pandas绘图API简单易用,是pandas流行的重要原因之一 可视化小技巧: 如果是类别型 柱状 饼图 (类别相对较少 5-…

灵办AI搜索引擎和文档总结工具

前言—— 在信息爆炸的时代,如何高效地获取和处理知识成为了每个人面临的挑战。随着人工智能技术的迅猛发展,本文将深入探讨这一创新工具的功能与优势,以及如何在日常生活和工作中充分利用它,开启智能化的信息获取新篇章。 点击…

金属增材制造咋突破?纳米纹理粉末如何助力金属增材制造?

大家好,今天我们来了解一篇金属增材制造文章——《High absorptivity nanotextured powders for additive manufacturing》发表于《Science Advances》。金属增材制造在医疗、航空航天等领域,它潜力巨大,但目前可打印的金属材料有限&#xff…

握手传输 状态机序列检测(记忆科技笔试题)_2024年9月2日

发送模块循环发送0-7,在每个数据传输完成后,间隔5个clk,发送下一个 插入寄存器打拍处理,可以在不同的时钟周期内对信号进行同步,从而减少亚稳态的风险。 记忆科技笔试题:检测出11011在下一个时钟周期输出…

PowerPoint技巧:将幻灯片里的图片背景设置为透明

在PPT中添加了图片,想要将图片中的背景设置为透明或者想要抠图,有什么方法吗?今天分享两个方法。 方法一: 添加图片,选中图片之后,点击【图片格式】功能,点击最左边的【删除背景】 PPT会自动帮…

vue3扩展echart封装为组件库-快速复用

ECharts ECharts,全称Enterprise Charts,是一款由百度团队开发并开源,后捐赠给Apache基金会的纯JavaScript图表库。它提供了直观、生动、可交互、可个性化定制的数据可视化图表,广泛应用于数据分析、商业智能、网页开发等领域。以…

Distilabel合成数据生成框架简明教程

Distilabel 是一个用于合成数据和 AI 反馈的框架,适用于需要基于经过验证的研究论文的快速、可靠和可扩展的管道的工程师。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 -…

Webpack教程-概述

什么是Webpack Webpack是一个静态资源打包工具。它以一个或多个文件作为打包入口,将整个项目所有的文件编译组合成一个或多个文件进行输出。(输出的文件即编译好的文件,就可以在浏览器上运行) Webpack官网 核心概念 entry (入口) entiry 指webpack…

企业源代码怎么保护?2024年最新推荐10款源代码加密软件

在现代企业中,源代码是核心资产之一,保护源代码安全已成为企业管理中的重中之重。源代码的泄露不仅会导致企业知识产权的流失,还可能带来竞争对手的复制和攻击。因此,采用强大的源代码加密工具已成为许多企业的必要措施。2024年&a…