帮助中心/最新通知

质量为本、客户为根、勇于拼搏、务实创新

< 返回文章列表

【服务器相关】MySQL主从复制之半同步semi-sync replication

发表时间:2025-06-16 03:46:00 小编:主机乐-Yutio

一、半同步简介

  • MASTER节点在执行完客户端提交的事务后不是立刻返回结果给客户端,而是等待至少一个SLAVE节点接收并写到relay log中才返回给客户端。
  • 半同步相对于异步复制而言,提高了数据的安全性,同时也造成了一定程度的延迟,这个延迟最少是一个TCP往返的时间。所以,半同步复制最好在低延时的网络中使用。
  • MySQL从5.5开始就支持半同步复制,在5.7.2版本的时候对半同步复制进行了一次改进;原先的半同步策略为 AFTER_COMMIT 改进后的策略为 AFTER_SYNC 两者的差异在于SLAVE节点ACK应答MASTER的时机不同。

二、两种模式介绍

AFTER_COMMIT 模式介绍

MASTER将每个事务写入到二进制日志并刷盘保存,同时将事务发送给SLAVE,然后将事务提交给存储引擎处理并进行提交,然后等待SLAVE返回确认信息,在收到确认信息后,MASTER将结果返回给客户端,然后当前客户端可以继续工作。

AFTER_SYNC 模式介绍

MASTER将每个事务写入到二进制日志并刷盘保存,同时将事务发送给SLAVE,然后等待SLAVE返回确认信息,收到确认信息后,将事务提交给存储引擎处理并进行提交,并将结果返回给客户端,然后当前客户端可以继续工作。

三、两种方式比较

对于第一种 AFTER_COMMIT 方式,当前客户端只有在服务器向存储引擎提交数据并收到SLAVE返回的确认后,才会收到事务的返回结果。在事务提交之后收到SLAVE返回确认信息之前,此刻其他客户端可以看到当前客户端提交的事务信息。
如果SLAVE节点由于网络等原因并未收到MASTER节点传递过来的事务,而MASTER节点此刻crash了。HA进行故障转移,客户端都连到SLAVE节点上,这时先前在MASTER节点看到的事务在SLAVE节点并未看到,就会发生事务丢失的情况。

对于第二种 AFTER_SYNC 方式,当事务被SLAVE确认后MASTER在存储引擎层面进行提交事务后,所有客户端才能看到事务造成的数据更改。因此,所有客户端在MASTER上同一时刻看到是相同的数据。
当MASTER节点crash的情况下,所有在MASTER上提交的事务都被复制到SLAVE(保存到中继日志中)。 MASTER服务器意外crash。此刻HA进行故障转移到SALVE后,客户端看到的数据是无损的,因为SLAVE是最新的。
注意,然而,在这种情况下,MASTER不能直接恢复使用,因为它的二进制日志可能包含未提交的事务,此刻当二进制日志恢复并用于业务需求时,可能会导致与SLAVE的冲突。

四、如何开启半同步

方式1:半同步以插件的形式存在,咱们可以直接在线开启即可(本次采用这次方式)

主节点开启:

 从节点参数信息:

九、半同步状态信息

主节点查看:

从节点转态信息:


show global status like ‘%semi%’;
+—————————-+——-+
| Variable_name              | Value |
+—————————-+——-+
| Rpl_semi_sync_slave_status | ON    |
+—————————-+——-+
1 row in set (0.00 sec)

参数简单说明:

十、测试一下半同步的同步情况

  • 半同步是否会降级为异步复制?是会的。
  • 当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。
  • 当MASTER DUMP 线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制。

1.从节点暂时先关掉IO线程


[root@GreatSQL][(none)]>STOP SLAVE IO_THREAD;
Query OK, 0 rows affected, 1 warning (0.02 sec)

2.主节点写入几条测试数据


[root@GreatSQL][test]>insert into ptype values(4,’4′,’4′),(5,’5′,’5′),(6,’6′,’6′);
Query OK, 3 rows affected (0.02 sec)

3.等待10s后查看复制状态,半同步已经关掉了


[root@GreatSQL][test]>show status like ‘Rpl_semi_sync_slave_status’;
+—————————-+——-+
| Variable_name              | Value |
+—————————-+——-+
| Rpl_semi_sync_slave_status | OFF   |
+—————————-+——-+
1 row in set (0.00 sec)

4.从节点开启IO线程


[root@GreatSQL][(none)]>START SLAVE IO_THREAD;
Query OK, 0 rows affected, 1 warning (0.02 sec)

5.再次查看复制状态,半同步复制自动开启了


t@GreatSQL][test]>show status like ‘Rpl_semi_sync_slave_status’;
+—————————-+——-+
| Variable_name              | Value |
+—————————-+——-+
| Rpl_semi_sync_slave_status | ON    |
+—————————-+——-+
1 row in set (0.00 sec)

到此这篇关于MySQL主从复制之半同步semi-sync replication的文章就介绍到这了,更多相关MySQL半同步semi-sync replication内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


联系我们
返回顶部