精华内容
下载资源
问答
  • mysql主从复制的原理

    2019-05-14 19:49:53
    mysql主从复制的原理 MySQL主从复制集群至少需要2台数据库服务器,其中一台为 master库,另外一台为slave库, MySQL主从数据同步是一个异步复制的过程,要实现复制首先需要在 master上开启 bin-log日志功能, bin-log日志...

    mysql主从复制的原理

    MySQL主从复制集群至少需要2台数据库服务器,其中一台为 master库,另外一台为slave库, MySQL主从数据同步是一个异步复制的过程,要实现复制首先需要在 master上开启 bin-log日志功能, bin-log日志用于记录在 master库中执行的增、删、修改、更新操作的SQL语句,整个过程需要开启3个线程,分别是 master开启1/0线程, slave开启I/O线程和SQL线程,具体主从同步原理详解如下
    1、slave上执行 slave start, slave I/O线程会通过在 master创建的授权用户连接上至master,
    并请求 master从指定的文件和位置之后发送 bin-log日志内容
    2、master接收到来自 slave I/O线程的请求后, master I/O线程根据slave发送的指定bin-log日志 position点之后的内容,然后返回给slave的1/O线程
    3、返回的信息中除了 bin-log日志内容外,还有 master最新的 bin-log文件名以及在bin-log中的下一个指定更新 position点;
    4、slave I/O线程接收到信息后,将接收到的日志内容依次添加到slave端的 relay-log
    文件的最末端,并将读取到的 master端的 bin-log的文件名和 posion点记录master.info文件中,以便在下一次读取的时候能告知 master从相应的bin-log文件名及最后一个 position点开始发起请求
    5、slave SQL线程检测到 relay-log中内容有更新,会立刻解析relay-log日志中的内容,
    将解析后的SQL语句在slave里执行,执行成功后slave库与master数保持一致

    展开全文
  • MySQL主从复制的原理

    2019-10-11 21:42:18
    MySQL主从复制涉及到三个线程,一个运行在主节点,其余两个运行在从节点,如图: 主节点 log dump 线程: 当从节点连接主节点时,主节点会创建一个log dump线程,用于发送bin-log内容。 在读取bin-log中操作时...

    MySQL主从复制涉及到三个线程,一个运行在主节点,其余两个运行在从节点,如图:
    在这里插入图片描述
    主节点 log dump 线程:
    当从节点连接主节点时,主节点会创建一个log dump线程,用于发送bin-log的内容。
    在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。

    从节点 I/O线程:
    当从节点上执行‘ start slave ’ 命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点bin-log dump线程发来的更新之后,保存在本地relay-log中。

    从节点 SQL线程:
    SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。

    对于每一个主从连接,都需要三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点吉建一个binary log dump 进程,而每个从节点都有自己的I/O线程,SQL线程。从节点用两个进程将从主库拉取更新和执行分成独立的任务,这样在执行同步数据任务的时候,不会降低读操作的性能。
    比如,如果从节点没有运行,此时I/O进程可以很快从主节点获取更新,尽管SQL进程还没有执行。如果在SQL进程执行之前,从节点服务停止,至少I/O进程已经从主节点拉取到了最新的变更并且保存在本地relay日志中,当服务再次起来之后,就可以完成数据的同步。

    要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。

    因为整个复制过程实际上就是Slave 从Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。如下图所示:
    在这里插入图片描述
    MySQL 主从复制模式
    MySQL 主从复制默认是异步的模式。MySQL增删改操作会全部记录在binary log中,当slave节点连接master时,会主动从master处获取最新的bin log文件。并把bin log中的sql relay。

    展开全文
  • MySQL主从复制的原理 MySQL复制技术介绍 主从复制是MySQL数据库的一种容灾备份方案;是mysql自带的功能,无需借助第三方工具,MySQL的主从复制并不是数据库磁盘上的文件直接拷贝,而是通过逻辑的binlog日志复制到要...

    MySQL主从复制的原理

    MySQL复制技术介绍

    主从复制是MySQL数据库的一种容灾备份方案;是mysql自带的功能,无需借助第三方工具,MySQL的主从复制并不是数据库磁盘上的文件直接拷贝,而是通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的SQL语句重新应用到mysql数据库中。

    MySQL主从复制的应用场景

    应用场景

        数据备份与容灾、读写分离、业务拆分

    使用公司

        适合于初创公司,小型电商/互联网公司,一些小型云环境

    切换技术

        手工切换,时间:>30分钟(含重做主从关系,数据校验等)

        自动切换,时间:按分钟计算

    MySQL主从复制是如何工作的?

    复制一共分3个步骤

    01 master将改变记录到二进制日志 (binary log)中

    (这些记录叫做二进制日志事件, binary log events)

    02 slave将 master的 binary log events拷贝到它的中继日志(relay log);

    03 slave重做中继日志中的事件,将日志操作还原并生成数据。

    01 master记录二进制日志。在每个事务更新数据完成之前, master在二日志记录这些改变。 MySQL将事务串行的写入二进制日志,在事件写入二进制日志完成后,master通知存储引擎提交事务。

    02 slave将 master的 binary log拷贝到它自己的中继日志。

    首先, slave开始一个工作线程:I/O线程。

    I/O线程在 master上打开一个普通的连接,然后开始 binlog dump process

    Binlog dump process 从master的二进制日志中读取事件接受的单位是(event),如果已经跟上 master,它会睡眠并等待 master产生新的事件。

    I/O 线程将这些事件写入中继日志。

    03. SQL slave thread(SQL从线程)是处理该过程的最后一步。

    SQL线程从中继日志读取事件,并重放其中的事件(回放的单位也是 event)而更新slave的数据,使其与 master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

    在master中也有一个工作线程:和其它MySQL的连接样,slave 在 master中打开一个连接也会使得 master开始一个线程。

    MySQL主从复制的常用拓扑结构

        mysql 数据库支持单向、双向、链式级联、环状等不同业务场景的复制。在复制过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(Slave),接收来自主服务器 binlog文件的日志内容,解析出SQL重新更新到从服务器,使得主从服务器数据达到一致。

    ebb58294-8652-405b-b97a-26dcde47d6bd

    不推荐的方式

    4b2a8931-25df-4d03-99e5-55e387dd111e

    MySQL主从复制技术之同步方式

    e9c07a04-11c9-4ed5-895b-c7d45dba4405

     

    MySQL有四种同步方式

    异步复制(asynchronous)

      搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非常好,可谓非常成熟。但是这种架构数据是异步的,所以有丢失数据库的风险。

    全同步复制(fully synchronous)

      保证数据安全,不丢数据,损失性能。

    传统半同步复制( Semi synchronous)

      性能,功能都介于异步和全同步中间。从mysq5.5开始诞生,目的是为了折中上述两种架构的性能以及优缺点。

    无损复制,增强版的半同步复制( lossless replication)

      数据零丢失,性能好,mysq5.7诞生

    MySQL主从复制技术之GTID特性

    什么是GTID?

    GTID( Global Transaction Identifiers):对于一个已提交事务的编号,事务的唯一编号,并且是一个全局唯一的编号。GTID和事务会记录到 binlog中,用来标识事务。

    GTD是用来替代以前传统复制方法( binlog+ position),MySQL5.6.2开始支持GTD。

    MySQL支持GTID后,一个事务在集群中就不再孤单,在每一个节点中,如果存在具相同标识符的情况,可以避免同一个事务,在同一个节点中出现多次的情况。

    GTID的出现,最直接的效果就是,每一个事务在集群中具有了唯一性的意义,相对于行复制来讲数据安全性更高,故障切换更简单。

    MySQL主从复制技术之 GTID-GTID组成

    GTID 是由 server_uuid:Sequence_Number。

    Server_Uuid:是一个MySQL实例的全局唯一标识;存放为在 $datadir/auto.cnf

    Sequence_Number:是 MySQL内部的一个事务的编号,一个 MySQL实例不会重复的序列号(保证服务器内唯一),也表示在该实例上已经提交事务的数量,并且随着事务提交而递增。

    根据GTID可以知道事务最初是在哪个实例上提交的,方便故障排查和切换

    cat /mysql/data/3306/data/auto.cnf
    [auto]
    server-uuid=1599dcea-5a7b-11e8-94bd-000c292834b0
    
    
    展开全文
  • 深入了解MySQL主从复制的原理 原创SHSH的全栈笔记1月12日 收录于话题 #MySQL 2个 欢迎微信关注「SH的全栈笔记」 0. 主从复制 首先主从复制是什么?简单来说是让一台MySQL服务器去复制另一台MySQL的数据,使...

    深入了解MySQL主从复制的原理

    原创 SH SH的全栈笔记 1月12日

    收录于话题

    #MySQL

    2个

    欢迎微信关注「SH的全栈笔记

    0. 主从复制

    首先主从复制是什么?简单来说是让一台MySQL服务器去复制另一台MySQL的数据,使两个服务器的数据保持一致。

    这种方式与Redis的主从复制的思路没有太大的出入。如果你对Redis的主从复制感兴趣可以去看看《Redis的主从复制》。那既然Redis和MySQL都采用了复制这种方式,主从复制所带来的意义是什么呢?

    通过复制功能,构建一个或者多个从库,可以提高数据库的高可用性可扩展性,同时实现负载均衡。当主库发生故障时,可以快速的切到其某一个从库,并将该从库提升为主库,因为数据都一样,所以不会影响系统的运行;当MySQL服务器需要扛住更多的读请求时,可以把读请求的流量分流到各个从库上去,写请求则转发给主库,形成读写分离的架构,来提供更好的读扩展和请求的负载均衡。

    读写分离的架构应用的其实非常广泛,就比如MySQL,还有Redis,以及我们熟悉的Zookeeper,Zookeeper的Follower收到读请求不会自己处理,而是会将读请求转发给Leader,感兴趣的可以自己下来了解一下,这里就不偏题了。

    1. 复制原理

    MySQL的主从复制支持两种方式:

    • 基于

    • 基于语句

    基于语句的复制在MySQL3.23中就已经有了,而基于行的方式则在5.1中才实现。其本质都是基于主库的binlog来实现的,主库记录binlog,然后从库将binlog在自己的服务器上重放,从而保证了主、从的数据一致性。

    1.1 binlog

    MySQL中日志分为两个维度,一个是MySQL服务器的,一个是底层存储引擎的。而上文提到的binlog就是属于MySQL服务器的日志,binlog也叫二进制日志,记录了所有对MySQL所做的更改。

    基于行、语句的复制方式跟binlog的存储方式有关系。binlog有三种存储格式,分别是Statement、Row和Mixed。

    • Statement 基于语句,只记录对数据做了修改的SQL语句,能够有效的减少binlog的数据量,提高读取、基于binlog重放的性能

    • Row 只记录被修改的行,所以Row记录的binlog日志量一般来说会比Statement格式要多。基于Row的binlog日志非常完整、清晰,记录了所有数据的变动,但是缺点是可能会非常多,例如一条update语句,有可能是所有的数据都有修改;再例如alter table之类的,修改了某个字段,同样的每条记录都有改动。

    • Mixed Statement和Row的结合,怎么个结合法呢。例如像update或者alter table之类的语句修改,采用Statement格式。其余的对数据的修改例如updatedelete采用Row格式进行记录。

    为什么会有这么多方式呢?因为Statement只会记录SQL语句,但是并不能保证所有情况下这些语句在从库上能够正确的被重放出来。因为可能顺序不对。

    MySQL什么时候会记录binlog呢?是在事务提交的时候,并不是按照语句的执行顺序来记录,当记录完binlog之后,就会通知底层的存储引擎提交事务,所以有可能因为语句顺序错误导致语句出错。

    1.2 查看binlog

    这里拿MySQL 5.6举例子,binlog默认是处于关闭状态的。我们可以通过命令show variables like '%log_bin%' 来查看关于binlog的配置。

    图片

    默认配置

    log_bin代表是否开启了binlog,其默认值为OFF

    • log_bin 代表是否开启了binlog,其默认值为OFF

    • log_bin_basename binlog存储文件的完整名称,会在默认的文件名后面添加上递增的序号,就例如mysql-bin.000001

    • log_bin_index binlog索引文件名称,例如mysql-bin.index

    • sql_log_bin 在binlog开启的时候,可以禁用当前session的binlog

    你可以在MySQL中通过命令show binary logs查看所有的binlog文件

    图片

    查看binlog

    知道了有哪些文件之后我们可以来看看binlog文件中的内容,可以在MySQL通过show binlog events命令来查看。

    show binglog events 查看第一个binlog文件,我们也可以通过in参数来指定,假设我们想看的文件名是mysql-bin.000001,那么可以使用命令show binlog events in 'mysql-bin.000001'来查看指定的binlog文件

    图片

    查看binlog

    接下来我们来看看我们在MySQL中的操作所对应的binlog内容分别是什么。

    初始化

    我们上面提到过,binlog是由一个一个的event组成的。从MySQL 5.0开始,binlog的第一个event都为Format_desc,位于图中的Event_type那一列。可以看到内容为Server ver;5.6.50-log, Binlog ver: 4,说明当前使用的MySQL版本为5.6.50,Binlog的版本是V4。

    创建数据库

    然后我创建了一个名为student的DB,其Event_type是Query,这个event的内容为CREATE DATABASE student DEFAULT CHARACTER SET = utf8mb4,一个建库语句。

    新建表

    然后我创建了一个名为student的表,Event_type也是Query,内容为use student; CREATE TABLE student (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT),一个建表语句。

    插入数据

    然后我们执行INSERT语句给该表插入两行数据,再次查看binlog。

    INSERT INTO `student` (`id`, `name`) VALUES (NULL, '张三');
    INSERT INTO `student` (`id`, `name`) VALUES (NULL, '李四');
    

    图片

    image-20210106123550397

    可以看到每次INSERT都会开启一个事务,你可能会疑惑,我们只是简单的执行了INSERT语句,没有显示的开启事务。那为什么会有事务产生呢?

    这是因为MySQL采用了自动提交(AUTOCOMMIT)的机制,我使用的InnoDB存储引擎,是支持事务的,所有的用户活动都发生在事务中。我们可以通过show variables like '%AUTOCOMMIT%';命令查看,如果结果是ON则代表是开启的。

    1.3 复制的核心步骤

    我们假设主库已经开启了binlog,并正常的记录binlog。

    首先从库启动I/O线程,跟主库建立客户端连接。

    主库启动binlog dump线程,读取主库上的binlog event发送给从库的I/O线程,I/O线程获取到binlog event之后将其写入到自己的Relay Log中。

    然后从库启动SQL线程,将Relay中的数据进行重放,完成从库的数据更新。

    总结来说,主库上只会有一个线程,而从库上则会有两个线程。

    图片

    主从复制流程

    1.4 Relay Log

    relay log其实和binlog没有太大的区别,在MySQL 4.0 之前是没有Relay Log这部分的,整个过程中只有两个线程。但是这样也带来一个问题,那就是复制的过程需要同步的进行,很容易被影响,而且效率不高。例如主库必须要等待从库读取完了才能发送下一个binlog事件。这就有点类似于一个阻塞的信道和非阻塞的信道。

    图片

    阻塞信道

    阻塞信道就跟你在柜台一样,你要递归柜员一个东西,但是你和柜员之间没有可以放东西的地方,你就只能一直把文件拿着,直到柜员接手;而非阻塞信道就像你们之间有个地方可以放文件,你就直接放上去就好了,不用等柜员接手。

    引入了Relay Log之后,让原本同步的获取事件、重放事件解耦了,两个步骤可以异步的进行,Relay Log充当了缓冲区的作用。Relay Log有一个relay-log.info的文件,用于记录当前复制的进度,下一个事件从什么Pos开始写入,该文件由SQL线程负责更新。

    1.5 Relay Log核心参数

    接下来让我们了解一下Relay Log的核心参数。

    • max_relay_log_size  中继日志的最大size,默认值0,如果为0就会取默认的size 1G,否则就为设置的值

    • relay_log 定义relay的名称,默认为主机名+relay-bin,例如像hostname-relay-bin

    • relay_log_basename 中继日志的全路径,即路径 + 文件名,例如/path/to/hostname-relay-bin,最大长度为256

    • relay_log_index 定义中继日志的索引文件的全路径,同样其最大的长度为256.  其默认值为hostname + relay-bin.index,例如/path/to/hostname-relay-bin.index

    • relay_log_info_file 定义relay-log.info文件的名称

    • relay_log_info_repository 存放relay log重放的数据的方式,可以设置为FILETABLE。FILE代表将中继日志重放的数据记录在relay-info.log中,TABLE则将其存放在slave_relay_log_info这张表里。

    • relay_log_purge 是否自动清空不需要的中继日志,默认值为ON

    • relay_log_recovery 当从库宕机后,如果relay log损坏了导致部分的中继日志没有进行同步,则自动放弃所有未进行重放的中继日志,并从主库重新获取,默认值为OFF

    • relay_log_space_limit 设置中继日志的最大值,防止写满磁盘。但是不建议设置这个值,建议还是给中继日志需要的空间,0就是不限制,0也是默认值

    • sync_relay_log  用于控制中继日志写入磁盘的变量,假设值为n,那么在中继日志每接受n次binlog事件之后就会调用fdatasync()函数将中继日志强制的刷入磁盘;相反,如果值为0,则写入OS的缓冲区内,由OS调度决定何时将中继日志刷入磁盘,这样一来如果在没有刷入之前报错了,那么中继日志就会丢失。默认值是10000,也就是每向中继日志中写入1w次binlog事件就将中继日志强制的刷入磁盘。

    • sync_relay_log_info 该参数的影响跟参数relay_log_info_repository有一定关系,同时也跟是否使用支持事务的存储引擎有关系。该值默认也是10000.

      • relay_log_info_repository为FILE,假设设置的值为N,那么每N次事务都会都会调用fdatasync()强制将relay-log.info刷入磁盘

      • relay_log_info_repository为TABLE,如果使用了支持事务的引擎,则该表每次事务结束都会被更新;如果没有使用事务引擎则会在写入N个binlog事件的时候更新该表。

      • relay_log_info_repository为FILE,MySQL不会调用fdatasync(),而是将刷入磁盘的调度交给OS;

      • relay_log_info_repository为TABLE,如果使用了支持事务的存储引擎,则每次事务的时候该表都会被更新;如果没有使用事务引擎,则永远不会被更新

      • sync_relay_log_info为0时

      • sync_relay_log_info大于0时

    2. 复制模型

    平常的开发中,其实很少说一上来就直接搞主从架构的。费时间、费钱还引入了额外的复杂度,最后发现投入了这么多一个单MySQL服务器就完全能handle。

    这就跟一个产品的架构迭代是一样的,刚刚起步的时候一个单体应用足够了。当你的业务扩展,请求膨胀,单体无法抗住压力了,就会考虑开始部署多实例,开始采用微服务架构去做横向扩展、负载均衡。

    2.1 一主多从

    当然你也可以把它当成一主一从

    这是最简单的模型,特别适合少量写、大量读的情况。读请求被分到了各个从库上,有效的帮主库分散了压力,能够提升读并发。当然,你也可以只是把从库当成一个灾备库,除了主从复制之外,没有其他任何的请求和数据传输。

    甚至你可以把其中一个备库作为你的预发环境的数据库,当然,这说到底还是直接动了生产环境的数据库,是一种过于理想的用途,因为这还涉及到生产环境数据库的数据敏感性。不是所有人都能够接触到的,需要有完善的权限机制。

    图片

    MySQL一主多从

    值得注意的是,如果有n个从库,那么主库上就会有n个binlog dump线程。如果这个n比较大的话在复制的时候可能会造成主库的性能抖动。所以在从库较多的情况下可以采用级联复制。

    2.2 级联复制

    级联复制用大白话说就是套娃

    本来从库B、C、D、E、F、G都是复制的主库A,但是现在由于A的压力比较大,就不这么干了,调整成了如下的模式。

    • B、C复制A

    • D、E复制B

    • F、G复制C

    图片

    MySQL级联复制

    这就叫级联复制,开启疯狂套娃模式。你甚至会觉得这种套娃很眼熟,在Redis主从复制中也可以采用级联模式, slave去复制另一个slave。

    级联复制的好处在于很大程度上减轻了主库的压力,主库只需要关心与其有直接复制关系的从库,剩下的复制则交给从库即可。相反,由于是这种层层嵌套的关系,如果在较上层出现了错误,会影响到挂在该服务器下的所有子库,这些错误的影响效果被放大了。

    2.3 主主复制

    顾名思义,就是两个主库相互复制,客户端可以对任意一台主库进行写操作。任何一台主库服务器上的数据发生了变化都会同步到另一台服务器上去。有点类似于Eureka Server的双节点模式,两个注册中心相互注册。这样一来,任何一台挂了都不会对系统产生影响。

    而且主主复制可以打破数据库性能瓶颈,一个很酷的功能——横向扩展。为什么说很酷呢,如果DB能做到横向扩展,那很多被数据库并发所限制的瓶颈都可以被突破,然而...

    但是主主复制其实并不可靠,两边的数据冲突的可能性很大。例如复制停止了,系统仍然在向两个主库中写入数据,也就是说一部分数据在A,另一部分的数据在B,但是没有相互复制,且数据也不同步了。要修复这部分数据的难度就会变得相当大。

    所以我认为双主的更多的意义在于HA,而不是负载均衡。

    2.4 主、被动的主主复制

    同样还是双主的结构,但是区别在于其中一台是只读的被动服务器,客户端不会向该库进行写操作。

    其用途在哪里呢?例如我们要在不中断服务的前提下对MySQL进行维护、优化,举个例子——修改表结构。假设我们有两个数据库,主库A和被动主库B,注意此处的被动主库是只读的,我们先停止A对B的复制,也就是停掉A上的SQL线程。

    图片

    主主停止复制

    这样一来,我们之后在B上执行的非常耗时、可能需要锁表的操作就不会立即同步到A上来。因为此时A正在对外提供服务,所以不能使其收到影响,但是由于采用的是异步的复制模式,所以Relay Log还是继续由I/O线程写入,只是不去进行重放。

    然后我们在B上执行此次的维护操作,注意,此时A上面发生的更新还是会正常的同步到B来。执行完后交换读写的角色。也就是让A变成只读的被动主库,而B变为主动主库对外提供服务。

    图片

    重新开启SQL线程

    然后重新开启SQL线程,A开始去对之前Relay Log中积累的event进行重放。虽然A此时可能会阻塞住,但是A已经没有对外提供服务了,所以没有问题。

    主、被动下的主主模式的好处大家也就清楚了,可以在不停止服务的情况下去做数据库的结构更新,其次可以在主库发生故障的情况下,快速的切换,保证数据库的HA。

    3. 复制方式

    上文我们不止一次的提到了复制是异步的,接下来我们来了解一下MySQL的主从复制都有哪些方式。

    3.1 异步复制

    首先就是异步,这也是MySQL默认的方式。在异步复制下,主库不会主动的向从库发送消息,而是等待从库的I/O线程建立连接,然后主库创建binlog dump线程,把binlog event发送给I/O线程,流程如下图。

    图片

    MySQL复制模式

    主库在执行完自己的事务、记录完binlog之后就会直接返回,不会与客户端确认任何结果。然后后续由binlog dump线程异步的读取binlog,然后发送给从库。处理请求主从复制是两个完全异步化的过程。

    3.2 同步复制

    同步模式则是,主库执行一个事务,那么主库必须等待所有的从库全部执行完事务返回commit之后才能给客户端返回成功,

    图片

    同步复制

    值得注意的是,主库会直接提交事务,而不是等待所有从库返回之后再提交。MySQL只是延迟了对客户端的返回,并没有延后事务的提交。

    同步模式用脚趾头想知道性能会大打折扣,它把客户端的请求和主从复制耦合在了一起,如果有某个从库复制线程执行的慢,那么对客户端的响应也会慢很多。

    3.3 半同步复制

    半同步相对于同步的区别在于,同步需要等待所有的从库commit,而半同步只需要一个从库commit就可以返回了。如果超过默认的时间仍然没有从库commit,就会切换为异步模式再提交。客户端也不会一直去等待了。

    图片

    MySQL复制模式

    因为即使后面主库宕机了,也能至少保证有一个从库节点是可以用的,此外还减少了同步时的等待时间。

    4. 复制中的数据一致性

    我们在1.3中讨论了复制的核心步骤,看似很简单的一个流程,主库的binlog dump去读取binlog,然后从库的I/O线程去读取、写入Relay Log,进而从库的SQL线程再读取Relay Log进行重放。

    那如果I/O线程复制到一半自己突然挂掉了呢?又或者复制到一半主库宕机了呢?如果和保证数据一致性的呢?

    我们上面提到过,有一个relay-log.info的文件,用于记录当前从库正在复制的binlog和写入的Relay Log的Pos,只要这个文件还在,那么当从库意外重启之后,就会重新读取文件,从上次复制的地方开始继续复制。这就跟Redis中的主从复制类似,双方要维护一个offset,通过对比offset,来进行psync增量数据同步。

    但是在MySQL 5.5以及之前,都只能将复制的进度记录在relog-log.info文件中。换句话说,参数relay_log_info_repository只支持FILE,可以再回到上面的1.5 Relay Log核心参数看一下。所以只有在sync_relay_log_info次事务之后才会把relay-log.info文件刷入磁盘。

    如果在刷入磁盘之前从库挂了,那么重启之后就会发现SQL线程实际执行到位置和数据库记录的不一致,数据一致性的问题就这么产生了。

    所以在MySQL 5.6时,参数relay_log_info_repository支持了TABLE,这样一来我们就可以将复制的进度放在系统的mysql.slave_relay_log_info表里去,并且把更新进度、SQL线程执行用户事务绑定成一个事务执行。即使slave宕机了,我们也可以通过MySQL内建的崩溃恢复机制来使实际执行的位置和数据库保存的进度恢复到一致。

    其次还有上面提到的半同步复制,主库会先提交事务,然后等待从库的返回,再将结果返回给客户端,但是如果在主库等待的时候,从库挂了呢?

    此时主库上由于事务已经提交了,但是从库上却没有这个数据。所以在MySQL 5.7时引入了无损半同步复制,增加了参数rpl_semi_sync_master_wait_point的值,在MySQL 5.7中值默认为after_sync,在MySQL 5.6中默认值为after_commit

    • after_sync 主库先不提交事务,等待某一个从库返回了结果之后,再提交事务。这样一来,如果从库在没有任何返回的情况下宕机了,master这边也无法提交事务。主从仍然是一致的

    • after_commit 与之前讨论的一样,主库先提交事务,等待从库返回结果再通知客户端

    好了以上就是本篇博客的全部内容了,如果你觉得这篇文章对你有帮助,还麻烦点个赞关个注分个享留个言

    欢迎微信搜索关注【SH的全栈笔记】,查看更多相关文章

     

    展开全文
  • MySQL主从复制的原理和实践操作 MySQL 主从(MySQL Replication),主要用于 MySQL 的实时备份、高可用HA、读写分离。在配置主从复制之前需要先准备 2 台 MySQL 服务器。 一、MySQL主从原理 1. 每个从仅可以设置一...
  • Mysql主从复制原理0、为什么需要主从复制?1、什么是mysql主从复制?2、mysql复制原理原理:也就是说:注意:具体步骤:3、mysql主从形式(一)一主一从(二)主主复制(三)一主多从(四)多主一从(五)联级复制...
  •  主从复制的原理:  分为同步复制和异步复制,实际复制架构中大部分为异步复制。 复制的基本过程如下:  1).Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从开始的日志)之后的日志...
  • Mysql主从复制的原理和配置工作原理图:主从复制的原理:分为同步复制和异步复制,实际复制架构中大部分为异步复制。 复制的基本过程如下:1).Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置...
  • 主从复制的原理主实例搭建从实例搭建将主从数据库进行连接主从复制测试 什么是主从复制? 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从数据库上,然后在从数据库上对这些日志进行重新执行,从而使从...
  • MySQL主从复制的原理
  • 今日分享开始啦,请大家多多指教~ 一.主从复制的方式 一主一从 主主复制 一主多从—扩展系统读取的性能,因为读是在从库读取的;...mysql主从复制原理 从库生成两个线程,一个I/O线程,一个SQL线程; i
  • 下面将简单介绍复制的原理及配置,以及一些常见的问题  一、复制的原理  MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。每个从服务器从主服务器接收主服务器已经记录到其二进制...
  • MySQL主从复制的原理和实践操作 MySQL 主从(MySQL Replication),主要用于 MySQL 的实时备份、高可用HA、读写分离。在配置主从复制之前需要先准备 2 台 MySQL 服务器。 一、MySQL主从原理 1. 每个从仅可以设置一...
  • MySQL主从复制的原理及配置方法(比较详细) http://blog.csdn.net/hguisu/article/details/7325124 高性能Mysql主从架构的复制原理及配置详解 双主复制,已测试可以进行。 ...
  • 一,mysql主从复制的理解图:     二,mysql主从复制的概念和好处: mysql的主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是实时的业务数据操作,从数据库常用的读取...
  • 主从复制的原理: 分为同步复制和异步复制,实际复制架构中大部分为异步复制。 复制的基本过程如下: 1).Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容; ...
  • 主从复制的原理: 分为同步复制和异步复制,实际复制架构中大部分为异步复制。 复制的基本过程如下: 1)、Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容...
  • 一、MySQL主从复制的原理1、mysql的复制过程:每执行一个写操作,它都会往自己的数据库中存一份,与此同时这个写操作也会存储在二进制日志文件中一份,并且把它们保存为事件,所以在这个数据库上,前端数据每执行一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,948
精华内容 1,579
关键字:

mysql主从复制的原理

mysql 订阅