mysql主从复制之半同步复制模式

1概念:

    1.1.异步复制

    1、逻辑上

        MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从库上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

    2、技术上

        主库将事务 Binlog 事件写入到 Binlog 文件中,此时主库只会通知一下 Dump 线程发送这些新的 Binlog,然后主库就会继续处理提交操作,而此时不会保证这些 Binlog 传到任何一个从库节点上。

    1.2.全同步复制

    1、逻辑上

        指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

    2、技术上

        当主库提交事务之后,所有的从库节点必须收到、APPLY并且提交这些事务,然后主库线程才能继续做后续操作。但缺点是,主库完成一个事务的时间会被拉长,性能降低。

    1.3.半同步复制

    1、逻辑上

        介于全同步复制与全异步复制之间的一种,主库只需要等待至少一个从库节点收到并且 Flush Binlog 到 Relay Log 文件即可,主库不需要等待所有从库给主库反馈。同时,这里只是一个收到的反馈,而不是已经完全完成并且提交的反馈,如此,节省了很多时间。

    2、技术上

        介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

    mysql5.7版本新特性

        在MySQL 5.5以及MySQL 5.6开启半同步复制的场景下,主库上的事务在存储引擎层提交之后,需要等待从库返回ACK信号。并且在接收到从库返回ACK信号或者等待超时才会返回给客户端一个提交结果。(主库commit后,如果没有ack确认,主库挂了,会导致主从数据不一致)

mysql主从复制之半同步复制模式

        MySQL在5.7版本中针对半同步复制增加的新特性,这个新特性进一步增强了主库和备库之间的数据完整性。新特性中主库上的事务会在存储引擎层提交之前一直等待从库返回ACK信号。图中的engine Commit 前等待ack。需要注意的是如果等待超时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s)会改为异步复制,当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制

mysql主从复制之半同步复制模式

2.主库安装插件

    2.1 进入主库查看插件,会发现没有下图红框框的插件

show plugins;

mysql主从复制之半同步复制模式

没有也不要怕,我们来安装他,首先看下mysql是否支持动态添加插件:

select @@have_dynamic_loading ; 

mysql主从复制之半同步复制模式

发现是yes支持的,那我们继续下一步安装

2.2 安装插件

-- 安装:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

-- 卸载:

 UNINSTALL PLUGIN rpl_semi_sync_master;

mysql主从复制之半同步复制模式

安装好后在查看发现那个插件已经存在了

我们来看看相关参数吧!

show global variables like 'rpl_semi%';

mysql主从复制之半同步复制模式

此处引用插件安装里面的一张图片来解释下参数的意义

mysql主从复制之半同步复制模式

3.从库安装插件

-- 安装:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

-- 卸载:

UNINSTALL PLUGIN rpl_semi_sync_slave;

mysql主从复制之半同步复制模式

show plugins;

mysql主从复制之半同步复制模式

4.开启半同步

主库执行:

SET GLOBAL rpl_semi_sync_master_enabled = 1;

mysql主从复制之半同步复制模式

从库执行:

SET GLOBAL rpl_semi_sync_slave_enabled = 1;

mysql主从复制之半同步复制模式

发现已经开启了,不过这种方式不推荐,建议在配置文件中开启


主数据库的my.cnf配置文件中添加:

1

2

plugin-load=rpl_semi_sync_master=semisync_master.so

rpl_semi_sync_master_enabled=1

从数据库的my.cnf配置文件中添加:

1

2

plugin-load=rpl_semi_sync_slave=semisync_slave.so

rpl_semi_sync_slave_enabled=1

由于引用外部文件此处就不操作了。

然后关闭从库复制,在启动半同步复制就生效了

mysql主从复制之半同步复制模式

show global status like 'rpl_semi%';

mysql主从复制之半同步复制模式

软文推荐:

    1.MySQL在5.7版本中针对半同步复制增加的新特性

    2.五大常见的MySQL高可用方案

相关文章: