复制的体系结构有下面一些基本原则:

(1)    每一个slave仅仅能有一个master;

(2)    每一个slave仅仅能有一个唯一的serverID;

(3)    每一个master能够有非常多slave;

(4)    假设你设置log_slave_updates,slave能够是其他slave的master,从而扩散master的更新。

MySQL不支持多主server复制(Multimaster Replication)——即一个slave能够有多个master。

可是。通过一些简单的组合,我们却能够建立灵活而强大的复制体系结构。

1、单一master和多slave

由一个master和一个slave组成复制系统是最简单的情况。

Slave之间并不相互通信,仅仅能与master进行通信。

在实际应用场景中,MySQL复制90%以上都是一个Master拷贝到一个或者多个Slave的架构模式。主要用于读压力比較大的应用的数据库端便宜扩展解决方式。由于仅仅要Master和Slave的压力不是太大(尤其是Slave端压力)的话,异步复制的延时一般都非常少非常少。尤其是自从Slave端的复制方式改成两个线程处理之后。更是减小了Slave端的延时问题。而带来的效益是,对于数据实时性要求不是特别Critical的应用,仅仅须要通过便宜的pcserver来扩展Slave的数量,将读压力分散到多台Slave的机器上面。就可以通过分散单台数据库服务器的读压力来解决数据库端的读性能瓶颈。毕竟在大多数数据库应用系统中的读压力还是要比写压力大非常多。

这在非常大程度上攻克了眼下非常多中小型站点的数据库压力瓶颈问题,甚至有些大型站点也在使用类似方案解决数据库瓶颈。

例如以下:



 假设写操作较少。而读操作非常时。能够採取这样的结构。你能够将读操作分布到其他的slave。从而减小master的压力。可是,当slave添加到一定数量时,slave对master的负载以及网络带宽都会成为一个严重的问题。

这样的结构尽管简单,可是。它却很灵活,足够满足大多数应用需求。一些建议:

(1)    不同的slave扮演不同的作用(比如使用不同的索引。或者不同的存储引擎)。

(2)    用一个slave作为备用master,仅仅进行复制;

(3)    用一个远程的slave。用于灾难恢复;

 

大家应该都比較清楚。从一个Master节点能够复制出多个Slave节点。可能有人会想,那一个Slave节点能否够从多个Master节点上面进行复制呢?至少在眼下来看,MySQL是做不到的。以后是否会支持就不清楚了。

MySQL不支持一个Slave节点从多个Master节点来进行复制的架构。主要是为了避免冲突的问题,防止多个数据源之间的数据出现冲突,而造成最后数据的不一致性。只是听说已经有人开发了相关的patch。让MySQL支持一个Slave节点从多个Master结点作为数据源来进行复制,这也正是MySQL开源的性质所带来的优点。

2、主动模式的Master-Master(Master-Master in Active-Active Mode)

Master-Master复制的两台server。既是master,又是还有一台server的slave。这样。不论什么一方所做的变更,都会通过复制应用到另外一方的数据库中。

可能有些读者朋友会有一个操心,log-slave-updates 选项就是让slave把replication的事件也写进binlog,假设在互为主从的架构下,開始log-slave-updates不就会导致一个事务在两个mysql之间不断循环吗?实际上MySQL自己早就想到了这一点,所以在MySQL的BinaryLog中记录了当前MySQL的server-id,并且这个參数也是我们搭建MySQLReplication的时候必须明白指定,并且Master和Slave的server-id參数值比须要不一致才干使MySQLReplication搭建成功。

一旦有了server-id的值之后,MySQL就非常easy推断某个变更是从哪一个MySQLServer最初产生的,所以就非常easy避免出现循环复制的情况。并且。假设我们不打开记录Slave的BinaryLog的选项(--log-slave-update)的时候。MySQL根本就不会记录复制过程中的变更到BinaryLog中,就更不用操心可能会出现循环复制的情形了。

 
如图:


主动的Master-Master复制有一些特殊的用处。

比如。地理上分布的两个部分都须要自己的可写的数据副本。这样的结构最大的问题就是更新冲突。

如果一个表仅仅有一行(一列)的数据,其值为1,如果两个server分别同一时候运行例如以下语句:

在第一个server上运行:

mysql> UPDATE tbl SET col=col + 1;

在第二个server上运行:

mysql> UPDATE tbl SET col=col * 2;

