为什么要用半同步复制?
异步复制的特点是主服务器和从服务器之间存在一定的延迟。主服务器执行写操作后,并不会等待从服务器应用这些操作完成,而是立即返回给客户端。从服务器会尽力追赶主服务器的进度,但由于网络延迟、硬件性能等因素的影响,从服务器上的数据可能会有一定的滞后。
半同步复制是在主从复制基础上的改进版本,在主服务器完成写操作后,至少一个从服务器需要将日志应用到数据库之后才能返回成功。主服务器只有在至少一个从服务器确认应用了日志后才算提交成功。相比于主从复制,半同步复制提供了更高的数据可靠性,因为至少一个从服务器确认了日志的应用。
一、前提准备
MySQL半同步复制需要在搭建MySQL主从复制的基础上进行的,也就是异步复制。
可以参考我之前的搭建MySQL主从复制博客进行搭建,搭建完成后进入以下步骤:
二、安装半同步插件
主服务器
在主服务器上执行安装:
root@(none) 10:49 mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.01 sec)
启用半同步:
root@(none) 10:49 mysql>set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
root@(none) 10:51 mysql>show global variables like '%rpl_semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)
从服务器
在从服务器上执行安装插件:
root@(none) 10:54 mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)
从库上启用半同步功能:
root@(none) 10:54 mysql>set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
root@(none) 10:54 mysql>show global variables like '%rpl_semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.00 sec)
三、半同步测试
1.从库停止服务:
root@(none) 10:55 mysql>stop slave;
Query OK, 0 rows affected (0.00 sec)
2.主库建表测试:
root@(none) 10:52 mysql>use sc
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
root@sc 10:57 mysql>create table t2(id int);
Query OK, 0 rows affected (10.01 sec) #等待10秒默认时间
root@sc 10:58 mysql>show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF | #半同步关闭
+-----------------------------+-------+
1 row in set (0.00 sec)
可以看到,主库在10秒内没有收到应答后自动改为异步复制,然后再引擎层提交事务。
在主服务器上执行数据插入或者建表、数据修改等操作,触发半同步,如果半同步失败,主服务器会切换到异步
3.开启从库服务:
开启从库服务查看同步状况:
root@(none) 11:00 mysql>start slave ;
Query OK, 0 rows affected (0.00 sec)
root@(none) 11:02 mysql>use sc
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
root@sc 11:02 mysql>show tables;
+--------------+
| Tables_in_sc |
+--------------+
| student |
| t2 |
+--------------+
2 rows in set (0.00 sec)
在主服务器上查看状态:
扫描二维码关注公众号,回复:
17019918 查看本文章
root@sc 11:04 mysql>show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON | #半同步开启
+-----------------------------+-------+
1 row in set (0.00 sec)
root@sc 11:04 mysql>create table t3(id int);
Query OK, 0 rows affected (0.02 sec) #建表测试,发现半同步成功
从库查看:
root@sc 11:06 mysql>show tables;
+--------------+
| Tables_in_sc |
+--------------+
| student |
| t2 |
| t3 |
+--------------+
3 rows in set (0.01 sec)
总结:
- 主从复制是异步复制方式,速度较快但可靠性较低,从服务器可能存在数据延迟和不一致的情况。
- 半同步复制是在主从复制基础上引入了同步等待机制,提高了数据可靠性,减少了数据丢失的风险。但相比主从复制,半同步复制的性能可能略有下降,因为主服务器需要等待从服务器的确认。
需要注意的是,以上内容基于MySQL 5.7及之前的版本。在MySQL 8.0中,半同步复制已经成为默认的复制方式,取代了主从复制。