`
wb284551926
  • 浏览: 550492 次
文章分类
社区版块
存档分类
最新评论

MySQL Replication 常用架构(转载)

阅读更多

前言

MySQLReplicaion本身是一个比较简单的架构,就是一台MySQL服务器(Slave)从另一台MySQL服务器(Master)进行 日志的复制然后再解析日志并应用到自身。一个复制环境仅仅只需要两台运行有MySQLServer的主机即可,甚至更为简单的时候我们可以在同一台物理服 务器主机上面启动两个mysqldinstance,一个作为Master而另一个作为Slave来完成复制环境的搭建。但是在实际应用环境中,我们可以 根据实际的业务需求利用MySQLReplication的功能自己定制搭建出其他多种更利于ScaleOut的复制架构。如DualMaster架构, 级联复制架构等。下面我们针对比较典型的三种复制架构进行一些相应的分析介绍。

 

常规复制架构  Master - Slaves

在实际应用场景中,MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式,主要用于读压力比较大的应用的数据库端 廉价扩展解决方案。因为只要Master和Slave的压力不是太大(尤其是Slave端压力)的话,异步复制的延时一般都很少很少。尤其是自从 Slave端的复制方式改成两个线程处理之后,更是减小了Slave端的延时问题。而带来的效益是,对于数据实时性要求不是特别Critical的应用, 只需要通过廉价的pcserver来扩展Slave的数量,将读压力分散到多台Slave的机器上面,即可通过分散单台数据库服务器的读压力来解决数据库 端的读性能瓶颈,毕竟在大多数数据库应用系统中的读压力还是要比写压力大很多。这在很大程度上解决了目前很多中小型网站的数据库压力瓶颈问题,甚至有些大 型网站也在使用类似方案解决数据库瓶颈。

这个架构可以通过下图比较清晰的展示:

clip_image006

一个Master复制多个Slave的架构实施非常简单,多个Slave和单个Slave的实施并没有实质性的区别。在Master端并不Care 有多少个Slave连上了自己,只要有Slave的IO线程通过了连接认证,向他请求指定位置之后的BinaryLog信息,他就会按照该IO线程的要 求,读取自己的BinaryLog信息,返回给Slave的IO线程。

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

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

对于Replication的配置细节,在MySQL的官方文档上面已经说的非常清楚了,甚至介绍了多种实现Slave的配置方式,在下一节中我们也会通过一个具体的示例来演示搭建一个Replication环境的详细过程以及注意事项。

 

dualMaster复制架构 Master - Master 

有些时候,简单的从一个MySQL复制到另外一个MySQL的基本Replication架构,可能还会需要在一些特定的场景下进行Master的 切换。如在Master端需要进行一些特别的维护操作的时候,可能需要停MySQL的服务。这时候,为了尽可能减少应用系统写服务的停机时间,最佳的做法 就是将我们的Slave节点切换成Master来提供写入的服务。

但是这样一来,我们原来Master节点的数据就会和实际的数据不一致了。当原Master启动可以正常提供服务的时候,由于数据的不一致,我们就 不得不通过反转原Master-Slave关系,重新搭建Replication环境,并以原Master作为Slave来对外提供读的服务。重新搭建 Replication环境会给我们带来很多额外的工作量,如果没有合适的备份,可能还会让Replication的搭建过程非常麻烦。

为了解决这个问题,我们可以通过搭建DualMaster环境来避免很多的问题。何谓DualMaster环境?实际上就是两个 MySQLServer互相将对方作为自己的Master,自己作为对方的Slave来进行复制。这样,任何一方所做的变更,都会通过复制应用到另外一方 的数据库中。

可能有些读者朋友会有一个担心,这样搭建复制环境之后,难道不会造成两台MySQL之间的循环复制么?实际上MySQL自己早就想到了这一点,所以 在MySQL的BinaryLog中记录了当前MySQL的server-id,而且这个参数也是我们搭建MySQLReplication的时候必须明 确指定,而且Master和Slave的server-id参数值比需要不一致才能使MySQLReplication搭建成功。一旦有了server- id的值之后,MySQL就很容易判断某个变更是从哪一个MySQLServer最初产生的,所以就很容易避免出现循环复制的情况。而且,如果我们不打开 记录Slave的BinaryLog的选项(--log-slave-update)的时候,MySQL根本就不会记录复制过程中的变更到 BinaryLog中,就更不用担心可能会出现循环复制的情形了。

下如将更清晰的展示DualMaster复制架构组成:

clip_image012

通过DualMaster复制架构,我们不仅能够避免因为正常的常规维护操作需要的停机所带来的重新搭建Replication环境的操作,因为我 们任何一端都记录了自己当前复制到对方的什么位置了,当系统起来之后,就会自动开始从之前的位置重新开始复制,而不需要人为去进行任何干预,大大节省了维 护成本。

不仅仅如此,DualMaster复制架构和一些第三方的HA管理软件结合,还可以在我们当前正在使用的Master出现异常无法提供服务之后,非常迅速的自动切换另外一端来提供相应的服务,减少异常情况下带来的停机时间,并且完全不需要人工干预。

当然,我们搭建成一个DualMaster环境,并不是为了让两端都提供写的服务。在正常情况下,我们都只会将其中一端开启写服务,另外一端仅仅只 是提供读服务,或者完全不提供任何服务,仅仅只是作为一个备用的机器存在。为什么我们一般都只开启其中的一端来提供写服务呢?主要还是为了避免数据的冲 突,防止造成数据的不一致性。因为即使在两边执行的修改有先后顺序,但由于Replication是异步的实现机制,同样会导致即使晚做的修改也可能会被 早做的修改所覆盖,就像如下情形:

时间点MySQL A MySQL B

1 更新x表y记录为10

2 更新x表y记录为20

3获取到A日志并应用,更新x表的y记录为10(不符合期望)

4获取B日志更新x表y记录为20(符合期望)

这中情形下,不仅在B库上面的数据不是用户所期望的结果,A和B两边的数据也出现了不一致。

当然,我们也可以通过特殊的约定,让某些表的写操作全部在一端,而另外一些表的写操作全部在另外一端,保证两端不会操作相同的表,这样就能避免上面问题的发生了。

 

级联复制架构 Master –Slaves - Slaves

在有些应用场景中,可能读写压力差别比较大,读压力特别的大,一个Master可能需要上10台甚至更多的Slave才能够支撑注读的压力。这时 候,Master就会比较吃力了,因为仅仅连上来的SlaveIO线程就比较多了,这样写的压力稍微大一点的时候,Master端因为复制就会消耗较多的 资源,很容易造成复制的延时。

遇到这种情况如何解决呢?这时候我们就可以利用MySQL可以在Slave端记录复制所产生变更的BinaryLog信息的功能,也就是打开— log-slave-update选项。然后,通过二级(或者是更多级别)复制来减少Master端因为复制所带来的压力。也就是说,我们首先通过少数几 台MySQL从Master来进行复制,这几台机器我们姑且称之为第一级Slave集群,然后其他的Slave再从第一级Slave集群来进行复制。从第 一级Slave进行复制的Slave,我称之为第二级Slave集群。如果有需要,我们可以继续往下增加更多层次的复制。这样,我们很容易就控制了每一台 MySQL上面所附属Slave的数量。这种架构我称之为Master-Slaves-Slaves架构

这种多层级联复制的架构,很容易就解决了Master端因为附属Slave太多而成为瓶颈的风险。下图展示了多层级联复制的Replication架构。

clip_image018

当然,如果条件允许,我更倾向于建议大家通过拆分成多个Replication集群来解决

上述瓶颈问题。毕竟Slave并没有减少写的量,所有Slave实际上仍然还是应用了所有的数据变更操作,没有减少任何写IO。相反,Slave越多,整个集群的写IO总量也就会越多,我们没有非常明显的感觉,仅仅只是因为分散到了多台机器上面,所以不是很容易表现出来。

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

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

 

 

dualMaster与级联复制结合架构(Master-Master-Slaves)

级联复制在一定程度上面确实解决了Master因为所附属的Slave过多而成为瓶颈的问题,但是他并不能解决人工维护和出现异常需要切换后可能存 在重新搭建Replication的问题。这样就很自然的引申出了DualMaster与级联复制结合的Replication架构,我称之为 Master-Master-Slaves架构

和Master-Slaves-Slaves架构相比,区别仅仅只是将第一级Slave集群换成了一台单独的Master,作为备用Master,然后再从这个备用的Master进行复制到一个Slave集群。下面的图片更清晰的展示了这个架构的组成:

clip_image022

这种DualMaster与级联复制结合的架构,最大的好处就是既可以避免主Master的写入操作不会受到Slave集群的复制所带来的影响,同 时主Master需要切换的时候也基本上不会出现重搭Replication的情况。但是,这个架构也有一个弊端,那就是备用的Master有可能成为瓶 颈,因为如果后面的Slave集群比较大的话,备用Master可能会因为过多的SlaveIO线程请求而成为瓶颈。当然,该备用Master不提供任何 的读服务的时候,瓶颈出现的可能性并不是特别高,如果出现瓶颈,也可以在备用Master后面再次进行级联复制,架设多层Slave集群。当然,级联复制 的级别越多,Slave集群可能出现的数据延时也会更为明显,所以考虑使用多层级联复制之前,也需要评估数据延时对应用系统的影响。

 

转自 《MySQL性能调优与架构》

 

原文地址:http://www.cnblogs.com/ggjucheng/archive/2012/11/13/2768879.html

分享到:
评论

相关推荐

    mysql replication搭建.docx

    ### MySQL Replication 架构与实现 #### 一、MySQL Replication 概念与优势 MySQL Replication 是一种数据复制机制,它允许将一个MySQL服务器(主服务器或Master)的数据异步复制到一个或多个其他MySQL服务器(从...

    MySql Replication Tutorial

    MySql Replication Tutorial,关于MySql Replication 的 PPT

    完整精品数据库课件 MySQL从入门到精通 第18章 MySQL Replication(共27页).ppt

    MySQL Replication是MySQL数据库系统中的一个重要特性,它允许数据从一个主服务器(master)自动同步到一个或多个从服务器(slaves)。这种技术主要用于数据备份、负载均衡和高可用性设置,确保即使在主服务器出现...

    利用JDBC和MySQL Replication实现数据库集群

    针对这一情况,提出在现有硬件的基础上利用JDBC规范与MySQL Replication实现数据库集群从而解决数据访问瓶颈。其主要方法是在进行JDBC连接之前实现负载均衡,所有SQL请求由负载均衡器进行统一调度。在数据库端利用...

    MySQL Replication一主多从环境搭建.docx

    MySQL Replication是一种数据库复制技术,允许数据从一个MySQL服务器(主服务器)实时同步到其他一个或多个MySQL服务器(从服务器)。这种技术对于实现高可用性、负载均衡和数据备份至关重要。以下是对一主多从环境...

    深入理解MySQL Group Replication.pdf

    深入理解MySQL Group Replication MySQL Group Replication是一种高可用性和高性能的解决方案,旨在提供数据库的高可用性和高性能。它是MySQL数据库的一部分,旨在提供高可用性和高性能的解决方案。 背景: 数据库...

    MySQL Group Replication 详细搭建部署过程

    MySQL Group Replication 详细搭建部署过程 MySQL Group Replication 是一种基于组的复制技术,用于容错系统中。它由多个服务器(节点)组成,每个节点都可以独立执行事务,而读写事务则会在于 group 内的其他节点...

    mysql replication修改库名及复制单个表

    1. **主从架构**:MySQL Replication基于主从架构,其中主服务器负责接收写入请求,而从服务器则负责读取主服务器的二进制日志(Binlog)并重放这些日志,从而保持与主服务器的数据一致性。 2. **二进制日志(Binlog...

    第18章 MySQL Replication PPT

    MySQL复制(Replication)是MySQL数据库系统中一种强大的功能,它允许数据从一个服务器(主服务器)异步地复制到一个或多个其他服务器(从服务器)。这种架构为高可用性、负载均衡和数据备份提供了基础。 在MySQL ...

    Ubuntu上MySQL的Replication配置

    胖子摸索出来的,Ubuntu上MySQL的Replication配置,的简单记录步骤

    mysql-replication配置文档

    在MySQL中,复制主要分为单向异步复制和双向复制,其中异步复制是默认和最常用的方式。本篇文章将详细介绍如何配置MySQL的单向异步复制,以及如何进行主从库切换和验证。 首先,确保MySQL服务器支持并启用了二进制...

    深入理解MySQL Group Replication

    ### 深入理解MySQL Group Replication #### 背景与定义 MySQL Group Replication是一种高可用性和可扩展性的解决方案,它通过在多个MySQL服务器之间自动同步数据来确保数据的一致性和可用性。该技术自MySQL 5.7.17...

    基于MySQL Replication的数据库集群解决方案.pdf

    MySQL NDB Cluster是一种无共享架构的内存数据库集群,所有节点完全对等,透明度高,但安装成本较高,不支持某些特性(如全文搜索),且实现和维护较为复杂。 相比之下,MySQL Replication更适用于大多数用户。它将...

    mysql-replication mysql数据库主从复制步骤

    MySQL主从复制是一种常用的数据冗余机制,能够实现数据的实时备份,并在主服务器出现故障时快速切换到从服务器,保证业务的连续性。接下来将详细介绍主从复制的具体配置及实施步骤。 ### MySQL数据库主从复制概述 ...

    MySQL高可用架构演进

    MySQL高可用架构演进是数据库领域中的一个重要话题,尤其是在企业级应用中,数据的稳定性、一致性和可访问性是至关重要的。MySQL作为广泛使用的开源关系型数据库管理系统,其高可用性设计是确保业务连续性和数据安全...

    python-mysql-replication, 在PyMYSQL之上,MySQL复制协议构建的纯 python 实现.zip

    python-mysql-replication, 在PyMYSQL之上,MySQL复制协议构建的纯 python 实现 python-mysql-replication MySQL复制协议在PyMYSQL之上的纯 python 实现。 这允许你接收诸如插入。更新。delete 和它们的数据和原始...

Global site tag (gtag.js) - Google Analytics