开发者学堂课程【PolarDB-X 开源人才初级认证培训课程:数据导入与导出】学习笔记(三),与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1075/detail/15547
数据导入与导出
内容介绍:
一、PolarDB-X CDC
二、Global Binlog
三、Replica
四、Future Plan
三、Replica
1.What is Replica
Replica可以实现数据的流入,可以和MySQL之间实现双向同步,也可以和PolarDB-X之间实现双向同步,它的架构概如上图,任务调度、任务运行两个部分,通过一系列的流水线变更去消费源端的Binlog数据,把数据导入到PolarDB-X内部,比如它之前只有AB两个列,在加C列变更过程中,因为DDL还没变更完,DML操作里边,真实业务SQL只有 AB两列,但是如果插入一个C列,在变更过程中,如果DML插入C列,肯定是会报错的,因为整个的DDL执行完成之后,它才会返回客户端,DDL成功。其实MYSQL也是一样的,提交了MYSQL加列操作,DDL如果还没变更,还没有执行完,执行DML操作已经包含了正在加的一列肯定是会报错。
Replica写入有几种模式,首先可以保证事务完整性的写入,源端MySQL Binlog里面,在消费的时候,事务是什么样就可以串行的消费,并且在写作的时候也能保证样事务的完整性,但只不过这种模式性能一般会比较差,还有一种消费是牺牲事务,会按照唯一键进行Hash,Hash完之后,并发的往目标端去做协助,性能会比较好,还有一种merge的方式,merge的方式除了做哈希,还会做合并,比如在希完之后会组装队列,在队列里边会有一个merge的操作,比如有一条数据ID为1,在队列里边有连续的十次更新算法就会把十次更新合并成一次,在网标端写入的时候,就不是十次,只需要写一次,可以提升性能,Replica内部写入的几个模式以及不同模式性能情况。
会有关于个DML语句,比如一个C列,它是有默认值的,加完之后业务的SQL虽只插入了AB两列,但是一列如果有默认值,插入的时候在MySQL Binlog里边已经有C列的数据,所以是会有一个新列的数据,虽然外物感知不到,但是MYSQL它在记录频道时已经有列的数据,所以会有整形的需求。不是一个变例操作,是一个实时的操作,它会有一个缓冲区,缓冲区操作的时候不是一个纯变例,本身就是一个流式的操作,只不过会有一个窗口,在窗口内会有默认的一个操作,速度是非常快的,在流式消费过程中,有一个窗口,在窗口过程中有一个数据的快速变例,变例完之后做一个merge,再去写入就可以。
Global Binlog备份后用原生MySQL Binlog命令可以连CN导入恢复到库,通过MySQL Binlog以远程模式的访问来把Global Binlog就可以拉到本地,拉到本地之后,导入恢复到库里边,是借助MySQL Binlog它有个player的功能,因为player操作是MySQL Binlog工具内部,拿到 Binlog之后,会构建出DML语句,发送给PolarDB-X,导入和导出都是通过MySQL Binlog原生的工具做操作就可以,一个是MySQL Binlog的dumper,一个是通过MySQL Binlog做player操作。
视频演示:
以MySQl为主,以PolarDB-X为备,搭建一条主备同步链路,以展示PolarDB-X的Replica这项能力,首先,启动一个MySQL容器,然后启动一个PolarDB-X容器
连接MySQL查看它的初始状态
连接PolarDB-X查看它的初始状态
在PolarDB-X里面通过Change Master指令搭建主备同步链路,看一下MySQL目前的位点情况
设置PolarDB-X从438这个位点开始同步,启动同步链路,
在源端MySQL处创建一个数据库,在PolarDB-X中检查这个库是否已经正常同步
Transfer_test这个库已经正常同步,说明主备同步链路已经搭建完成,启动转账测试脚本,转账测试脚本的基本模型是通过连接源端MySQL创建一张accounts表,在里面写入100个账户,每个账户的初始余额围殴10000,之后再这100个账户中进行转账
转账测试脚本已经开始正常运行,查看MySQL里面的数据情况,
可以看到100个账户已经开始转账,查看PolarDB-X的情况
数据和增量已经开始同步,停止转账测试,对MySQL数据做一个MD5校验,对PolarDB-X数据做一个MD5校验
两边数据的MD5值一样,即数据已经完全同步。
演示是PolarDB-XB作为个MYSQL的slave进行数据消费,验证数据的一致性。
演示:
双向同步,很多业务都需要双向同步。
左上角是一个单击的MySQL,单机MySQL的版本是一个8.0,右边是一个PolarDB-X的实例,版本是5.4.13,目前开源的版本。双向同步是通过server ID来做的,先看一下单机MySQL的server ID,是一个比较好记的名字555。PolarDB-X的ID是一个比较长的数字
提前建好了一个RPR的库,库下边有一个表T1,T1里边没有数据,同样在PolarDB-X是一样的,也是有一个RPR库,有一个T1表。表里边没有数据,表结构也是一致的,看一下单击MySQL的Binlog,目前是679,最大的Binlog是003,PolarDB-X也查看一下。
拿到了各自的server ID,看到两边各有一张T1表,查看当前Binlog的最新状态,接下来开始配置同步,先配置PolarDB-X到MYSQL的同步,脚本已经准备好了,重点看一下ignore id,ignore id意思是PolarDB-X消费单机MySQL Binlog时,如果从Binlog里边看到了server ID=7011值的编号日志就会把它忽略掉,指定位点,ignore Id,ignore ID就是它自己,忽略是因为在双向同步的时候,为了避免回环,要把它标识成自己搜索ID的数据过滤掉,把链路创建起来看一下状态。PolarDB-X消费单机MYSQL链路创建完成,因为要演示双向同步,再去配置一下单击MySQL到PolarDB-X的主从同步,关注ignore ID是555,55就是刚才单机MySQL server ID,同理要过滤自己,操作步骤和MySQL主从同步一样,以单机MySQL为slave,PolarDB-X为主的一个主从高电路创建完成。
双向同步已经构建完成,演示双向同步场景下数据是如何做双向同步的,先在MYSQL里边插入一条数据,ID=1,数据已经成功插入,查一下条数据,数据已经插入,在PolarDB-X验证一下,数据已经同步过来,从Binlog里面看一下,Binlog里面server Id是555,因为数据是从单机MySQL里面同步过来的,所以里面记录的server ID就是555,如果不是同步过来的数据,是自己插入的数据,就是PolarDB-X自己的server ID,和原生MYSQL的行为是完全一致的,即MYSQL主从同步的时候,同步在消费主库Binlog时,它的Binlog中的serve ID也是这样的形态,如果是从控制台进行的操作,Binlog里面的serve ID是自己的,如果是从其他master消费的Binlog过来的,记录的serve ID是上游master的serve ID,PolarDB-X是一样的行为。从PolarDB-X到MySQL已经是正常同步完所有的Binlog
并没有报错,说明ignore ID已经生效,因为Binlog里面记录的是555,消费的ignore ID会把它过滤掉,如果没有生效,会报错,把ID=1的数据重新插入,肯定会逐渐冲突的报错,事实上并没有报错,正常消费。在PolarDB-X也插一条数据,等于2的一条数据
等于2的数据也已经同步到了单机MySQL,两边的双向同步都进行验证。查看单机MySQL里边的内容
555是刚才插入的1,下边7011是刚刚PolarDB-X插入的20条数据,单机MySQL它的serve ID,保存的是PolarDB-X的,和刚才描述的PolarDB-X的形态是一致的,还有一个小特性是PolarDB-X内核提供的一个能力,叫PolarDB-X_server_id_555,命令作用是如果执行了这条命令,从控制台来插入的数据在PolarDB-X的全局Binlog里边,它的server ID就会以set的server ID为基准,即它就不会用默认值。验证一下,插入一条3的数据,ID=3的数据
已经插入成功,按照刚才的讲解,如果执行了一个set PolarDB-X server id=555的指令之后,在源端的Binlog里面就会记录555,预期的行为是222,刚刚插入三的数据不应该同步到单机MySQL
数据没有同步过来,插入的这条数据,它的server ID是555,所以是没有同步过去,跟刚才描述的行为是一致的,双向同步的演示大概就是这样。为什么会封装一个set的命令,命令其实是非常有用的,如果在用PolarDB-X 时有自己的一些需求,比如不是通过单MySQL种change master链路来做同步,比如自己有中间件,有各种各样搭建自己的同步系统,其实可以靠种能力来搭建自己的双向同步,是一个非常方便的样的一个功能,感兴趣可以去深入的研究一下。
四、Future Plan
目前正在working in progress的一些功能,目前Global Binlog不支持Gtid,当前内部已经完成立项,正在做,有了Gtid之后,可以实现MTS的复制能力,MTS、Gtid有感兴趣可以去看一下MySQL的相关资料,有Gtid之后,多线程并行复制可以达到非常高的一个性能基准,能力等开源之后会组织新一轮的讲解。
Binlog-X,X就是一个扩展能力,会做多流,因为全Global Binlog在大规模集群场景下边还是有一定的性能瓶颈,比如有上百个DN节点的时候,做全区的规定可能会有性能的瓶颈,如果对延时还比较高,需要引入多流,多流内部目前目前已经完成了全内部的调试,大概会在今年下半年做一个开源,到时候可以去体验一下。
replica -X有三个的核心特性,一个是replica ,刚才演示的功能,也都是消费单流的Binlog,有了多流之后,内核原生的会支持多流复制,replica -X会支持change master ...with full mode的模式,是一个扩展功能,刚才演示的功能都是实时增量的消费,with full mode的功能是执行完一个个指令之后,会做一个全流程的、全能力的数据同步,会做数据的全量同步,比如上游MySQL,会做全量的数据同步,会做全量的数据校验,再拉起增量,最终做一个数据的逆向的同步,做一个种完备的全能力的数据迁移的能力,大概也是会在下半年的时候会有一个能力的输出。
with full mode和flink CDC全量迁移是类似的,使用形态上可能会比Flink的CDC更简单一些,下边是一个全镜像复制,这个复制能力就是会完成PolarDB-X到PolarDB-X的全镜像复制能力,Global Binlog DDL,执行了一个比如建表的操作之后,这张表是一个分区表,但是它目前在Global Binlog里边呈现出来的是一个单表的形态,如果基于这样能力,做PolarDB-X之间的同步其实是不行的,两个PolarDB-X之间同步肯定要保证两个的表结构都是一样的,上游是一个分区表,下游不能变成一个单表,目前能力也是在过程中,正在构建过程中,会把PolarDB-X私有DDL以某一种形式,保存到Global Binlog里边,通过replica消费个私有DDL,从而能实现PolarDB-X之间的全镜的全能力的单向或者双向的复制,以满足异地多活异地在位的需求,能力可能会更延迟一些。
Binlog-X prospect是多流的一个形态,后边会有样的输出。
会有一个show binary stream的一个命令,会有一个show master status with的一个命令,封装流之后,每个流对应的都是一份并漏Binlog,所以后边在消费多流的时候,会感受到也是非常简单操作,只需要做几个预先简单的命令,最终拿到某个流的源数据信息之后,消费每个流的时候是和单击MySQL消费也是完全一致,输出的时候可以去体验。
知乎文章:
PolarDB-X 全局 Binlog 解读
PolarDB-X 全局Binlog 解读之DDL
PolarDB-X 全局Binlog 解读之理论篇
PolarDB-X 如何装容 MySQL Binlog 协议和参数
PolarDB-X 源码解读〔三):CDC 代码结构
PolarDB-X 源码解读〔八) : Global Binlog的一生