半同步复制
在mysql5.5之前,mysql复制是异步操作,主库和从库的数据之间存在一定的延迟,这样存在一个隐患,当主库上写入一个事物并提交成功,而从库尚未得到主库推送的binlog日志时,主库宕机了,例如主库可能因为磁盘损坏,内存故障等造成主库上该事务binlog丢失,此时,从库就可能损失这个事务,从而造成主从不一致
为了解决这个问题,mysql5.5引入了半同步复制机制,在mysql5.5之前的异步复制时,主库执行完commit提交操作后,在主库写入binlog日志后即成功返回客户端,无需等待binlog日志传送给从库。
半同步复制时,为了保证主库上的每一个binlog事务都能够被可靠的复制到从库上,主库在每次事物成功提交时,并不及时反馈给前段应用用户,而是等待其中一个从库也接收到binlog事务并成功写入中继日志后,主库才返回commit操作成功给客户端。半同步复制保证了事务成功提交后,至少有两份日志记录,一份在主库的binlog,另一份在至少一个从库的中继日志relaylog上,从而更近一步保证了数据的完整性
半同步模式是作为mysql5.5的一个插件来实现的,主库和从库使用不用的插件,安装比较简单,异步复制的环境上,安装半同步复制插件即可。
首先,判断mysql服务器是否支持动态增加插件
mysql> select @@have_dynamic_loading;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES |
+------------------------+
1 row in set (0.03 sec)
2)确认支持动态增加插件后,检查mysql的安装目录下是否存在插件,一般默认在$/MYSQL_HOME/lib/plugin目录下存在主库插件semisync_master.so和从库插件semisync_slave.so
3)主库上安装semisync_master.so插件
mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so';
4)从库上安装semisync_slave.so插件
mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
5)安装完成后,从plugin表中能够看到刚才安装的插件:安装完成后,mysql会在系统表plugin中记录刚才安装的插件,下次系统重启后会自动加载插件
select * from mysql.plugin;
6)需要分别在主库和从库上配置参数打开半同步semi-sync,默认半同步设置是不打开的,主库上配置全局参数
mysql>set global rpl_semi_sync_master_enabled=1;
mysql>set global rpl_semi_sync_master_timeout=30000;
7)从库上一样配置全局参数
mysql>set global rpl_semi_sync_slave_enabled=1;
8)由于之前配置的复制是异步复制,所以需要重启一下从库上的io线程(如果是全新配置的半同步复制则不需要)
stop slave io_thread;start slave io_thread;
9)至此半同步配置完毕,主库上通过show status命令能否看到当前半同步复制的一些状态值。
mysql> show status like '%semi_sync%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
|
Rpl_semi_sync_master_no_tx | 0 | 表示当前有0个事务不是半同步模式下从库及时相应的。
| Rpl_semi_sync_master_status | ON | on 表示半同步复制目前处于打开状态
| Rpl_semi_sync_master_yes_tx | 0 | 表示主库当前尚未有任何一个事务是通过半同步复制到从库
+--------------------------------------------+-------+
网络异常的情况下,主库在等待rpl_semi_sync_master_timeout毫秒超时后,自动转成异步复制的场景。