一、MySQL复制概述

MySQL支持两种复制方式:基于行的复制和基于语句的复制(逻辑复制)。这两种方式都是通过在主库上记录

二进制日志、在备库重放日志的方式来实现异步的数据复制,其工作原理如下图:

同一时间点主库和备库的数据可能存在不一致。复制通常不会增加主库的开销,主要是启用二进制日志带来的开

销。通过复制可以将读操作指向备库来获得更好的读扩展,但对于写操作,除非设计得当,否则并不适合通过复制来

扩展写操作。在一主库多备库的架构中,写操作会被执行多次,这时候整个系统的性能取决于写入最慢的那部分。

复制解决的问题(用途):数据分布、、负载均衡、备份、高可用性和故障切换、MySQL升级测试等等。

二、MySQL复制原理

1. 基于语句的复制:

主库记录那些造成数据更改的查询,当备库读取并重放这些事件时,实际上只是把主库上执行过的SQL再执行一遍。

好处:实现简单、二进制日志里事件更加紧凑。当主备库模式不同时,逻辑复制能在多种情况下工作。容易理解,

出现问题可以很好定位。

缺点:存在一些无法被正确复制的SQL,例如当使用了CURRENT_USER()函数时。更新必须是串行的,这需要更多的

锁。存储过程和触发器在使用基于语句的复制模式时也可能存在问题。

2. 基于行的复制:
       基于行的复制将实际数据记录在二进制日志中。

好处:可以正确地复制每一行。无须重放更新主库数据的查询,更高效。减少锁的使用。

缺点:很难进行时间点恢复、开销有时大有时小。无法判断执行了哪些SQL。出现问题很难定位。无法处理诸如在

备库修改表的schema这样的情况。

没有那种模式对所有情况都是完美的,MySQL能够在这两种复制模式间动态切换。默认情况下使用的是基于语句的

复制方式,但如果发现语句无法被正确地复制,就切换到基于行的复制模式。

3. 复制使用的文件:

(1)二进制文件、中继二进制文件(文件名可在mysql配置文件中配置)

(2)mysql-bin.index:记录所有的二进制日志文件名,不能删除,MySQL依赖这个文件识别二进制日志文件。

(3)mysql-relay-bin.index:记录所有中继日志的索引文件,同样不能删除。

(4)master.info:保存备库连接到主库所需要的信息,格式为纯文本,记录了复制用户的密码。

(5)relay-log.info:记录当前备库复制的二进制日志和中继日志坐标。

4. 发送制事件到其他备库:

log_slave_updates选项可以让备库变成其他服务器的主库。在设置该选项后,MySQL会将其执行过的事件记录到

它自己的二进制日志中,这样它的备库就可以从其日志中检索并执行事件。原理图如下:

注:

当复制SQL线程读中继日志时,会丢弃事件中记录的服务器ID和该服务器本身ID相同的事件,从而打破了复制过程中

的无限循环。

5. 复制过滤器:

复制过滤器选项允许仅复制服务器上一部分数据。有两种过滤方式:在主库上过滤记录到二进制日志中的事件、在

备库上过滤记录到中继日志中的事件。原理图如下:

注:

除非万不得已,不要使用复制过滤,因为它很容易中断复制并导致问题,在需要灾难恢复时也会带来极大的不方便。

三、复制拓扑
      可以在任意个主库和备库之间建立复制,只有一个限制:每一个备库只能有一个主库。各种拓扑结构的基本原则:

(1)一个MySQL备库实例只能有一个主库。

(2)每个备库必须有一个唯一的服务器ID。

(3)一个主库可以有多个备库。

(4)如果打开了log_slave_updates选项,一个备库可以把其主库上的数据变化传播到其他备库。

1. 一主库多备库:

在有少量写和大量读时,这种配置是非常有用的。可以把读分摊到多个备库上,直到备库给主库造成了太大的负担,

或者主备之间的带宽成为瓶颈为止。

2. 主动-主动模式下的主-主复制:
      也叫双主复制或双向复制,包含两台服务器,每一个都被配置成对方的主库和备库。

这种配置最大的问题是如何解决冲突,例如,两台服务器同时修改一行记录,或同时在两台服务器上向一个包含

auto_increment列的表里插入数据。

允许向两个服务器写入所带来的麻烦远远大于其带来的好处。

3. 主动-被动模式下的主-主复制:

把“主动-主动模式下的主-主复制”中的的一台服务器配置成只读的被动服务器。

这种方式使得反复切换主动和被动服务器非常方便,因为服务器的配置是对称的,这使得故障转移和故障恢复很容易。

4. 拥有备库的主-主结构:

为主-主复制中的每个主库增加一个备库。

这种配置的优点是增加了冗余,对于不同地理位置的复制拓扑结构,能够消除站点单点失效的问题。

5. 环形复制:
       每个服务器都是在它之前的服务器的备库,是在它之后的服务器的主库。完全依赖于环上的每一个可用节点,大大增

加了整个系统失效的几率。如果从环中移除一个节点,这个节点发起的事件就会陷入无限循环。

可用通过为每个节点增加备库的方式来减少环形复制的风险。

6. 主库、分发主库以及备库:

当备库足够多时,会对主库造成很大的负载。这种拓扑使用一个备库专门来进行复制的分发,移除主库的负载。

