数据导入与导出(四)|学习笔记

简介: 快速学习数据导入与导出(四)

开发者学堂课程【PolarDB-X 开源系列课程数据导入与导出(四)】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/1032/detail/15143


数据导入与导出(四)

四、Replica

接下来看一下Replica内容这个内容会比Binlog相对来说少一些。

image.png

首先可以完成什么样的功能?Replica可以实现数据的流入它可以和MySQL之间实现双向同步也可以和PolarDB-X之间实现双向同步。的架构大概是这样的任务调度任务运行这两个部分,然后通过一系列的流水线变更来去消费源端Binlog数据把这些数据导入到PolarDB-X内部有人说DDL操作时DMR会报错我的意思是说DDL,比如说它之前只有a b两个列,你在加c列这个变更过程中因为DDL还没变更完,那DMR操作里边真实的业务SQL肯定只有insert a b这两列但是如果在变过程中,如果你的DMR插入一个c列,肯定是会报错的因为整个DDL执行完成之后,它才会返回客户端这个DDL成功了。其实MySQL也是一样的,如果提交了一个MySQL的操作,那这个DDL如果还没变更还没有执行完,如果你执行一个DMR操作已经包含了正在加的这一,那肯定是会错的。

image.png

Replica内部的小知识点就是它的写入模式。首先,可以保证事务完整性的写入,就是源端MySQL的Binlog里面我们在消费的时候,它的事务是什么样?我们就可以去串行的消费,并且在写入的时候也能保证事务的完整性,但这种模式性能一般会比较差。

还有一种消费就是牺牲事务,我们会按照唯一键进行哈希哈希完之后并发地往目标端去做协助这样性能会比较好。

还有一种Merge的方式,除了做哈希我们还会做合并,比如说我们在哈完之后会组装队列在这个队列里边,会有一个Merge的操作,比如说有一条id为1的一条数据队列里边有连续的十次更新,那我们算法就会把这十次更新合并成一次这样在往目标端写入的时候它就不是十次,只需要写一次这样可以大大提升性能。这是Replica内部来保证的写入的几个模式,以及不同模式的性能情况。

会有关于DMR语句的数据记录,比如加的C列它是有默认值的,加完之后我们业务的SQL虽然说只插入了a b两列,但是这一列如果有默认值在插入的时候在MySQL Binlog里边已经有c这一列的数据了,所以说是会有新列的数据的,虽然说外物感知不到,但是MySQL在记录Binlog的时候已经有这个列的数据了所以说才会有整形的需求。

而且这不是一个遍历操作,是一个实时操作,它会有一个缓冲区,而且这个缓冲区在操作的时候不是一个纯遍历,它本身就是一个流逝的操作,只不过会有一个窗口,这个窗口内会有默认值的这样一个操作,速度是非常快的,熟悉Flink的同学应该知道,在流消费过程中,会有一个窗口,在这个窗口中就有一个数据的快速遍历,遍历完之后做一个Merge,再去写入就可以

还有同学问全局Binlog备份了以后怎么连CN导入恢复到库里边。这个操作用原生MySQLMySQL Binlog这个命令就行,通过MySQL Binlog以远程模式的访问来把全局Binlog拉到本地拉到本地之后,导入恢复到库里边。这个其实也是借助MySQL Binlog,它有player这样的功能因为playe这个操作其实是在MySQL Binlog工具内部的,它拿到Binlog之后,会构建出DMR语句,然后发送给PolarDB-X,所以说刚才这个问题就是导入和导出都是通过MySQL Binlog这个原生的工具做操作就可以一个是MySQL Binlog的Dump,一个是通过MySQL Binlog做player操作。

然后看一下这个视频这也是之前录好的视频,看字幕来感受一下PolarDB-X作为MySQL的slave的这样的能力。

以展示PolarDB-X的Replica这项能力,

接下来在源端MySQL处创建一个数据库,

image.png

然后在PolarDB-X里面检查一下这个库是否已经正常同步,

image.png

可以看到transfer_test这个库已经正常同步过来,说明我们的主备链路已经搭建完成。接下来启动转账测试脚本。转账测试脚本的基本模型是通过连接源端MySQL创建一张accounts表,并在里面写入100个账户,每个账户的初始余额为10000。

这个脚本已经开始运行,接下来看一下MySQL里面的数据情况。

image.png

再来看一下PolarDB-X的情况。

可以看到这些数据和增量已经开始同步,接下来停止转账测试,对MySQL里面的数据做一个MD5校验。

image.png

对下PolarDB-X里面的数据做一个同样的校验。

image.png

可以看到两个的MD5值一样。

刚才的demo讲的是一个PolarDB-X作为MySQL的slave,进行数据消费,并且验证了一下数据的一致性,可以保证数据的一致。

接下来最后一个demo来演示一下双向同步因为我们在很多产品下边可能都需要涉及双向同步,比如说在同城双重新这样的场景或者自己的业务需要做双活等等这样的场景特别是需要双向同步这种能力的。

左上角是一个单机MySQL版本是8.0的。右边是一个PolarDB-X的实例版本是5.4.13目前开源的版本。双向同步是通过server_id来做的,我们先看一下单机MySQL的server_id是什么

是比较好记的名字——555。再来看一下PolarDB-X这边的server_id,一个比较长串的数字结尾是7011

image.png

提前建好了一个rpl的库库下边有一个表叫t1,里边没有数据在PolarDB-X这边也是一样的也是有一个rpl库,有一张t1表里边也没有数据表结构也是一致的。

接下来看一下单机MySQLBinlog

image.png

目前是679最大的编号是000003,再看一下PolarDB-XBinlog

 image.png

看一下两边的Binlog情况。刚才拿到了各自的server_id,看到了两边各有一张t1然后还看了一下们当前Binlog的最新状态。接下来就要开始配置同步。

先配置PolarDB-XMySQL的同步脚本已经准备好

image.png

重点看一下IGNORE_SERVER_IDS,这里意思就是说PolarDB-X消费单机MySQLBinlog的时候如果从Binlog里边看到了SERVER_ID等于7011这样一个Binlog日志就会把它忽略掉。指定位点,然后IGNORE_SERVER_IDS。这个IGNORE_SERVER_IDS就是自己的为什么忽略?就是在双向同步的时候为了避免回还 要把它标识成自己SERVER_ID的数据过滤掉。

image.png

把链路创建起来再看一下状态。

image.png

PolarDB-X消费单机MySQL的链路就创建完成了。因为我们是要演示双向同步,接下来就再去配置一下单机MySQLPolarDB-X主从同步 同样的关注一下IGNORE_SERVER_IDS555就是刚才单机MySQL的server_id同理,它过滤掉自己的

操作步骤和MySQL同步是一样的。

image.png

以单机MySQL为slavePolarDB-X为主的主从链路也创建好了。这时候看下的状态。

image.png

双向同步已经构建完成。接下来就演示一下双向同步场景下边数据是怎么做双向同步的?

先在MySQL里边插入一条数据id为1

数据已经成功插入查一下这条数据。

数据已经插入。然后PolarDB-X这边来验证一下正常情况肯定是已经同步过来了。

这条数据已经过来了。接着Binlog里面看一下这里面是一个重点,

image.png

就是Binlog里面看server_id是555因为这条数据是从单机MySQL里面同步过来的所以这里面记录的server_id就是555。如果不是同步过来的数据,是自己插入的数据就是PolarDB-X自己的server_id这一点和原生MySQL的行为是完全一致的就是MySQL同步的时候库在消费主库Binlog的时候,它的Binlog里边的server_id也是这样的形态,如果是从控制台进行的操作,那Binlog里面的server_id是自己的。如果是从其master消费的Binlog过来的,记录的server_id是上游master的那个server_id。可以看到PolarDB-X是一样的行为。

然后看一下MySQL这边已经正常同步完所有的Binlog并没有报错说明刚才的IGNORE_SERVER_IDS已经生效了。

因为这边Binlog里面记录的是555。然后边消费的时候IGNORE_SERVER_IDS就是会把它过滤掉,如果没有生效,那右边可能会报错 因为它这边id为1的,如果回回来之后,id为1的数据重新插入,肯定会主线冲突的报错,但是可以看它并没有报错正常消费。

然后在PolarDB-X这边也插一条数据

image.png

可以看到2这条数据也已经同步到了单机MySQL,就是这两边的双向同步,我们都进行了验证。

我们也去看一下单机MySQLBinlog里边的内容。

image.png

可以看这边的server_id刚刚那个555是刚才插入的那个1下边的7011是刚刚PolarDB-X这边刚刚插入的2条数据我们可以看一下单机MySQLserver_id保存的是PolarDB-X和刚才描述的PolarDB-X这边的形态是一致的。

边还有一个小特性这个特性是PolarDB-X内核提供的一个能力这个命令叫set polardbx server_id=555,这个命令作用就是说如果我执行了这条命令从控制台插入的数据在PolarDB-X的全局Binlog里边,它 server_id就会以set的这个server_id为基准意思就是说不会用默认值我们来验证一下

image.png

插入了一条id为3的数据,然后看一下已经插入成功。按照刚才的讲解如果执行了set polardbx server_id=555这样的指令之后源端的Binlog里面,就会记录555我们预期的行为是555,这个刚刚插入的3这个数据,它不应该同步到单机MySQL,看一下这条数据的确没有同步过来。

我们插入到这条数据,它的server_id是555所以说是没有同步过去的跟刚才描述的行为是一致的。这个双向同步的演示大概就是这样。

为什么会封装set这样的命令?这个命令其实是非常有用的。如果大家在用PolarDB-X的时候有自己的一些需求比如说我不是通过单机MySQL这种change master命令来做同步,比如大家自己有中间件有各种各样搭建的自己的同步系统其实是可以靠这种能力来搭建自己的双向同步的,是一个非常方便的功能感兴趣的同学可以去深入地研究一下。

相关文章
|
10月前
|
存储 缓存 UED
Guava Cache 在第三方接口异常时的优雅降级处理
Guava Cache 在第三方接口异常时的问题处理
154 0
|
前端开发 API 数据安全/隐私保护
打造高效后端API:RESTful设计原则与实践
【9月更文挑战第4天】在数字化时代的浪潮中,后端API作为连接数据和前端的桥梁,其设计质量直接影响着应用的性能和扩展性。本文将深入探讨RESTful API的设计哲学、核心原则以及如何在实际开发中应用这些原则来构建一个高效、易于维护的后端系统。我们将通过代码示例,揭示如何将理论转化为实践,从而为开发者提供一条清晰的道路,去创造那些能够在不断变化的技术环境中茁壮成长的API。
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
207 4
|
Java
Java生成图形验证码
Java生成图形验证码
426 3
|
存储 Linux
Linux 中的 /dev/null 是什么?有什么隐藏的作用?
Linux 中的 /dev/null 是什么?有什么隐藏的作用?
828 0
|
设计模式 C++
设计模式之命令模式(C++)
设计模式之命令模式(C++)
112 0
|
JSON 监控 安全
SpringCloud极简入门-服务网关-spring cloud zuul
为什么要zuul 试想一下如果我们有很多的微服务,他们都需要登录之后才能访问,那么我需要在每个微服务都去做一套登录检查逻辑,这样是不是会存在大量重复的代码和工作量,我们希望的是把登录检查这种公共的逻辑进行统一的抽取,只需要做一套检查逻辑即可,而zuul就可以用来干这类事情,我们可以把zuul看做是微服务的大门,所有的请求都需要通过zuul将请求分发到其他微服务,根据这一特性我们就可以在zuul做统一的登录检查,下游的微服务不再处理登录检查逻辑。
389 0
|
算法 安全 JavaScript
安卓逆向 -- 算法基础(RSA)
安卓逆向 -- 算法基础(RSA)
354 0
安卓逆向 -- 算法基础(RSA)
|
Java 编译器
第11篇:Java 变量作用域、构造方法官方教程
✏️ 全局变量(成员变量)作用域为:整个类体 ✏️ 局部变量(除全局变量之外的变量)作用域为:它所在的代码块 ✏️ 全局变量可以不赋值,直接使用(全局变量有默认值) ✏️ 局部变量必须赋值后才能使用 ✏️ 参数的值在方法被调用的时候才有
247 0
第11篇:Java 变量作用域、构造方法官方教程
|
算法 程序员 PHP
PHP为什么需要 for 循环?底层原理是什么?
PHP为什么需要 for 循环?底层原理是什么?
261 0