半同步复制简介
MySQL复制默认情况下是异步的,主库将事件写入binlog并不管从库是否接受并处理它们,如果主库崩溃时,已提交的事务可能没有被传送到从库,因此主从切换可能导致数据丢失。Semisynchronous Replication(半同步复制)则一定程度上保证提交的事务已经传给了至少一个备库。半同步
复制中,仅仅保证事务的已经传递到备库上,但是并不确保已经在备库上执行完成了。半同步复制确实有一定的性能影响,因为需要等待的从库确认。这是对增加数据的完整性的折衷。
工作原理:
从库连接主库时指明时从库否有半同步能力
主库启动半同步复制且至少有一个半同步从库,主库线程执行事务提交之后将会阻塞直到任一半同步从库确认接收到该事务的所有事件或者超时
从库确认接收到事务的所有事件之后写入到中继日志并刷新到磁盘
如果超时没有任何从库确认事务,主库恢复到异步复制,保障业务的正常使用,直到一台从库追赶上之后,继续切换到半同步模式
半同步复制必须主从两端同时启用,如任意一端禁止将使用异步复制
当主库被阻塞时(已经提交的事务等待从从库确认),不会向执行事务的session返回信息;当主库阻塞结束后,返回session执行结果。
此时,主库事务已提交,至少一台从库确认接收到事务。
如果主备网络故障或者从库崩溃,主库在事务提交后等待10秒(rpl_semi_sync_master_timeout默认值)后,主从复制将自动降级为异步模式。
半同步复制是通过plugin实现的,master和slave使用不同的plugin。默认情况下没有安装该plugin,插件位于CMAKE_INSTALL_PREFIX/lib/plugin/。安装完插件之后,还需要手动设置系统参数以开启半同步复制模式。
安装配置半同步
[Master]
首先先检查 mysql是否支持动态添加插件
mysql> show variables like 'have_dynamic_loading';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loadi