那么结果是多少呢?一台server是4。还有一个server是3,可是,这并不会产生错误。

实际上,MySQL并不支持其他一些DBMS支持的多主server复制(Multimaster Replication),这是MySQL的复制功能非常大的一个限制(多主server的难点在于解决更新冲突),可是,假设你实在有这样的需求,你能够採用MySQL Cluster,以及将Cluster和Replication结合起来,能够建立强大的高性能的数据库平台。

可是,能够通过其他一些方式来模拟这样的多主server的复制。

3、主动-被动模式的Master-Master(Master-Master in Active-Passive Mode)

这是master-master结构变化而来的,它避免了M-M的缺点。实际上,这是一种具有容错和高可用性的系统。

它的不同点在于当中一个服务仅仅能进行仅仅读操作。如图:

 
 

4、级联复制架构 Master –Slaves - Slaves

在有些应用场景中。可能读写压力区别比較大。读压力特别的大,一个Master可能须要上10台甚至很多其它的Slave才可以支撑注读的压力。

这时候。Master就会比較吃力了,由于只连上来的SlaveIO线程就比較多了,这样写的压力略微大一点的时候,Master端由于复制就会消耗较多的资源,非常easy造成复制的延时。

遇到这样的情况怎样解决呢?这时候我们就能够利用MySQL能够在Slave端记录复制所产生变更的BinaryLog信息的功能,也就是打开—log-slave-update选项。

然后,通过二级(或者是很多其它级别)复制来降低Master端由于复制所带来的压力。

也就是说,我们首先通过少数几台MySQL从Master来进行复制,这几台机器我们姑且称之为第一级Slave集群,然后其它的Slave再从第一级Slave集群来进行复制。从第一级Slave进行复制的Slave,我称之为第二级Slave集群。假设有须要,我们能够继续往下添加很多其它层次的复制。

这样,我们非常easy就控制了每一台MySQL上面所附属Slave的数量。这样的架构我称之为Master-Slaves-Slaves架构

这样的多层级联复制的架构,非常easy就攻克了Master端由于附属Slave太多而成为瓶颈的风险。下图展示了多层级联复制的Replication架构。

当然,假设条件同意。我更倾向于建议大家通过拆分成多个Replication集群来解决

上述瓶颈问题。

毕竟Slave并没有降低写的量,全部Slave实际上仍然还是应用了全部的数据变更操作,没有降低不论什么写IO。相反,Slave越多,整个集群的写IO总量也就会越多,我们没有非常明显的感觉,只不过由于分散到了多台机器上面,所以不是非常easy表现出来。

此外。添加复制的级联层次。同一个变更传到最底层的Slave所须要经过的MySQL也会很多其它,相同可能造成延时较长的风险。

而假设我们通过分拆集群的方式来解决的话,可能就会要好非常多了。当然,分拆集群也须要更复杂的技术和更复杂的应用系统架构。

5、带从server的Master-Master结构(Master-Master with Slaves)

这样的结构的长处就是提供了冗余。在地理上分布的复制结构。它不存在单一节点故障问题,并且还能够将读密集型的请求放到slave上。



级联复制在一定程度上面确实攻克了Master由于所附属的Slave过多而成为瓶颈的问题,可是他并不能解决人工维护和出现异常须要切换后可能存在又一次搭建Replication的问题。

这样就非常自然的引申出了DualMaster与级联复制结合的Replication架构,我称之为Master-Master-Slaves架构

和Master-Slaves-Slaves架构相比,差别只不过将第一级Slave集群换成了一台单独的Master,作为备用Master。然后再从这个备用的Master进行拷贝到一个Slave集群。

这样的DualMaster与级联复制结合的架构,最大的优点就是既能够避免主Master的写入操作不会受到Slave集群的复制所带来的影响,同一时候主Master须要切换的时候也基本上不会出现重搭Replication的情况。可是,这个架构也有一个弊端,那就是备用的Master有可能成为瓶颈,由于假设后面的Slave集群比較大的话,备用Master可能会由于过多的SlaveIO线程请求而成为瓶颈。

当然,该备用Master不提供不论什么的读服务的时候,瓶颈出现的可能性并非特别高,假设出现瓶颈。也能够在备用Master后面再次进行级联复制,架设多层Slave集群。当然,级联复制的级别越多,Slave集群可能出现的数据延时也会更为明显,所以考虑使用多层级联复制之前,也须要评估数据延时相应用系统的影响。

MySQL复制经常使用拓扑结构具体解释的更多相关文章

  1. 理解MySQL——复制(Replication)

    1.复制概述 1.1.复制解决的问题数据复制技术有以下一些特点:(1)    数据分布(2)    负载平衡(load balancing)(3)    备份(4)    高可用性(high avai ...

  2. MySQL复制(三) --- 高可用性和复制

    实现高可用性的原则很简单: 冗余(Redundancy):如果一个组件出现故障,必须有一个备用组件.这个备用组件可以是standing by的,也可以是当前系统部署中的一部分. 应急计划(Contig ...

  3. MySQL复制之实践篇

    本文主要以"一个主库,两个备库"代表"一个主库,多个备库"的拓扑结构来展示MySQL复制的实践过程. 拓扑结构: 主库创建复制账号: grant replica ...

  4. MySQL复制之理论篇

    一.MySQL复制概述 MySQL支持两种复制方式:基于行的复制和基于语句的复制(逻辑复制).这两种方式都是通过在主库上记录 二进制日志.在备库重放日志的方式来实现异步的数据复制,其工作原理如下图: ...

  5. 深入MySQL复制(一)

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

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

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

  7. 深入MySQL复制(三):半同步复制

    1.半同步复制 半同步复制官方手册:https://dev.mysql.com/doc/refman/5.7/en/replication-semisync.html 默认情况下,MySQL的复制是异 ...

  8. 31.Mysql复制

    31.Mysql复制复制是指将主数据库的DDL和DML操作通过二进制日志传到从数据库上,然后在从数据库上对重做日志,从而使从库与主库保持同步.Mysql支持一台主库同时向多台从库复制,从库也可以作为其 ...

  9. MySQL复制原理-加强版

    mysql从3.23开始提供复制功能,复制指将主库的ddl和dml操作通过binlog文件传送到从库上执行,从而保持主库和从库数据同步.mysql支持一台主库同时向多台从库复制,从库同时也可以作为其他 ...

随机推荐

  1. What is the purpose of mock objects?

    Since you say you are new to unit testing and asked for mock objects in "layman's terms", ...

  2. iOS开发之字符串比较

    Object-c中比较两个字符串是否相等时,应该用isEqualToString:而不能仅仅只是比较字符串的指针值. NSString *str1=@"hello 1";  NSS ...

  3. codeforces559A--Gerald's Hexagon(计算几何)

    A. Gerald's Hexagon time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. 利用Python,四步掌握机器学习

    为了理解和应用机器学习技术,你需要学习 Python 或者 R.这两者都是与 C.Java.PHP 相类似的编程语言.但是,因为 Python 与 R 都比较年轻,而且更加“远离”CPU,所以它们显得 ...

  5. 【Hadoop】HDFS冗余数据块的自动删除

    HDFS冗余数据块的自动删除 在日常维护hadoop集群的过程中发现这样一种情况: 某个节点由于网络故障或者DataNode进程死亡,被NameNode判定为死亡, HDFS马上自动开始数据块的容错拷 ...

  6. 面试——谈谈对JAVA的理解

    谈谈你对Java平台的理解.答:Java首先是一种面向对象的语言,语言特性有封装,继承,多态,泛型,Lamda表达式等; 第二个特性:支持跨平台,一次书写导出运行(write once,run any ...

  7. Sql中常用的创建表 约束 主外键 增删改查的语句

    创建数据库 USE master; GO --日记数据库 create database DiaryBase on ( name=DiaryBase_Dat,--逻辑名称 FILENAME='c:\D ...

  8. 为什么返回的数据前面有callback? ashx/json.ashx?的后面加 callback=? 起什么作用 js url?callback=xxx xxx的介绍 ajax 跨域请求时url参数添加callback=?会实现跨域问题

    为什么返回的数据前面有callback?   这是一个同学出现的问题,问到了我. 应该是这样的: 但问题是这样的: 我看了所请求的格式和后台要求的也是相同的.而且我也是这种做法,为什么他的就不行呢? ...

  9. 转 WCF WebService区别

    下面我们来详细讨论一下二者的区别.Web Service和WCF的到底有什么区别. [1]Web Service:严格来说是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架 ...

  10. POJ1122_FDNY to the Rescue!(逆向建图+最短路树)

    FDNY to the Rescue! Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2368   Accepted: 72 ...