mysql半同步复制的项目实践

 更新时间:2025年11月26日 09:52:19   作者:埃泽漫笔  
本文主要介绍了mysql半同步复制的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

题目详细答案

工作流程

(1)从库会在连接到主库时告诉主库,它是不是配置了半同步。

(2)如果半同步复制在主库端开启,并且至少有一个半同步复制的从库节点,那么此时主库的事务线程在提交时会被阻塞并等待,结果有两种可能:

(a)至少一个从库节点通知它已经收到了所有这个事务的Binlog事件;

(b)一直等待直到超过配置的某一个时间点为止,此时,半同步复制将自动关闭,转换为异步复制。

(3)从库节点只有在接收到某一个事务的所有 Binlog,将其写入到 Relay Log 文件之后,才会通知对应主库上面的等待线程。

(4)如果在等待过程中,等待时间已经超过了配置的超时时间,没有任何一个从节点通知当前事务,那么此时主库会自动转换为异步复制,当至少一个半同步从节点赶上来时,主库便会自动转换为半同步方式的复制。

(5)半同步复制必须是在主库和从库两端都开启时才行,如果在主库上没打开,或者在主库上开启了而在从库上没有开启,主库都会使用异步方式复制。

配置半同步复制

在主服务器上

安装半同步复制插件

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

启用半同步复制

SET GLOBAL rpl_semi_sync_master_enabled = 1;

设置超时时间(可选)

SET GLOBAL rpl_semi_sync_master_timeout = 10000; -- 单位为毫秒

在从服务器上

安装半同步复制插件

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

启用半同步复制

SET GLOBAL rpl_semi_sync_slave_enabled = 1;

检查半同步复制状态

在主服务器上

SHOW STATUS LIKE 'Rpl_semi_sync%';

在从服务器上

SHOW STATUS LIKE 'Rpl_semi_sync%';

MySQL 半同步复制(Semi-Sync Replication):工作流程与配置实战

半同步复制是 MySQL 中平衡数据安全性与性能的核心复制模式,它在异步复制的基础上增加了 “主库等待从库确认” 的机制,既避免了全同步的性能损耗,又降低了异步复制的数据丢失风险。本文将详细解析其工作流程、配置步骤及状态检查方法,帮助你快速落地半同步复制架构。

一、半同步复制的核心工作流程

半同步复制的核心逻辑是 “主库提交事务前,等待至少一个从库确认接收日志”,具体流程可拆解为 5 个关键步骤:

1. 初始化协商:主从确认复制模式

  • 从库启动时,会通过复制连接向主库发送 “是否支持半同步” 的标识;
  • 主库检查自身半同步配置(rpl_semi_sync_master_enabled),若启用,则与从库协商使用半同步模式;
  • 关键点:仅当主库和从库同时启用半同步时,才会进入半同步流程,否则自动降级为异步复制。

2. 主库事务提交与阻塞等待

  • 主库执行事务(如 UPDATE/INSERT),完成本地操作(写入 binlog、InnoDB 引擎提交)后,不会立即向客户端返回成功
  • 主库的事务线程进入阻塞状态,等待至少一个从库的 “日志接收确认”;
  • 等待结果有两种可能:
    • (a)超时前收到确认:至少一个从库返回 “已接收并写入中继日志(relay log)”,主库立即完成提交并向客户端返回 “成功”;
    • (b)超时未收到确认:等待时间超过 rpl_semi_sync_master_timeout(默认 10 秒),主库自动切换为异步复制,向客户端返回 “成功”(此时存在数据丢失风险)。

3. 从库接收日志并返回确认

  • 从库的 I/O 线程持续接收主库发送的 binlog 日志;
  • 当从库接收到完整的事务 binlog 并写入本地中继日志后,向主库返回 “ACK 确认”(告知主库 “日志已安全存储”);
  • 注意:从库仅确认 “收到日志”,无需等待事务应用到数据(即无需 SQL 线程执行),这是半同步与全同步的核心区别(全同步需等待应用完成)。

