MySQL搭建半同步复制

为什么要用半同步复制?

异步复制的特点是主服务器和从服务器之间存在一定的延迟。主服务器执行写操作后,并不会等待从服务器应用这些操作完成,而是立即返回给客户端。从服务器会尽力追赶主服务器的进度,但由于网络延迟、硬件性能等因素的影响,从服务器上的数据可能会有一定的滞后。
半同步复制是在主从复制基础上的改进版本,在主服务器完成写操作后,至少一个从服务器需要将日志应用到数据库之后才能返回成功。主服务器只有在至少一个从服务器确认应用了日志后才算提交成功。相比于主从复制,半同步复制提供了更高的数据可靠性,因为至少一个从服务器确认了日志的应用。

一、前提准备

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中,半同步复制已经成为默认的复制方式,取代了主从复制。

猜你喜欢

转载自blog.csdn.net/zheng_long_/article/details/131782012