Mysql主从复制的三种类型

1、异步复制

在mysql异步复制的情况下,Master Server将自己的binlog通过复制线程传输出去以后,Mysql Master Sever就自动返回数据给客户端,而不管slave上是否接受到了这个二进制日志。
那么,当master宕机后,如果master不能恢复,此时,只能用slave代替master,但slave处于同步落后的状态,就会导致数据丢失。文章源自靠谱运维-https://www.ixdba.net/archives/1794

优点:复制的性能最好
缺点:master挂掉后,slave可能会丢失事务文章源自靠谱运维-https://www.ixdba.net/archives/1794

2、全同步复制

在全同步复制中,master将自己的binlog写入到bin-log文件并且sync,然后向存储引擎提交事务,然后一直等待ACK,同时要求所有slave接收到binlog,写入relay-log后,并完成日志回放,同时返回ACK确认信息,master在接收到所有从库ACK确认信息后,才将结果返回给客户端。文章源自靠谱运维-https://www.ixdba.net/archives/1794

优点:数据不会丢失
缺点:会阻塞master session,性能太差,非常依赖网络文章源自靠谱运维-https://www.ixdba.net/archives/1794

3、半同步复制

半同步复制,又分为两种,分别是传统半同步复制和无损半同步复制。文章源自靠谱运维-https://www.ixdba.net/archives/1794

(1)、传统半同步复制

在传统半同步复制的架构下,master将自己的binlog写入到bin-log文件并且sync,且向存储引擎提交事务,然后一直等待ACK。当至少一个slave接收到binlog后,写入relay-log并返回ACK确认信息。master在接收到从库任意一个ACK确认信息后,就将结果返回给客户端。文章源自靠谱运维-https://www.ixdba.net/archives/1794

基本架构如下:文章源自靠谱运维-https://www.ixdba.net/archives/1794

Mysql主从复制的三种类型文章源自靠谱运维-https://www.ixdba.net/archives/1794

如果备库Crash时,主库会在某次等待超时后,关闭Semi-sync的特性,降级为普通的异步复制。文章源自靠谱运维-https://www.ixdba.net/archives/1794

由此可知,传统半同步复制对于客户的请求响应稍微慢点,但是它可以保证二进制日志的完整性。文章源自靠谱运维-https://www.ixdba.net/archives/1794

优点:会有数据丢失风险,但很低。
缺点:会阻塞master session,性能稍差,非常依赖网络。文章源自靠谱运维-https://www.ixdba.net/archives/1794

特点:由于master是在三段提交的最后commit阶段完成后才等待,所以master的其他session是可以看到这个提交事务的,所以这时候master上的数据和slave不一致,master crash后,slave有数据丢失。文章源自靠谱运维-https://www.ixdba.net/archives/1794

参数rpl_semi_sync_master_wait_point在MySQL的半同步复制中,控制master在哪个阶段等待来自slave的ACK确认。在MySQL5.7中,该参数主要有两个值:after_commit和after_sync。文章源自靠谱运维-https://www.ixdba.net/archives/1794

after_commit:这其实就是传统的半同步复制,master将自己的binlog写入到bin-log文件并且sync,且向存储引擎提交事务,然后一直等待ACK。当至少一个slave接收到binlog后,写入relay-log并返回ACK确认信息。master在接收到从库任意一个ACK确认信息后,就将结果返回给客户端。文章源自靠谱运维-https://www.ixdba.net/archives/1794

after_sync:这其实就是后面马上要讲到的无损半同步复制,master将自己的binlog写入到binlog文件并且sync,之后会进入等待ACK,当至少一个slave接收到binlog之后,写入relay-log并返回ACK确认信息。master接收到从库ACK确认信息之后,向存储引擎提交事务,最终返回给客户端。文章源自靠谱运维-https://www.ixdba.net/archives/1794

要开启传统半同步复制,需要设置如下几个参数:文章源自靠谱运维-https://www.ixdba.net/archives/1794

rpl_semi_sync_master_enabled=1  #是否在master上开启半同步,1表示开启,0是关闭,默认关闭。
rpl_semi_sync_slave_enabled=1   #是否在slave上开启半同步,1表示开启,0是关闭,默认关闭。
rpl_semi_sync_master_timeout=5000   #切换复制的超时时间,单位是毫秒,这里设置超时5s。
rpl_semi_sync_master_wait_point=after_commit    #等待的point,有after_commit和after_sync可选。after_sync表示无损半同步复制,after_commit表示传统半同步复制,默认值为after_sync。

(2)、无损半同步复制

master将自己的binlog写入到binlog文件并且sync,之后会进入等待ACK,当至少一个slave接收到binlog之后,写入relay-log并返回ACK确认信息。master接收到从库ACK确认信息之后,向存储引擎提交事务,最终返回给客户端。文章源自靠谱运维-https://www.ixdba.net/archives/1794

基本实现逻辑如下:文章源自靠谱运维-https://www.ixdba.net/archives/1794

Mysql主从复制的三种类型文章源自靠谱运维-https://www.ixdba.net/archives/1794

优点:数据零丢失,性能好
缺点:会阻塞master session,非常依赖网络文章源自靠谱运维-https://www.ixdba.net/archives/1794

重点:由于master是在三段提交的第二阶段sync binlog完成后才等待, 所以master的其他session是看不见这个提交事务的,所以这时候master上的数据和slave一致,master crash后,slave没有丢失数据。文章源自靠谱运维-https://www.ixdba.net/archives/1794

要开启无损半同步复制,需要设置如下几个参数:文章源自靠谱运维-https://www.ixdba.net/archives/1794

plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
文章源自靠谱运维-https://www.ixdba.net/archives/1794
  • 本文由 发表于 2021年11月26日08:07:23
  • 转载请务必保留本文链接:https://www.ixdba.net/archives/1794
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: