浅谈Mysql5.7的Replication相关增强

       近日ORACLE发布几个新的功能在最新的Mysql5.7.11的版本上,以及在我们公司新一代产品研发中,我们的数据库选型也是mysql5.7.11,由此有了此篇文章。本篇文字主要是研究Mysql5.7相比之前版本Replication的功能的改变以及增加,主要内容包括以下:

(1)   Mysql的Replication基础

(2)   Mysql5.7的半同步复制改进

(3)   Mysql5.7的多源复制增加

(4)   Mysql5.7对于在线变更复制方式的支持

一.Mysql的Replication基础

       Replication,即复制,不管是最近流行的nosql数据库以及大数据,还是传统的数据库,基本都会具备复制的特性,那么数据复制技术有哪些特点呢?(1)负载均衡(2)数据备份以及分布(3)高可用和容错。同样,Mysql也具备这些特性,那么Mysql是怎样完成复制工作的呢?如下图所示:

浅谈Mysql5.7的Replication相关增强_第1张图片

(1)   master将改变记录(记录叫做二进制日志事件,binarylog events)到二进制日志(binary log):在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务;

(2)    slave将master的binary log events拷贝到它的中继日志(relay log):当发出start slave 时,首先slave创建一个I/O线程,以连接master并让它发送记录在其二进制日志中的语句,然后开始binlog dump process,slave的I/O线程读取master的BinlogDump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志(relay log);

(3)    slave创建SQL thread用于读取中继日志中并执行更新操作:SQL thread从中继日志读取中继日志,更新slave的数据,使其与master中的数据一致。

        以上介绍的是Mysql的异步复制,异步复制意味着在把数据从一台机器拷贝到另一台机器时有一个延时,这意味着当应用系统的事务提交已经确认时数据并不能在同一时刻拷贝到slave。通常这个延时是由网络带宽、资源可用性和系统负载决定的。如果slave不幸落后,而更不幸的是master此时又出现Crash(例如宕机),这时slave中的数据就是不完整的。简而言之,在master发生故障的时候,我们无法使用slave来继续提供数据一致的服务。于是,便产生了半同步复制的概念

二.Mysql5.7的半同步复制改进

        半同步复制即当master在将自己binary log发给slave上的时候,要确保slave已经接受到了这个二进制日志以后,才会返回数据给客户端,目的在于事务环境下保持主从一致。但是,Mysql5.6的存在一些缺陷导致数据存在某些条件无法保证一致性。Mysql5.6的半步复制的过程图如下:

浅谈Mysql5.7的Replication相关增强_第2张图片

       存在的问题是在slave进行Waiting Slave dump之前,master进行了Storage Commit事务操作,假如此时恰好master宕机,导致master与slave的数据不一致,Mysql5.7对于这一现象进行改进,具体的过程图如下:

浅谈Mysql5.7的Replication相关增强_第3张图片

      Mysql5.7在Wait slave dump后,进行Storage Commit事务操作,这样保证从已经有了数据,即便master宕机,也能保证数据的一致性。

三.Mysql5.7的多源复制增加

        Multi-source replication即多源复制,这对采用分库分表的同学绝对是个超级重磅福音,可以把多个MASTER的数据归并到一个实例上, 有助于提高SLAVE服务器的利用率,实际业务需求帮助作用也比较大。不过如果是同一个表的话,会存在主键和唯一索引冲突的风险,需要提前做好规划。多源复制的概念结构图如下所示:

浅谈Mysql5.7的Replication相关增强_第4张图片

        Slave如何区别数据到底来自哪个Master呢?Mysql5.7提出了通信渠道(channel)的概念,每一个通信渠道都是一个slave从master获得二进制日志的链接。。这意味着每个通信渠道都得有一个IO thread .我们需要运行不同的 “change master” 命令, 对于每一个主服务器。我们需要用到 “for channel”这个参数来提供通信链接的名字。

四.Mysql5.7对于在线变更复制方式的支持

        Mysql支持两种复制方式,一种是基于日志点的复制方式,一种是基于GTID的复制方式,在Mysql5.7之前完成这两种方式的切换是需要重启master,但在Mysql5.7中不需要重启master服务器,这对于生产环境变更作用很大。

五.总结

       本次主要分享自己对于Mysql5.7的复制,半同步复制,多源复制,以及在线变更复制方式的认识,以及与之前版本的区别,更多的是理论的讲述,没有进行实例讲述,我会在后续的章节编写每个场景的实践过程。


你可能感兴趣的:(数据库技术,数据库,web开发,database,mysql)