题目详细答案
工作流程
(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:主库配置半同步
- 安装半同步主库插件
半同步功能通过插件实现,需先安装:
-- 登录主库 mysql -u root -p -- 安装插件(linux 系统,windows 为 semisync_master.dll) install plugin rpl_semi_sync_master soname 'semisync_master.so';
若提示 “plugin already installed”,说明已安装,可跳过。
- 启用半同步复制
-- 临时启用(重启失效) set global rpl_semi_sync_master_enabled = 1; -- 永久启用(需修改 my.cnf,重启生效) [mysqld] rpl_semi_sync_master_enabled = 1
- 配置超时时间(可选)
设置主库等待从库确认的超时时间(默认 10000 毫秒 = 10 秒):
-- 临时设置为 5 秒 set global rpl_semi_sync_master_timeout = 5000; -- 永久设置(my.cnf) [mysqld] rpl_semi_sync_master_timeout = 5000
步骤 2:从库配置半同步
- 安装半同步从库插件
-- 登录从库 mysql -u root -p -- 安装插件 install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
- 启用半同步复制
-- 临时启用 set global rpl_semi_sync_slave_enabled = 1; -- 永久启用(my.cnf) [mysqld] rpl_semi_sync_slave_enabled = 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 确认次数(应随事务增长)。
四、常见问题与注意事项
- 配置后仍为异步模式?
- 检查主从库是否同时启用插件(
rpl_semi_sync_*_enabled均为 1); - 从库 i/o 线程是否重启(需执行
stop/start slave io_thread); - 主库是否有至少一个半同步从库(
rpl_semi_sync_master_clients应 ≥ 1)。
- 检查主从库是否同时启用插件(
- 主库写入延迟增加?
半同步会增加主库等待时间(通常 10-100ms),若延迟过大:
- 检查主从库网络延迟(建议同一机房,延迟 < 10ms);
- 适当调小超时时间(如 5 秒),避免长期阻塞。
- 从库 ack 确认不及时?
从库接收日志慢可能是磁盘 i/o 瓶颈,建议从库使用 ssd 存储中继日志。
五、总结
半同步复制通过 “主库等待至少一个从库确认日志接收” 的机制,在性能与数据安全间取得了平衡,是生产环境核心业务的首选复制模式。其配置关键点包括:
- 主从库同时安装并启用半同步插件;
- 合理设置超时时间(根据网络延迟调整);
- 通过状态变量监控同步模式和确认次数。
相比异步复制,半同步以微小的性能损耗(额外 10-100ms 延迟)显著降低了数据丢失风险;相比全同步,它又避免了因等待所有从库导致的性能灾难。
到此这篇关于mysql半同步复制的项目实践的文章就介绍到这了,更多相关mysql半同步复制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论