mysql的复制模式

异步复制模式

这是MySQL之前版本默认的复制方式,亦是现在版本的默认方式。

应用程序会在master复制changset到slave并成功apply之前就返回给客户端当前transaction的成功

与否状态。也就是说,master写binlog成功就返回而并不管slave写relay-log与否。当前trx可能在slave

上apply replay-log时失败,但master已经返回给client端正确的�Y果,这个风险是异步复制模式所允许

的场景。


在5.5之前,MySQL的复制其实是异步操作,而不是同步,也就意味着允许主从之间的数据存在一定的延迟,mysql当初这样设计的目的可能也是基于可用性的考虑,为了保证master不受slave的影响,并且异步复制使得master处于一种性能最优的状态:写完binlog后即可提交而不需要等待slave的操作完成。这样存在一个隐患,当你使用slave作为备份时,如果master挂掉,那么会存在部分已提交的事务未能成功传输到slave的可能,这就意味着数据丢失!


mysql5.5 版本支持半同步复制功能(Semisynchronous Replication),但还不是原生的支持,是通过plugin来支持的,


在这种模式下:master会等到binlog成功传送并写入至少一个slave的relaylog之后才会提交,否则一直等待,直到timeout(默认10s)。当出现timeout的时候,master会自动切换半同步为异步,直到至少有一个slave确认已经接受到了该复制事件,master会再切换回半同步模式。结合这个新功能,我们可以做到,在允许损失一定的事务吞吐量的前提下来保证同步数据的绝对安全,因为当你设置timeout为一个足够大的值的情况下,任何提交的数据都会安全抵达slave。


在master提交事务之后,而slave未来得及接收复制事件,这时候mastercrash的话,应用程序会切换到slave上,并重新发起事务,这正好是我们所需要的,满足高可用的初衷。但是这里存在一个缺陷,那就是在master恢复之后,原来的事务已经提交,这时候复制会出现问题。

解决办法:在原来的master恢复之后数据重做,或者跳过重复数据错误。


你可能感兴趣的:(mysql同步复制)