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
posted @ 2020-09-17 21:50  前海渔文乐  阅读(133)  评论(0编辑  收藏  举报