`
crazier9527
  • 浏览: 1014340 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL Replication 基本原理

阅读更多

1、复制进程
Mysql的复制(Replication)是一个异步的复制,从一个Mysql instace(称之为Master)复制到另一个Mysql instance(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(Sql进程和IO进程),另外一个进程在 Master(IO进程)上。
要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。
复制的基本过程如下:
1)、Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2)、Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;
3)、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;
4)、Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
实际上在老版本的Mysql的复制实现在Slave端并不是两个进程完成的,而是由一个进程完成。但是后来发现这样做存在较大的风险和性能问题,主要如下:
首先,一个进程就使复制bin-log日志和解析日志并在自身执行的过程成为一个串行的过程,性能受到了一定的限制,异步复制的延迟也会比较长。
另外,Slave端从Master端获取bin-log过来之后,需要接着解析日志内容,然后在自身执行。在这个过程中,Master端可能又产生了大量变化并声称了大量的日志。如果在这个阶段Master端的存储出现了无法修复的错误,那么在这个阶段所产生的所有变更都将永远无法找回。如果在Slave 端的压力比较大的时候,这个过程的时间可能会比较长。
所以,后面版本的Mysql为了解决这个风险并提高复制的性能,将Slave端的复制改为两个进程来完成。提出这个改进方案的人是Yahoo!的一位工程师“Jeremy Zawodny”。这样既解决了性能问题,又缩短了异步的延时时间,同时也减少了可能存在的数据丢失量。当然,即使是换成了现在这样两个线程处理以后,同样也还是存在slave数据延时以及数据丢失的可能性的,毕竟这个复制是异步的。只要数据的更改不是在一个事物中,这些问题都是会存在的。如果要完全避免这些问题,就只能用mysql的cluster来解决了。不过mysql的cluster是内存数据库的解决方案,需要将所有数据都load到内存中,这样就对内存的要求就非常大了,对于一般的应用来说可实施性不是太大。
2、复制实现级别
Mysql的复制可以是基于一条语句(Statement level),也可以是基于一条记录(Row level),可以在Mysql的配置参数中设定这个复制级别,不同复制级别的设置会影响到Master端的bin-log记录成不同的形式。
Row Level:日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改。
优点:在row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以row level的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或function,以及 trigger的调用和触发无法被正确复制的问题。
缺点:row level下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如有这样一条update语句:update product set owner_member_id = ‘b’ where owner_member_id = ‘a’,执行之后,日志中记录的不是这条update语句所对应额事件(mysql以事件的形式来记录bin-log日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件。自然,bin-log日志的量就会很大。尤其是当执行alter table之类的语句的时候,产生的日志量是惊人的。因为Mysql对于alter table之类的表结构变更语句的处理方式是整个表的每一条记录都需要变动,实际上就是重建了整个表。那么该表的每一条记录都会被记录到日志中。
Statement Level:每一条会修改数据的sql都会记录到 master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。
优点:statement level下的优点首先就是解决了row level下的缺点,不需要记录每一行数据的变化,减少bin-log日志量,节约IO,提高性能。因为他只需要记录在Master上所执行的语句的细节,以及执行语句时候的上下文的信息。
缺点:由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。另外就是,由于Mysql现在发展比较快,很多的新功能不断的加入,使mysql得复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在statement level下,目前已经发现的就有不少情况会造成mysql的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比如:sleep()函数在有些版本中就不能真确复制,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到不一致的id等等。由于row level是基于每一行来记录的变化,所以不会出现类似的问题。
从官方文档中看到,之前的Mysql一直都只有基于statement的复制模式,直到5.1.5版本的Mysql才开始支持row level的复制。从5.0开始,Mysql的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给Mysql的复制又带来了更大的新挑战。另外,看到官方文档说,从5.1.8版本开始,Mysql提供了除Statement Level和Row Level之外的第三种复制模式:Mixed,实际上就是前两种模式的结合。在Mixed模式下,Mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。新版本中的Statment level还是和以前一样,仅仅记录执行的语句。而新版本的Mysql中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
3、复制常用架构
Mysql复制环境90%以上都是一个Master带一个或者多个Slave的架构模式,主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因为只要master和slave的压力不是太大(尤其是slave端压力)的话,异步复制的延时一般都很少很少。尤其是自slave端的复制方式改成两个进程处理之后,更是减小了slave端的延时。而带来的效益是,对于数据实时性要求不是特别的敏感度的应用,只需要通过廉价的pc server来扩展slave的数量,将读压力分散到多台slave的机器上面,即可解决数据库端的读压力瓶颈。这在很大程度上解决了目前很多中小型网站的数据库压力瓶颈问题,甚至有些大型网站也在使用类似方案解决数据库瓶颈。
一个Master带多个slave的架构实施非常简单,多个slave和单个slave的实施并没有太大区别。在Master端并不care有多少个 slave连上了master端,只要有slave进程通过了连接认证,向他请求binlog信息,他就会按照连接上来的io进程的要求,读取自己的 binlog信息,返回给slave的IO进程。对于slave的配置细节,在Mysql的官方文档上面已经说的很清楚了,甚至介绍了多种实现slave 的配置方法。
Mysql不支持一个Slave instance从属于多个Master的架构。就是说,一个slave instance只能接受一个master的同步源,听说有patch可以改进这样的功能,但没有实践过。Mysql AB之所以不实现这样的功能,主要是考虑到冲突解决的问题。
Mysql也可以搭建成dual master模式,也就是说两个Mysql instance互为对方的Master,也同时为对方的Slave。不过一般这种架构也是只有一端提供服务,避免冲突问题。因为即使在两边执行的修改有先后顺序,由于复制的异步实现机制,同样会导致即使在晚做的修改也可能会被早做的修改所覆盖,就像如下情形:
时间点   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两边的数据也出现了不一致的情况。除非能将写操作根据某种条件固定分开在A和B两端,保证不会交叉写入,才能够避免上面的问题。

分享到:
评论

相关推荐

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

    在深入探讨如何通过MySQL Replication实现库名修改与单个表的复制之前,我们先来了解MySQL Replication的基本概念及其工作原理。MySQL Replication是一种数据复制机制,它允许从一台服务器(主服务器)向另一台或多...

    MySQL Group Replication 组复制原理

    本文将详细介绍MySQL Group Replication的基本原理及其相关机制和服务。 #### 二、常见复制技术架构对比 ##### 1、传统异步复制 在传统异步复制中,主库在完成事务处理并将相关信息写入binlog后,无论从库是否成功...

    藏经阁-MySQL Replication Latest Developments.pdf

    下面将深入探讨MySQL复制的基本概念、工作原理以及可能的新发展。 MySQL复制主要基于异步模式,这意味着主服务器(Master)上的更改不会立即传播到从服务器(Slave),而是通过二进制日志(Binary Log)记录并随后...

    MySQL 8数据库原理与应用徐丽霞微课版实训代码

    学习者将了解到主从复制的工作原理,以及如何设置和管理复制链路,以及MySQL Group Replication等高级复制技术。 总的来说,这个实训涵盖了MySQL 8数据库从基础到进阶的各个方面,通过实际操作和案例分析,旨在帮助...

    MySQL Replication 主从复制全方位解决方案

    通过本文的介绍,我们了解了MySQL主从复制的基本原理、二进制日志的管理以及主从复制的典型应用场景。掌握这些知识可以帮助我们在实际工作中更加高效地利用MySQL的主从复制特性,构建出更加健壮、可靠且具有高扩展性...

    linux运维学习笔记:MySQL主从复制原理和实战.pdf

    MySQL主从复制的基本原理涉及到二进制日志(binlog)和中继日志(relay log)。二进制日志记录了数据库的所有更改,包括表的创建、更改和删除等。当数据库发生变化时,主服务器会将这些更改记录到二进制日志中。从...

    04-MySQL复制replication1

    复制的基本原理包括以下几个步骤: 1. 主节点执行数据修改操作后,这些变更被记录到二进制日志(Binary Log)中,形成一系列的二进制日志事件。 2. 从节点通过网络连接定期或实时地复制主节点的二进制日志,并将其...

    MySQL主从复制原理 _ 异步复制 _ 半同步复制 _ GTID复制.pdf

    下面将详细阐述主从复制的基本原理、异步复制的特点以及半同步复制和GTID复制的概念。 ### 一、主从复制简述 主从复制的基本架构包括单向、双向、级联、一主多从和多主一从等模式。当主服务器接收到写操作请求并...

    mysql mha搭建以及故障切换.

    - 实现对MySQL Replication的管理和监控。 - 定期检查Master的状态,一旦Master出现故障,则触发自动故障转移过程。 - 选择一个新的Master节点,确保服务的连续性。 #### 二、MHA工作原理 MHA的工作原理主要...

    运维上海2017-从理论到实践,深度解析MySQL Group Replication -徐春阳1

    **Group Replication的基本原理** 1. **多节点并发执行事务** Group Replication允许集群内的多个节点同时执行事务,而Paxos协议负责确保这些事务在每个节点上以相同的顺序被应用。这提升了系统的并发性能,但同时...

    Mysql主从数据库分离原理及配置方法资料整理

    以上就是MySQL主从数据库分离的基本原理和配置方法。实际操作中,还需要根据具体业务场景和需求进行优化,例如采用多从库、半同步复制、GTID(全局事务标识符)等方式来提高系统的稳定性和性能。通过不断学习和实践...

    MySQL大佬姜承尧49完整课程笔记,进阶涨薪必看,内含MySQL配置文件

    - SQL语言:掌握SQL的基本操作,如SELECT、INSERT、UPDATE、DELETE等。 2. **性能优化** - 查询优化:了解如何编写高效的SQL查询,避免全表扫描,使用索引提高查询速度。 - 索引原理:深入理解B树、B+树等索引...

    分析MySQL复制以及调优原理和方法

    首先,MySQL复制的基本原理是通过主从架构实现数据的实时同步。主机(Master)负责接收并处理用户的写请求,将更改记录在二进制日志(Binary Log)中,然后通知从机(Slave)进行数据同步。从机接收到同步信息后,将...

    MySQLreplicate容灾方案.docx

    - **文档范围**:涵盖MySQL Replicate的基本原理、架构、安装配置、测试和优化等方面。 - **读者对象**:面向具有MySQL管理经验的IT专业人员,尤其是DBA和系统架构师。 - **作业内容和范围**:涉及MySQL服务器的...

    狂神MySQL笔记.rar

    笔记首先会介绍MySQL的基础概念,包括数据库和表的创建、数据类型的选择、SQL语言的基本语法,如SELECT、INSERT、UPDATE和DELETE语句,以及如何进行简单的查询操作。这部分内容对于初学者来说至关重要,能够帮助读者...

    MySQL管理基础.pptx#资源达人分享计划#

    MySQL复制的基本原理是主服务器上的所有改变(通过binlog记录)被复制到从服务器并执行。复制可以是异步的,允许从服务器有一定的延迟。复制过程可以通过`binlog-format`参数设置为Statement、Row或Mixed模式。`...

    MySQL Clone Plugin备份同步原理与实践.pptx

    - **添加slave/member到集群**:相比传统的PXC(Percona XtraDB Cluster)或MGR(MySQL Group Replication)节点加入流程,Clone Plugin大大简化了新节点的加入过程,只需执行一条SQL命令即可完成数据同步。...

    Mysql参考手册5.7中文版pdf

    1. **MySQL基础知识**:手册介绍了MySQL的基本概念,如SQL语言、数据类型、表结构、索引和视图等。SQL语言是用于与数据库交互的语言,包括SELECT查询、INSERT插入、UPDATE更新和DELETE删除等操作。 2. **存储引擎**...

    MySQL5.1性能调优与架构设计.mobi

    ●基础篇介绍了MySQL软件的基础知识、架构组成、存储引擎、安全管理及基本的备份恢复知识 ●性能优化篇从影响MySQL数据库应用系统性能的因素开始,针对性地对各个影响因素进行调优分析。如MySQL Schema设计的技巧,...

Global site tag (gtag.js) - Google Analytics