简介
默认情况下,MySQL复制是异步的。主库将事件写入二进制日志,但不知道从库是否处理它们。使用异步复制,如果主库崩溃,则它已提交的事务可能尚未传输到任何从库。因此,在这种情况下,从主库到从库的故障转移,可能导致丢失事务。
在半同步复制中,只有在将事件写入中继日志并刷新后,从库才会确认收到事务的事件。如果从库在经过一定时间之后未确认事务(可使用rpl_semi_sync_master_timeout变量进行配置),则会发生超时,并且主服务器将切换到异步复制。当至少有一个半同步从库赶上时,将恢复半同步复制。
原理图
图片是网上找的没看到出处
简单来说:主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端
配置半同步复制
配置的前提是已经配置好普通的异步复制一主一从了。
这里需要用到2个插件完成,一个用于主库,一个用于从库
第一步:配置主库
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #安装插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled=ON; #启用插件
查看状态
mysql> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
第二步:配置从库
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; #安装插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=ON; #启用插件
查看状态
SHOW GLOBAL VARIABLES LIKE 'rpl_semi_sync_sl%';
从库重启I/O线程
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
第三步:测试
查看是否搭建成功可以查看系统变量
mysql> SHOW STATUS LIKE 'rpl%';
mysql> SHOW STATUS LIKE 'rpl%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 | #表示半同步连接的从库数量
| Rpl_semi_sync_master_net_avg_wait_time | 0 |#主库等待从库回复的平均时间
| Rpl_semi_sync_master_net_wait_time | 0 |#主库等等从库回复的总时间
| Rpl_semi_sync_master_net_waits | 0 |#主库等待从库回复的总次数
| Rpl_semi_sync_master_no_times | 0 |#主库关闭半同步复制次数
| Rpl_semi_sync_master_no_tx | 0 |#从库未成功确认的提交次数
| Rpl_semi_sync_master_status | ON |半同步复制当前是否在主库运行,ON表示运行
| Rpl_semi_sync_master_timefunc_failures | 0 |#调用时间函数时主库失败次数
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |#主库等待每个事务的平均时间
| Rpl_semi_sync_master_tx_wait_time | 0 |#主库等待事务的总时间
| Rpl_semi_sync_master_tx_waits | 0 |#主库等待事务的总次数
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |#主服务器等待二进制坐标低于先前事件等待的事件的总次数。如果事务开始等待回复的顺序与其二进制日志事件的写入顺序不同,则会发生。
| Rpl_semi_sync_master_wait_sessions | 0 |当前正在等待从库回复的会话数
| Rpl_semi_sync_master_yes_tx | 0 |从服务器已成功确认的提交数
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
相关的变量更详细的信息可以看一下MySQL官方文档,或者MariaDB官方文档
https://mariadb.com/kb/en/library/semisynchronous-replication/#setup
https://dev.mysql.com/doc/refman/5.7/en/replication-semisync-monitoring.html