MySql主从库复制原理

2023-01-15  本文已影响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

上一篇 下一篇

猜你喜欢

热点阅读