首页 > 数据库 >个人随记 —— MySQL 数据同步方案思考

个人随记 —— MySQL 数据同步方案思考

时间:2023-02-10 00:23:21浏览次数:61  
标签:事务 同步 --- 并发 MySQL 数据 随记

背景

在灾备、读写分离等数据同步场景中,同步延迟越低,越能应用在更多场景之中,RPO 和 RTO 最好能无限趋近于 0。
但是这需要下游数据库的平均吞吐能力大于上游平均吞吐能力。实际上一般备集群、只读集群的规格其实是小于主集群的,所以在并发度较低时,提升并发度是提升吞吐的有效手段。

MySQL 官方能力

MySQL binlog 文件记录数据的修改操作,官方提供 mysqlbinlog 程序用于解析 binlog 文件

$ mysqlbinlog <binlog-filename> --read-from-remote-server --stop-never --base64-output=DECODE-ROWS --verbose --host=<MySQL-host> -u <MySQL-user> -p
  • binlog 记录了数据变更的二进制数据,是可以高效进行异构数据同步源头。
  • 日志文件按照偏移量顺序记录数据修改,某一个时刻的日志文件内容反映了此时 MySQL 串行化的事务执行历史

MySQL 5.7 中 Logical clock 同步方案

binlog 文件中事务会按顺序分配递增的序号 sequence_number,每个事务会记录需要等待的事务的最大序号 last_committed,以此就可以表示逻辑上的先后关系。

https://www.percona.com/blog/a-dive-into-mysql-multi-threaded-replication/#crayon-6350f5be4b419795731372

image
如图所示,我们就可以按照 last_committed 来构建先后以来顺序,对不依赖的事务尽可能的执行并发。

MySQL 8.0.1 中 Write set 同步方案

如果两个事务在时间上有先后关系,但是实际上实际上两个事务之间并没有修改相同的数据,那么我们也可以将这两个事务并发执行,但是这个将会打破源库写入的实际情况。所以在 MySQL 8.0.1 中基于此提出了 WRITESET 和 WRITESET_SESSION 方案,可以进一步提升并发。MySQL 会基于事务的写集计算先后关系并同样记录在 sequence_number 和 last_committed 中,详见博客

https://dev.mysql.com/blog-archive/improving-the-parallel-applier-with-writeset-based-dependency-tracking/

image
image

可以看到上图中的事务 T4 与 T6 在时间上存在先后关系,但它们所修改的数据并不重叠,因此下图中将它们并发同步。

两种方案优劣势比较

方案 优势 劣势
Logical clock 基于时钟的方案从并发的定义出发,是各种方案中最安全的 性能取决于备集群规格、负载,没有特别多的优化空间
Write set 相对于前者,性能会有提升 无法确定客户端是否允许它们并发。如果客户端不允许它们并发,下游就会暴露异常的事务执行历史

并发度更高的方案

按行粒度并发同步

那其实我们可以直接跳过事务,按照行粒度来设计并发修改方案,在这里可以考虑

  1. 同一条记录的数据修改
  2. 两条记录如果因数据库约束存在先后联系

举个例子:

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `name` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `c` (`name`)
);

修改记录如下:

--- M1
INSERT (1, 1)
--- M2
INSERT (2, 2)
--- M3
UPDATE (1, 1) TO (3, 3)
--- M4
INSERT (1, 4)
--- M5
DELETE (2, 2)
--- M6
UPDATE (1, 4) TO (2, 1)
--- M7
INSERT (5, 5)

具有相同取值的数据修改,需要保持先后关系:

image

行粒度同步的特点

  • 通过行粒度拆分事务,实现比上游更大的并发度,从而可以有更多的可能性。
  • 以行为粒度进行攒批,可以更容易获得稳定的批处理大小。
  • 对事务进行拆分后,如果遇到同步中断,需要从低水位(low watermark)位置恢复同步,并对中断时低水位到高水位(high watermark)之间的数据修改使用合适方法处理潜在的重复同步。
  • 无主键表较难处理中断恢复问题。

一些其他关键想法

行粒度数据同步放弃了查询下游数据库时的事务原子性,并且在多条记录之间引入了不符合因果关系的状态,但是我们可以引入一些写屏障进行切割隔离,使得可以在一定程度缓解这种问题

标签:事务,同步,---,并发,MySQL,数据,随记
From: https://www.cnblogs.com/BlueMountain-HaggenDazs/p/17107562.html

相关文章

  • python3连接mysql报错RuntimeError: 'cryptography' package is required for sha256_
    使用pymysql报错RuntimeError‘cryptography‘packageisrequiredforsha256_passwordorcaching_sha2_passw如果报错:解决办法:安装cryptographypip3installcry......
  • MYSQL脱敏 || 给开发人员限制权限,保证mysql数据库数据安全
    目录MYSQL脱敏权限限制单库级别单表级别单列级别MYSQL脱敏脱敏:脱离敏感信息。有时候开发需要权限查找一些数据,那么mysql数据库存放着很多重要数据信息,肯定不能随便让......
  • Windows 环境下安装Snort+MySQL+ACID
       在Windows系统中安装软件,通常是一通Next...Finish,相比Linux要容易,所以很多同学在准备IDS实验环境时自然会想到采用Windows系统,本文对阅读者的网络基础知识以及对实......
  • Java Mysql Time类型 接收显示问题
    最近写项目需要用的mysql中的Time时间类型问题产生原因想要实现在mysql中只存入Time类型,如10:30。这样可以方便存取,在后台接收和显示都比较方便。产生的问题但是这......
  • 字符串随记
    一、Border和周期1.对于字符串\(S\),若其最小整周期不为\(|S|\),则最小整周期为最小周期。证明:考虑反证法。易知最小整周期\(p\le\frac{|S|}{2}\)。若存在周期\(q......
  • mysql 主从复制传统模式转换成gtid模式
    业务希望在主备切换时候可以自动完成1.修改参数主从两边都设置setglobalset enforce_gtid_consistency=warn;去错误日志查看错误信息tail-100ferror.log如何错误......
  • 构建api gateway之 基于etcd实现动态配置同步
    配置中心在之前 tcp的yaml配置 介绍了如何监听yaml文件变化然后更新配置。当然假如我们有很多实例,那么yaml改动将是非常痛苦的事情,那么如何做到配置文件统一管理,实时更......
  • 因MySQL数据库无法启动导致EasyCVR也无法启动的解决办法
    EasyCVR具备强大的视频接入、汇聚与管理、视频分发等视频能力,可实现的视频功能包括:视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、服务器集群、智......
  • mysql gtid模式转化为传统复制模式
    业务上需要用到createtableasselect时候gtid不支持1.停止从库主从延时要停止1、stopslave2、CHANGEMASTERTO MASTER_AUTO_POSITION=0,MASTER_HOST='master2.e......
  • 因MySQL数据库无法启动导致EasyCVR也无法启动的解决办法
    EasyCVR具备强大的视频接入、汇聚与管理、视频分发等视频能力,可实现的视频功能包括:视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、服务器集群、智......