半同步复制原理
为了提升数据安全,MySQL让Master在某一个时间点等待Slave节点的 ACK(Acknowledge character)消息,接收到ACK消息后才进行事务提交,这也是半同步复制的基础,MySQL从5.5版本开始引入了半同步复制机制来降低数据丢失的概率。
介绍半同步复制之前先快速过一下 MySQL 事务写入碰到主从复制时的完整过程,主库事务写入分为 4个步骤:
- InnoDB Redo File Write (Prepare Write)
- Binlog File Flush & Sync to Binlog File
- InnoDB Redo File Commit(Commit Write)
- Send Binlog to Slave
当Master不需要关注Slave是否接受到Binlog Event时,即为传统的主从复制。
当Master需要在第三步等待Slave返回ACK时,即为 after-commit,半同步复制(MySQL 5.5引入)。
当Master需要在第二步等待 Slave 返回 ACK 时,即为 after-sync,增强半同步(MySQL 5.7引入)。
下图是 MySQL 官方对于半同步复制的时序图,主库等待从库写入 relay log 并返回 ACK 后才进行 Engine Commit。
master库操作
使用命令select @@have_dynamic_loading;查看数据库是否支持动态插件安装功能
使用命令show plugins;查看插件
使用命令 install plugin rpl_semi_sync_master soname ‘semisync_master.so’;安装插件
使用命令show variables like '%semi%'查看相关参数
开启插件并设置超时
set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_master_wait_for_slave_count=1000;
相关参数也可以在my.cnf中进行配置
# 自动开启半同步复制
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=1000
slave库操作
使用命令install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;安装从库插件,并查看相关得参数以及设置开启semi参数。
停止并重启stop slave;start slave;
查看/var/log/mysqld.log中得日志能发现Semi-sync得信息。
相关参数也可以在my.cnf中进行配置
# 自动开启半同步复制
rpl_semi_sync_slave_enabled=ON