4. 主库复制模式的动态切换

  • 若主库因超时而切换为异步复制后,当有从库重新追上并正常返回确认时,主库会自动切回半同步模式
  • 切换过程对应用透明,无需人工干预,保证了复制模式的灵活性。

5. 异常场景处理

  • 若从库宕机或网络中断,主库在等待超时后切换为异步,避免事务长期阻塞;
  • 若主库宕机,已收到确认的从库必然保存了最新日志,可作为新主库(数据丢失风险极低)。

二、半同步复制的配置步骤

环境准备

  • 主库:MySQL 5.7+(支持半同步插件),已配置基本主从(参考前文主从同步配置);
  • 从库:与主库版本一致,已通过异步复制连接主库。

步骤 1:主库配置半同步

  1. 安装半同步主库插件
    半同步功能通过插件实现,需先安装:
-- 登录主库
mysql -u root -p
 
-- 安装插件(Linux 系统,Windows 为 semisync_master.dll)
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

若提示 “Plugin already installed”,说明已安装,可跳过。

  1. 启用半同步复制
-- 临时启用(重启失效)
SET GLOBAL rpl_semi_sync_master_enabled = 1;
 
-- 永久启用(需修改 my.cnf,重启生效)
[mysqld]
rpl_semi_sync_master_enabled = 1
  1. 配置超时时间(可选)
    设置主库等待从库确认的超时时间(默认 10000 毫秒 = 10 秒):
-- 临时设置为 5 秒
SET GLOBAL rpl_semi_sync_master_timeout = 5000;
 
-- 永久设置(my.cnf)
[mysqld]
rpl_semi_sync_master_timeout = 5000

步骤 2:从库配置半同步

  1. 安装半同步从库插件
-- 登录从库
mysql -u root -p
 
-- 安装插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  1. 启用半同步复制
-- 临时启用
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
 
-- 永久启用(my.cnf)
[mysqld]
rpl_semi_sync_slave_enabled = 1
  1. 重启从库 I/O 线程
    使半同步配置生效(无需重启数据库):
STOP SLAVE IO_THREAD;  -- 停止 I/O 线程
START SLAVE IO_THREAD; -- 重启 I/O 线程

三、检查半同步复制状态

配置完成后,需验证半同步是否正常工作,关键通过 SHOW STATUS 查看状态变量。

主库状态检查

SHOW STATUS LIKE 'Rpl_semi_sync%';

核心字段说明:

  • Rpl_semi_sync_master_enabled:1 表示主库半同步已启用;
  • Rpl_semi_sync_master_status:1 表示当前处于半同步模式(0 表示异步);
  • Rpl_semi_sync_master_yes_tx:成功通过半同步提交的事务数;
  • Rpl_semi_sync_master_no_tx:因超时或异常降级为异步的事务数(若持续增长,需排查从库或网络问题)。

从库状态检查

SHOW STATUS LIKE 'Rpl_semi_sync%';

核心字段说明:

  • Rpl_semi_sync_slave_enabled:1 表示从库半同步已启用;
  • Rpl_semi_sync_slave_status:1 表示当前从库参与半同步(0 表示未参与);
  • Rpl_semi_sync_slave_send_ack:从库向主库发送的 ACK 确认次数(应随事务增长)。

四、常见问题与注意事项

  1. 配置后仍为异步模式?
    • 检查主从库是否同时启用插件(rpl_semi_sync_*_enabled 均为 1);
    • 从库 I/O 线程是否重启(需执行 STOP/START SLAVE IO_THREAD);
    • 主库是否有至少一个半同步从库(Rpl_semi_sync_master_clients 应 ≥ 1)。
  1. 主库写入延迟增加?
    半同步会增加主库等待时间(通常 10-100ms),若延迟过大:
    • 检查主从库网络延迟(建议同一机房,延迟 < 10ms);
    • 适当调小超时时间(如 5 秒),避免长期阻塞。
  1. 从库 ACK 确认不及时?
    从库接收日志慢可能是磁盘 I/O 瓶颈,建议从库使用 SSD 存储中继日志。

五、总结

半同步复制通过 “主库等待至少一个从库确认日志接收” 的机制,在性能与数据安全间取得了平衡,是生产环境核心业务的首选复制模式。其配置关键点包括:

  • 主从库同时安装并启用半同步插件;
  • 合理设置超时时间(根据网络延迟调整);
  • 通过状态变量监控同步模式和确认次数。

相比异步复制,半同步以微小的性能损耗(额外 10-100ms 延迟)显著降低了数据丢失风险;相比全同步,它又避免了因等待所有从库导致的性能灾难。

到此这篇关于mysql半同步复制的项目实践的文章就介绍到这了,更多相关mysql半同步复制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解如何在SpringBoot中配置MySQL数据库的连接数

    详解如何在SpringBoot中配置MySQL数据库的连接数

    在Spring Boot中配置MySQL数据库连接数通常涉及到两个主要的配置,数据源配置和连接池配置,本文给大家介绍了Spring Boot项目如何配置MySQL数据库连接数的详细步骤,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-06-06
  • MySQL Order by 语句用法与优化详解

    MySQL Order by 语句用法与优化详解

    Order by语句是用来排序的,经常我们会使用到Order by来进行排序,下面我给大家来讲讲Order by用法与优化排序,有需要的同学可参考
    2013-06-06
  • 2022最新版MySQL 8.0.30 安装及配置教程(小白入门)

    2022最新版MySQL 8.0.30 安装及配置教程(小白入门)

    这篇文章主要介绍了2022最新版MySQL 8.0.30 安装及配置教程,安装过程算是比较简单的,今天给大家分享的此文比较适合mysql数据库的小白,需要的朋友可以参考下
    2022-09-09
  • 浅谈mysql的子查询联合与in的效率

    浅谈mysql的子查询联合与in的效率

    本文是作者在实际产品测试中遇到的问题,继而作了相关总结,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • MySQL 8.0.15配置MGR单主多从的方法

    MySQL 8.0.15配置MGR单主多从的方法

    这篇文章主要介绍了MySQL 8.0.15配置MGR单主多从的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • MySQL优化表时提示 Table is already up to date的解决方法

    MySQL优化表时提示 Table is already up to date的解决方法

    这篇文章主要介绍了MySQL优化表时提示 Table is already up to date的解决方法,需要的朋友可以参考下
    2016-11-11
  • 完美解决mysql in条件语句只读取一条信息问题的2种方案

    完美解决mysql in条件语句只读取一条信息问题的2种方案

    使用mysql多表查询时一个表中的某个字段作为另一表的in查询条件,只能读取一条信息,而直接用数字的话可以正常读取
    2018-04-04
  • 关于MySql数据库Update批量更新不同值的实现方法

    关于MySql数据库Update批量更新不同值的实现方法

    这篇文章主要介绍了关于MySql数据库Update批量更新不同值的实现方法,数据库管理系统可以通过SQL管理数据库,定义和操作数据,维护数据的完整性和安全性,需要的朋友可以参考下
    2023-05-05
  • Mysql字符集和排序规则详解

    Mysql字符集和排序规则详解

    这篇文章主要介绍了Mysql字符集和排序规则详解,在mysql中存储的是字符串数据,那么这些数据到底在Mysql中如何存储呢?这就涉及到字符集的概念,接下来我们一起进入文章学习详细内容介绍吧
    2022-09-09
  • MySQL实现不停机迁移的完整指南

    MySQL实现不停机迁移的完整指南

    在生产环境中,数据库迁移是一个常见但充满挑战的任务,传统的停机迁移方式会导致业务中断,对于7×24小时运行的互联网服务来说,这种停机时间是不可接受的,所以本文给大家介绍了MySQL如何不停机迁移,需要的朋友可以参考下
    2025-11-11

最新评论