MySQL 半同步复制(semi-sync-replication)

semi-sync-replication介绍

MySQL 5.5 开始引入半同步复制支持,5.5之前版本使用异步(asynchronous)复制;

半同步复制保证事务已经传递到至少一个备库(slave)上,避免在主(master)carsh丢失数据情况(最多只丢一个事务);

半同步复制并在主备网络通信故障时,主库在事务提交后等待超时(rpl_semi_sync_master_timeout, 默认10s)后继续,同时主库复制状态切换为异步复制;

MySQL 5.7 开始引入无损复制,可以通过参数(rpl_semi_sync_master_wait_for_slave_count)设置等待ack的slave数量,避免master宕机出现的数据不一致问题;

为了确保主从数据的一致性了,MySQL 5.7的半同步复制将等待Slave回复ACK的点提前到了二阶段提交的Sync阶段(等待slave写成功relay log响应ack), 只有确保至少一个Slave接收到事件后,才进入到Commit阶段。 通过参数rpl_semi_sync_master_wait_point来配置等待ACK的点,默认是AFTER_SYNCAFTER_COMMIT是旧模式。 AFTER_COMMIT在主机事务提交后将日志传送到从机,AFTER_SYNC是先传再提交。

Local Picture

semi-sync-replication配置

master安装插件

1
2
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.20 sec)

查看状态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
mysql> show variables like 'rpl_%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_recovery_rank                  | 0     |
| rpl_semi_sync_master_enabled       | OFF   |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
5 rows in set (0.00 sec)

开启半同步复制

1
2
mysql> set global rpl_semi_sync_master_enabled=on;
Query OK, 0 rows affected (0.02 sec)

设置半同步复制超时时间(milliseconds)

1
2
mysql> set global rep-semi-sync-master-timeout=10000;
Query OK, 0 rows affected (0.02 sec)

slave安装插件

1
2
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.06 sec)

查看状态

1
2
3
4
5
6
7
8
mysql> show variables like 'rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)

开启半同步复制

1
2
mysql> set global rpl_semi_sync_slave_enabled=on;
Query OK, 0 rows affected (0.00 sec)

master是否在没有slave或者所有slave连接不通情况下等待slave

1
rpl-semi-sync-master-wait-no-slave=on/off

参考