MySQL半同步复制

1.MySQL主从复制模式

1.1异步复制

异步复制为 MySQL 默认的复制模式,指主库写 binlog、从库 I/O 线程读 binlog 并写入 relaylog、从库 SQL 线程重放事务这三步之间是异步的。

异步复制的主库不需要关心备库的状态,主库不保证事务被传输到从库,如果主库崩溃,某些事务可能还未发送到从库,切换后可能导致事务的丢失。

【优点】是可以有更高的吞吐量,【缺点】是不能保持数据实时一致,不适合要求主从数据一致性要求较高的应用场景。

1.2同步复制

同步复制的模式下,主库在提交事务前,必须确认事务在所有的备库上都已经完成提交。当主库执行完客户端提交的事务后,需要等到所有从库也都执行完这一事务后,才返回给客户端执行成功。因为要等到所有从库都执行完,【缺点】执行过程中会被阻塞,等待返回结果,所以性能上会有很严重的影响,其【优点】是任何时候主备库都是一致的,主库的崩溃不会丢失事务。

1.3半同步复制

它结合了异步复制和同步复制的优点。在半同步复制中,主服务器在确认从服务器已经接收并且记录了事件之后才继续执行其他事件,从而减少了数据丢失。MySQL5.5开始通过插件的方式支持半同步复制。

与同步复制相比,半同步复制速度快很多,因为它只需要至少1个从库确认写入 relaylog,并不需要完成在从库上的事务提交,同时又比异步复制更安全,因为主库在提交时,事务至少已经存在2个地方(主库的 binlog 和从库的 relaylog)。

由于半同步复制在提交事务前,需要从库返还确认信息,所以这里涉及到网络的往返通信开销,因此半同步复制只适合在网络条件较好且地理上距离不远的环境部署,否则可能会因为网络延迟大幅降低主库性能。

2.MySQL半同步复制

MySQL官方提供的半同步复制插件semisync_master.sosemisync_slave.so,登录MySQL服务器,在MySQL命令行客户端中执行以下命令来安装插件:

-- 在主服务器上安装

sql 复制代码
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';  

-- 在从服务器上安装

sql 复制代码
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

安装插件后,可以通过执行SHOW PLUGINS;命令来验证插件是否成功安装,在输出中查找rpl_semi_sync_masterrpl_semi_sync_slave插件,并确保它们的Status列为ACTIVE

如果需要卸载,则执行UNINSTALL PLUGIN plugin_name语句,其中plugin_name是要卸载的插件名称。

在主服务器的配置文件中添加:

powershell 复制代码
[mysqld]  
rpl_semi_sync_master_enabled = 1  
rpl_semi_sync_master_timeout = 10000  # 超时时间,单位毫秒

在从服务器的配置文件中添加:

powershell 复制代码
[mysqld]  
rpl_semi_sync_slave_enabled = 1

rpl_semi_sync_master_enabled 作用于主库(Master)是否启用半同步复制功能,开启后主服务器会等待至少一个从服务器确认它已经接收并记录了二进制日志事件中的事务,然后才会向客户端报告事务已提交;

如果在从库上尝试设置 rpl_semi_sync_master_enabled 为 ON,MySQL 实际上会忽略这个设置。由于从库不是复制过程中的"主"节点,因此设置该参数不会对复制过程产生任何积极影响。它不会改变从库的行为或性能。

rpl_semi_sync_slave_enabled 用于控制从库(Slave)是否启用半同步复制功能,开启后从服务器会将其接收到的事务写入中继日志并应用这些事务后,向主服务器发送一个确认消息。这个确认消息是半同步复制机制中主服务器等待的"至少一个确认"。

在某些情况下,如果主库无法及时从从库接收到确认信息(例如,从库宕机或网络故障),主库会根据 rpl_semi_sync_master_timeout 参数(单位毫秒,行内基线为5000)设置的超时时间来决定是否继续等待或降级为异步复制(过短的超时时间可能导致频繁地切换到异步复制模式);

【降级日志】

可以通过查看复制状态的相关变量(如SHOW STATUS LIKE 'Rpl_semi_sync_master_status';)来推断复制模式是否已更改

可以通过查看MySQL的错误日志(Error Log)来获取与降级相关的信息。

使用半同步复制的好处

  • 提高数据一致性:与异步复制相比,半同步复制能够确保至少有一个从服务器已经接收到并记录了主服务器上的事务,从而提高了数据的一致性。
  • 减少数据丢失的风险:在发生故障转移时,由于至少有一个从服务器已经接收到事务,因此可以减少数据丢失的风险。
  • 性能适中:虽然半同步复制可能会对主服务器的性能产生一定影响(因为需要等待确认),但这种影响通常小于同步复制,并且比异步复制提供了更高的数据一致性保障。如果网络延迟较高或不稳定,可能会影响事务的提交性能。
相关推荐
zandy10111 小时前
多租户SaaS架构下的BI数据隔离与权限治理体系
数据库·架构·数据加密
多巴胺梦想家1 小时前
NoSQL 数据库:不只是关系型
数据库·nosql
数字孪生家族2 小时前
3DGS 数据编辑单体化技术:将高斯重建转化为结构化数字空间资产
数据库·3d·高斯泼溅·空间智能应用
广州灵眸科技有限公司2 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) 系统操作-线进程操作
数据库·单片机·嵌入式硬件·算法·php
石一峰6993 小时前
驱动:私有数据为什么要在三个地方各挂一遍?
数据库·python·算法
摸鱼号20233 小时前
在 Rocky Linux 10.1 Minimal 上安装 MySQL 9.7 的血泪史:MariaDB 到底有多“根深蒂固”?
mysql
ClouGence4 小时前
跨云、跨地域数据同步,这样更省心
数据库·sql·saas
TDengine (老段)4 小时前
TDengine 函数完整参考 — 聚合、时序、字符串、时间、数学
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
TDengine (老段)5 小时前
昆仑数智选择 TDengine TSDB,提升页岩气生产运行可视化与精细化管理能力
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
陆水A5 小时前
【问数系统】SQL跑对了图表却空了?打通问数系统最后1公里的3个API坑
大数据·数据库·自然语言处理·big data·etl工程师