zoukankan      html  css  js  c++  java
  • 2.6.2.MySQL主从复制的原理

    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
    
  • 相关阅读:
    Document
    Document
    Document
    Document
    Document
    Document
    set常见操作:
    select 不存在字段,并设置默认值
    c#为字段设置默认值,以及构造函数初始化List对象。
    ThreadLocal
  • 原文地址:https://www.cnblogs.com/wenyule/p/13687918.html
Copyright © 2011-2022 走看看