为了避免在分发主库上做实际的查询,可以将它的表修改为blackhole存储引擎。如果主库接近满负载,不应该为其

建立10个以上的备库。可以通过设置slave_compressed_protocol来节约一些主库宽带。可以通过分发主库实现其他目的,例

如对二进制日志事件执行过滤和重写规则。

使用分发主库一个主要的缺点是无法使用一个备库来代替主库,因为由于分发主库的存在,导致各个备库与原始主库

的二进制日志坐标已经不相同。

7. 树或金字塔形:

减轻了主库的负担,但它的缺点是中间层出现的任何错误都会影响到多个服务器,中间层次越多,处理故障会更困难、

更复杂。

MySQL复制之理论篇的更多相关文章

  1. (5.3)mysql高可用系列——mysql复制(理论篇)【续写中】

    关键词:mysql主从复制,mysql复制,MGR,mysql并行复制 目录 [1]mysql支持的复制类型 [2]mysql的主从4种同步方式介绍 (1)异步 (2)同步 (3)5.6 半同步 (4 ...

  2. (5.7)mysql高可用系列——MySQL中的GTID复制(理论篇)【转】

    转自:https://blog.csdn.net/wmq880204/article/details/53160078 一.GTID的概述: 1.全局事物标识:global transaction i ...

  3. MySQL Performance-Schema(二) 理论篇

    MySQL Performance-Schema中总共包含52个表,主要分为几类:Setup表,Instance表,Wait Event表,Stage Event表Statement Event表,C ...

  4. MySql binlog(理论篇)

    1.什么是binlog? binlog日志用于记录所有更新了数据的sql语句或保存被修改的记录Row: 有了binlog,可以用于实时备份,master/slave主从同步: 在5.0版本前支持文本格 ...

  5. 深入MySQL复制(一)

    本文非常详细地介绍MySQL复制相关的内容,包括基本概念.复制原理.如何配置不同类型的复制(传统复制)等等.在此文章之后,还有几篇文章分别介绍GTID复制.半同步复制.实现MySQL的动静分离,以及M ...

  6. 深入MySQL复制(二):基于GTID复制

    相比传统的MySQL复制,gtid复制无论是配置还是维护都要轻松的多.本文对gtid复制稍作介绍. MySQL基于GTID复制官方手册:https://dev.mysql.com/doc/refman ...

  7. SQL Server ->> 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)

    因为篇幅原因,AlwaysOn可用性组被拆成了两部分:理论部分和实战部分.而实战部分又被拆成了准备工作和AlwaysOn可用性组搭建. 三篇文章各自的链接: SQL Server ->> ...

  8. 如何编写高质量的 JS 函数(3) --函数式编程[理论篇]

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/EWSqZuujHIRyx8Eb2SSidQ作者:杨昆 [编写高质量函数系列]中, <如何 ...

  9. MySQl看这一篇就够了

    MySQL分享 一.数据库结构 语句 DDL(Data Definition Languages):数据定义语句,常用的语句关键字主要包括 create.drop.alter等操作表结构 DML(Da ...

随机推荐

  1. JAVA课程设计-购物车 (201521123101 柏清晔)

    1.团队课程设计博客链接 /[团队博客链接]http://www.cnblogs.com/yayaya/p/7062197.html 2.个人负责模板或任务说明 1.连接数据库 2.修改购物车的jsp ...

  2. yum仓库管理

    yum在线管理 rpm包的管理分为 rpm命令管理和yum在线管理,rpm命令管理由于可能需要解决各种依赖问题,在安装软件的时候可能显得比较麻烦,然而,yum在线管理正好和它相反.Yum(全称为 Ye ...

  3. YYHS-Floor it

    题目描述 输入 输出 样例输入 5 97 样例输出 11 提示       题解 先不管p,通过列举前面几项,不难发现当i为偶数时,a[i]=a[i-1]+a[i-2],当i为奇数时,a[i]=a[i ...

  4. Srping - bean的依赖注入(Dependency injection)

    目录 1 概述 2 两种基本的依赖注入方式 2.1 构造函数方式 2.2Setter方式 3 其他依赖注入功能 3.1 <ref/>标签引用不同范围的bean 3.2 内部bean 3.3 ...

  5. [python学习笔记] 运算符

    数学运算符 与大多语言相同的运算符就不介绍了.不同的地方会用 (!不同)标出 与java相同的运算符 , - , * , % , / 不同之处 除法 (!不同) /  与java不同,整数相除,结果为 ...

  6. 使用Gateway-Worker实现多人分组实时聊天 结合第三方tp

    一.基础知识1.Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架.被广泛的用于手机app.移动通讯等领域的开发. 支持TCP长连接,支持Websocket.HTTP等 ...

  7. [转]iOS 应用程序的生命周期

    OS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到 ...

  8. JavaScript随机数类型

    1.Math.random(); 结果为0-1间的一个随机数(包括0,不包括1) 2.Math.floor(num); 参数num为一个数值,函数结果为num的整数部分. 3.Math.round(n ...

  9. 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具

        Java学习路线图引言:        黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...

  10. vue实例讲解之vuex的使用

    vuex是一个状态管理插件,本文通过一个简单的实例来讲解一下,vuex的使用. 先看一张官方的图: 这个图新手一看估计是蒙的,简单解释一下,这个图表示的就是vue通过Action Mutations ...