Skip to content

MySQL 半同步复制插件

插件安装与配置

插件安装

内置插件

MySQL 5.5+ 版本内置了半同步复制插件,无需单独安装:

sql
-- 安装主库插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

-- 安装从库插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

验证安装

sql
-- 检查插件状态
SHOW PLUGINS LIKE '%semi%';

-- 检查插件变量
SHOW VARIABLES LIKE 'rpl_semi_sync%';

插件配置

主库配置

sql
-- 启用半同步复制
SET GLOBAL rpl_semi_sync_master_enabled = 1;

-- 设置超时时间(毫秒)
SET GLOBAL rpl_semi_sync_master_timeout = 10000;

-- 允许从库延迟确认
SET GLOBAL rpl_semi_sync_master_wait_point = 'AFTER_SYNC';

-- 启用动态批量确认
SET GLOBAL rpl_semi_sync_master_wait_for_slave_count = 1;

从库配置

sql
-- 启用半同步复制
SET GLOBAL rpl_semi_sync_slave_enabled = 1;

-- 重启从库IO线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

持久化配置

在my.cnf文件中添加配置:

ini
# 主库配置
[mysqld]
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 10000
rpl_semi_sync_master_wait_point = AFTER_SYNC
rpl_semi_sync_master_wait_for_slave_count = 1

# 从库配置
[mysqld]
rpl_semi_sync_slave_enabled = 1

工作机制详解

事务提交流程

AFTER_SYNC 模式(推荐)

  1. 主库执行事务
  2. 主库将事务写入二进制日志
  3. 主库发送二进制日志到从库
  4. 从库接收并写入中继日志
  5. 从库发送确认给主库
  6. 主库收到确认后,提交事务
  7. 主库返回客户端

AFTER_COMMIT 模式

  1. 主库执行事务
  2. 主库将事务写入二进制日志
  3. 主库提交事务
  4. 主库发送二进制日志到从库
  5. 从库接收并写入中继日志
  6. 从库发送确认给主库
  7. 主库收到确认后,返回客户端

故障处理机制

超时处理

  • 主库等待从库确认超时后,自动降级为异步复制
  • 当从库恢复后,自动切换回半同步复制
  • 超时时间可通过 rpl_semi_sync_master_timeout 配置

网络故障

  • 网络故障时,主库等待超时后降级为异步复制
  • 网络恢复后,从库自动重新加入半同步复制
  • 主库会重新发送未确认的事务

从库故障

  • 从库故障时,主库等待超时后降级为异步复制
  • 从库恢复后,自动重新加入半同步复制
  • 从库会自动追赶丢失的事务

性能影响分析

性能开销

  • 网络延迟:主库需要等待从库确认,增加了响应时间
  • CPU开销:插件需要额外的处理逻辑
  • IO开销:需要更多的网络IO操作
  • 并发影响:可能影响主库的并发处理能力

性能优化

  • 合理设置超时时间:根据网络延迟设置合适的超时时间
  • 使用高速网络:使用万兆网络或本地网络
  • 优化从库性能:确保从库有足够的资源处理复制
  • 使用并行复制:启用从库的并行复制功能
  • 合理的等待点:根据业务需求选择合适的等待点

性能监控

sql
-- 查看半同步复制状态
SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync%';

-- 监控等待时间
SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_master_yes_tx';
SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_master_no_tx';

监控与告警

监控指标

  • Rpl_semi_sync_master_status:主库半同步复制状态
  • Rpl_semi_sync_slave_status:从库半同步复制状态
  • Rpl_semi_sync_master_yes_tx:成功确认的事务数
  • Rpl_semi_sync_master_no_tx:未成功确认的事务数
  • Rpl_semi_sync_master_wait_time:主库等待时间
  • Rpl_semi_sync_master_timefunc_failures:时间函数失败次数

告警策略

  • 状态变更:半同步复制状态从ON变为OFF时告警
  • 超时频繁:未成功确认的事务数增加时告警
  • 等待时间:主库等待时间过长时告警
  • 复制延迟:从库复制延迟过大时告警

监控工具

  • MySQL Enterprise Monitor:提供半同步复制的监控面板
  • Prometheus + Grafana:通过exporter监控半同步复制状态
  • Zabbix:配置半同步复制的监控项和触发器
  • Nagios:通过插件监控半同步复制状态

故障排查

常见问题

半同步复制自动降级

  • 症状:半同步复制状态变为OFF
  • 原因
    • 从库故障或网络中断
    • 从库性能不足,无法及时确认
    • 超时时间设置过短
  • 解决方案
    • 检查从库状态和网络连接
    • 优化从库性能
    • 调整超时时间

主库响应时间变长

  • 症状:主库响应时间明显增加
  • 原因
    • 网络延迟过大
    • 从库处理能力不足
    • 事务量过大
  • 解决方案
    • 优化网络连接
    • 增加从库资源
    • 拆分大事务

从库无法加入半同步复制

  • 症状:从库启用半同步复制后,主库仍显示为异步
  • 原因
    • 从库插件未正确安装
    • 从库IO线程未重启
    • 网络连接问题
  • 解决方案
    • 验证插件安装状态
    • 重启从库IO线程
    • 检查网络连接

排查步骤

  1. 检查插件状态:确认主从库插件是否正确安装和启用
  2. 检查配置参数:验证半同步复制的配置参数
  3. 检查网络连接:确认主从库之间的网络连接正常
  4. 检查从库状态:确认从库复制正常运行
  5. 检查监控指标:分析半同步复制的监控指标
  6. 检查错误日志:查看主从库的错误日志

最佳实践

