一、什么是半同步复制
半同步复制(Semisynchronous replication) 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
简单来说,半同步复制解决主从数据一致性问题。
二、半同步复制工作原理的变化
1. 主库执行新的事务,commit时,更新 show master status\G ,触发一个信号给 2. binlog dump 接收到主库的 show master status\G信息,通知从库日志更新了 3. 从库IO线程请求新的二进制日志事件 4. 主库会通过dump线程传送新的日志事件,给从库IO线程 5. 从库IO线程接收到binlog日志,当日志写入到磁盘上的relaylog文件时,给主库ACK_receiver线程 6. ACK_receiver线程触发一个事件,告诉主库commit可以成功了 7. 如果ACK达到了我们预设值的超时时间,半同步复制会切换为原始的异步复制.
三、配置半同步复制
1、加载插件 主: [(none)]>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 从: [(none)]>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 2、查看是否加载成功: [(none)]>show plugins; 3、启动: 主: [(none)]>SET GLOBAL rpl_semi_sync_master_enabled = 1; 从: [(none)]>SET GLOBAL rpl_semi_sync_slave_enabled = 1; 4、重启从库上的IO线程 [(none)]>STOP SLAVE IO_THREAD; [(none)]>START SLAVE IO_THREAD; 5、查看是否在运行 主: [(none)]>show status like 'Rpl_semi_sync_master_status'; 从: [(none)]>show status like 'Rpl_semi_sync_slave_status';
[(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ERROR 1126 (HY000): Can't open shared library '/usr/local/mysql/lib/plugin/semisync_master.so' (errno: 22 libimf.so: cannot open shared object file: No such file or directory) #如果尝试安装插件导致在Linux上显示类似于此处所示的错误,则必须安装 libimf: #可以libimf从 https://dev.mysql.com/downloads/os-linux.html获得。
更改配置文件
主库配置
[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000 # 1 second
从库配置
[mysqld] rpl_semi_sync_slave_enabled=1