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在5.7版本中针对半同步复制增加的新特性,这个新特性进一步增强了主库和备库之间的数据完整性。新特性中主库上的事务会在存储引擎层提交之前一直等待从库返回ACK信号。图中的engine Commit 前等待ack。需要注意的是如果等待超时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s)会改为异步复制,当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制
2.主库安装插件
2.1 进入主库查看插件,会发现没有下图红框框的插件
show plugins;
没有也不要怕,我们来安装他,首先看下mysql是否支持动态添加插件:
select @@have_dynamic_loading ;
发现是yes支持的,那我们继续下一步安装
2.2 安装插件
-- 安装:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
-- 卸载:
UNINSTALL PLUGIN rpl_semi_sync_master;
安装好后在查看发现那个插件已经存在了
我们来看看相关参数吧!
show global variables like 'rpl_semi%';
此处引用插件安装里面的一张图片来解释下参数的意义
3.从库安装插件
-- 安装:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
-- 卸载:
UNINSTALL PLUGIN rpl_semi_sync_slave;
show plugins;
4.开启半同步
主库执行:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
从库执行:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
发现已经开启了,不过这种方式不推荐,建议在配置文件中开启
主数据库的my.cnf配置文件中添加:
|
1 2 |
|
从数据库的my.cnf配置文件中添加:
|
1 2 |
|
由于引用外部文件此处就不操作了。
然后关闭从库复制,在启动半同步复制就生效了
show global status like 'rpl_semi%';
软文推荐: