MySql主从库复制原理
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