美文网首页
MySql主从库复制原理

MySql主从库复制原理

作者: 程就人生 | 来源:发表于2023-01-15 20:10 被阅读0次

MySql主从库读写分离,几年前就开始应用,但是说到主从库复制原理,你有了解过吗?主从复制有几种模式呢?每种模式的优缺点有哪些?这些可都是面试官爱问的问题呀。

MySql主从库复制主要有三种模式:异步复制、全同步复制、半同步复制。

一、异步复制

异步复制(Asynchronous replication),主库执行完一次事务时,立刻将结果返回给客户端,并不关心从库是否读取到数据并完成同步。异步复制是MySql默认的主从库同步模式。

先回忆一下异步复制的授权流程。

首先,在Master主库为Slave从库授权。

# 在master主库上为Slave从库授权,用户名、端口、密码都是从库的
grant replication slave on *.* to 'test'@'127.0.0.1' identified by '123456';
# 授权需要刷新后,才能生效;
flush privileges;

其次,在Slave从库授权,指定Master主库ip地址、账号、密码,从哪个文件开始请求binlog日志及日志偏移量。

#注意:从库的几个参数一定要和主库 show master status查询的结果 保持一致
change master to master_host='127.0.0.1',master_user='test',master_password='123456',master_log_file='mysql3306_bin.000004',master_log_pos=595;

最后,启动从库的Slave,启动IO线程和SQL线程。

#启动从库的两个复制线程
start slave; 
#查看状态
show slave status \G
图片

IO线程负责从Master拉取binlog日志,并写入relay-log中继日志,中继日志起到一个缓冲的作用。SQL线程负责将relay-log中继日志转变成Sql语句,放在从库中执行。

IO线程和SQL线程必须都为Yes,复制操作才能正常进行。当Slave_IO_Running为No的时候,也就是IO线程因为某些原因停掉了,就无法继续从Master的binlog二进制文件进行拉取数据了。当Slave_SQL_Running为No的时候,也就是SQL线程因为某些原因停掉了,就无法继续从relay-log中继日志读取二进制文件并转变成SQL语句在从库上执行。但是无论Slave从库的哪一个线程停掉了,都不会对Master主库产生影响。

梳理一下异步复制的流程:客户端对主库进行数据操作,新增修改或者删除数据,主数据写入binlog提交事务成功后,并且通知从服务器。从服务器通过IO线程读取主库的binlog二进制文件,并写入缓存relay-log中继文件,SQL线程则负责从relay-log中继文件中读取并转换成SQL语句在从库上执行,以此来保持主从库的数据一致性。

图片

Mysql主从复制原理图

在这个过程中,Slave通过IO线程拉取binlog二进制日志,Master无需关注是否有Slave需要同步,只做自己的事情,整个复制过程都是异步完成的。主库通知从库这一步可以忽略不计,因为主库才不关心从库是否能收得到。从库当掉了,主库照常使用,不受任何影响。主从复制不是完全实时地进行同步,而是异步实时。这中间存在主从服务之间的同步执行延时,如果主服务器的压力很大,则可能导致从服务器的数据同步延时较长。

二、全同步复制

全同步复制(Fully synchronous replication),是指当主库执行完一个事务时,并且所有的从库都执行完该事务才返回给客户端。全同步复制又称组复制(Group Replication)。

https://dev.mysql.com/doc/refman/5.7/en/group-replication-summary.html

全同步复制的流程为:客户端对主库进行数据操作,新增修改或者删除数据,并以广播的形式通知从服务器,同时主数据写入binlog并准备提交事务。

从服务器接收到主库的通知后,需要全部将binlog通过IO线程写入relay-log中继文件,并且通过SQL线程读取中继文件并转为sql语句在从库中执行并提交,主库才能给客户端操作成功的反馈。在组内的每一个从库都需要提交事务并响应成功,数据才算同步完成,因此比较耗时。

全同步复制保证数据的最终一致性,但因为要求从库全部提交才能返回给客户端,因此在性能上有所降低。一般用于对数据安全性要求较高的业务场景。

三、半同步复制

半同步复制(Semisynchronous Replication),是介于全同步复制与异步复制之间的一种,主库只需要等待至少一个从库节点收到通知并且刷新Binlog到Relay-Log 文件即可,主库不需要等待所有从库给主库反馈。


图片来自MySql官网

半同步复制的流程为:客户端对主库进行数据操作,新增修改或者删除数据,主数据写入binlog时,以广播的形式通知从服务器,从服务器接收到通知,把binlog写入relay-log中继文件,至少有一个给主库ACK反馈,主库就会提交事务并且给客户端反馈。

相比较于异步复制,半同步复制需要依赖至少一个Slave将binlog写入relay-log,在性能上有所降低,但是可以保证至少有一个从库跟Master的数据是一致的,数据的安全性提高。

对于数据一致性要求高的场景,对性能也有一定要求的场景,可以采用半同步复制的同步策略,比如主库挂掉时,准备接管的那一个从库,对数据的一致性要求很比较高。

最后总结

MySql主从复制的三种模式,异步复制是MySql主从复制的默认模式。

从执行性能上排个序:异步复制 > 半同步复制 > 全同步复制。

从数据安全上排序:全同步复制 > 半同步复制 > 异步复制。这三种模式,只有异步模式在使用中,其他两种模式还是初次接触,理解不一定全面,还需要在应用中深入理解,放在一起也是为了加深理解。希望本次的整理对你有帮助。

官网文档:
https://dev.mysql.com/doc/refman/5.7/en/group-replication-primary-secondary-replication.html

相关文章

  • mysql 主从复制

    mysql 主从复制 网易数据库 石勇 提纲 什么是主从复制 主从复制的原理 主从复制的用途 主从复制的搭建 主从...

  • mysql 主从基础知识笔记

    mysql 主从同步 mysql 主从,其实也就是mysql 复制了, mysql 主从复制的原理就是从服务器复制...

  • MySql主从库复制原理

    MySql主从库读写分离,几年前就开始应用,但是说到主从库复制原理,你有了解过吗?主从复制有几种模式呢?每种模式的...

  • mysql主从复制

    原理 主从复制的具体原理可以参考其他理论博客 具体步骤 主库和从库初同步(复制)对于线上的mysql服务器主从配置...

  • Docker学习一-MySQL主从热备

    Docker学习一-MySQL主从热备 主从复制原理   主从复制原理图: 执行主从复制三步: ①master将改...

  • MySQL主从复制、读写分离实现

    一.主从复制 主从复制原理: Mysql开启binlog日志后,会把对数据库的增、删、改等数据库变动情况记录在二进...

  • MySQL集群篇

    1 集群之主从复制 1.1 主从复制概述 MySQL主从复制也可以称为MySQL主从同步,它是构建数据库高可用集群...

  • 6. MySQL 主从架构

    7 MySQL 集群Cluster 7.1 主从复制 7.1.1 主从复制原理 主从复制过程: 主节点收到用户请求...

  • 深度探索MySQL主从复制原理

    概要 MySQL Replication (MySQL 主从复制) 是什么? 为什么要主从复制以及它的实现原理是什...

  • Mysql-replication(主从复制)

    ### Mysql-replication(主从复制) 概念:主从复制AB复制,允许将来自一个Mysql数据库服务...

网友评论

      本文标题:MySql主从库复制原理

      本文链接:https://www.haomeiwen.com/subject/skvacdtx.html