最近和同事聊天,聊到了semi-sync,整理一些相关的知识和细节。
-------------------------------------------------------------------------------------------------------正文----------------------------------------------------------------------------------------------------------
半同步插件的引入不是为了实现MySQL主从同步!
半同步插件的引入不是为了实现MySQL主从同步!
半同步插件的引入不是为了实现MySQL主从同步!
重要的事情说三遍,之前有人提到半同步插件可以实现主从的同步复制_(:з」∠)_;
半同步插件的引入是为了解决从库丢失主库的binlog导致的数据不一致的现象;
假设如下情景:主库上,将参数设置成innodb_flush_log_at_trx_commit =1 和 sync_binlog = 1,
虽然主库不会丢失事务,但是主库crash时还有可能会有binlog没传递到备库,如果我们直接提升备库为主库,会导致主备不一致。
5.7之前和5.7之后的半同步变化,图片来源:美图数据库高级DBA的分享
可以看到,不管是5.7之前还是5.7之后,半同步都只是去确认binlog已经pull到了Slave,而不是确认在Slave上面提交了;
5.7变化就在于:是确认Slave收到了binlog改动之后才在主库commit,这样子改动以后,就能确认binlog已经被从库pull到了,即使主库挂掉,把从库提升为主库之后,也不会出现不一致的情况。