配置最佳实践

  • 使用AFTER_SYNC模式:提供更强的数据一致性
  • 合理设置超时时间:根据网络延迟和业务需求设置
  • 启用多从库确认:提高可靠性
  • 配置持久化:在my.cnf中持久化配置
  • 定期备份:即使使用半同步复制,仍需定期备份

部署最佳实践

  • 使用高速网络:主从库之间使用高速网络
  • 合理规划拓扑:根据业务需求选择合适的复制拓扑
  • 考虑地理分布:跨机房部署时注意网络延迟
  • 冗余设计:部署多个从库,提高可靠性
  • 定期测试:定期测试半同步复制的故障切换

运维最佳实践

  • 定期监控:监控半同步复制的状态和性能
  • 定期检查:检查从库的复制状态和延迟
  • 定期维护:维护从库的性能和健康状态
  • 文档化:记录半同步复制的配置和变更
  • 培训:确保运维人员了解半同步复制的原理和故障处理

案例分析

案例一:金融系统的半同步复制部署

业务需求

  • 高数据一致性
  • 低复制延迟
  • 高可用性

部署方案

  • 主库:启用半同步复制,设置超时时间为3秒
  • 从库:部署2个从库,启用半同步复制
  • 等待点:使用AFTER_SYNC模式
  • 网络:使用万兆网络

优化效果

  • 数据一致性得到保障
  • 主库响应时间仅增加10-20ms
  • 系统可用性提高到99.99%

案例二:电商系统的半同步复制优化

问题

  • 主库响应时间过长
  • 半同步复制频繁降级

原因分析

  • 网络延迟较大(跨机房部署)
  • 从库性能不足
  • 超时时间设置过短

解决方案

  • 调整超时时间为10秒
  • 升级从库硬件配置
  • 启用从库并行复制
  • 优化网络连接

优化效果

  • 主库响应时间减少50%
  • 半同步复制降级次数减少90%
  • 系统稳定性明显提高

与其他复制模式的对比

异步复制

  • 优点:性能好,主库响应快
  • 缺点:数据一致性差,可能丢失数据
  • 适用场景:对数据一致性要求不高,追求高性能的场景

半同步复制

  • 优点:数据一致性较好,性能适中
  • 缺点:主库响应时间增加
  • 适用场景:对数据一致性有一定要求,同时需要较好性能的场景

全同步复制

  • 优点:数据一致性最好
  • 缺点:性能较差,主库响应慢
  • 适用场景:对数据一致性要求极高的场景,如金融交易

增强半同步复制

  • 优点:结合了半同步和异步的优点
  • 缺点:配置复杂
  • 适用场景:对数据一致性和性能都有较高要求的场景

常见问题(FAQ)

Q1: 半同步复制能保证100%的数据一致性吗?

A1: 半同步复制不能保证100%的数据一致性,但相比异步复制有明显提升。在主库崩溃的情况下,可能会有少量未确认的事务丢失。如果需要更强的数据一致性,可以考虑使用全同步复制或分布式一致性协议。

Q2: 半同步复制对主库性能的影响有多大?

A2: 半同步复制对主库性能的影响取决于网络延迟和从库性能。在网络延迟较小的情况下,性能影响通常在5-10%左右。在网络延迟较大的情况下,性能影响可能会更大。通过合理配置和优化,可以将性能影响降到最低。

Q3: 半同步复制支持多从库吗?

A3: 是的,半同步复制支持多从库。主库可以配置等待多个从库的确认,通过 rpl_semi_sync_master_wait_for_slave_count 参数设置。等待的从库数量越多,数据一致性越好,但主库响应时间也会越长。

Q4: 半同步复制与GTID复制兼容吗?

A4: 是的,半同步复制与GTID复制完全兼容。实际上,推荐同时使用这两个功能,以提高复制的可靠性和管理的便利性。

Q5: 如何在半同步复制和异步复制之间切换?

A5: 半同步复制可以自动在超时后切换到异步复制,当从库恢复后又会自动切换回半同步复制。也可以手动切换:

sql
-- 切换到异步复制
SET GLOBAL rpl_semi_sync_master_enabled = 0;

-- 切换到半同步复制
SET GLOBAL rpl_semi_sync_master_enabled = 1;

Q6: 半同步复制对网络带宽有什么要求?

A6: 半同步复制对网络带宽有一定要求,特别是在事务量较大的情况下。建议主从库之间使用高速网络,带宽至少为1Gbps,对于大事务场景,建议使用10Gbps网络。

Q7: 如何监控半同步复制的状态?

A7: 可以通过以下方式监控半同步复制的状态:

  • SQL命令SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync%'
  • MySQL Enterprise Monitor:提供半同步复制的监控面板
  • Prometheus + Grafana:通过exporter监控半同步复制状态
  • Zabbix:配置半同步复制的监控项和触发器

Q8: 半同步复制支持跨版本复制吗?

A8: 半同步复制支持跨版本复制,但需要注意版本兼容性。建议从库版本不低于主库版本,以确保插件功能正常。在升级过程中,应先升级从库,再升级主库。

Q9: 如何处理半同步复制中的从库延迟?

A9: 处理从库延迟的方法包括:

  • 优化从库性能:增加CPU、内存和磁盘资源
  • 启用并行复制:提高从库的复制速度
  • 优化网络连接:减少网络延迟
  • 拆分大事务:避免单个大事务阻塞复制
  • 合理设置超时时间:根据从库延迟情况调整

Q10: 半同步复制适合所有场景吗?

A10: 半同步复制不适合所有场景,主要考虑以下因素:

  • 网络条件:网络延迟较大的场景不适合
  • 性能要求:对主库响应时间要求极高的场景不适合
  • 数据一致性要求:对数据一致性要求不高的场景可以使用异步复制
  • 从库性能:从库性能不足的场景可能导致频繁降级

应根据具体的业务需求和环境条件选择合适的复制模式。