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)来获取与降级相关的信息。

使用半同步复制的好处

  • 提高数据一致性:与异步复制相比,半同步复制能够确保至少有一个从服务器已经接收到并记录了主服务器上的事务,从而提高了数据的一致性。
  • 减少数据丢失的风险:在发生故障转移时,由于至少有一个从服务器已经接收到事务,因此可以减少数据丢失的风险。
  • 性能适中:虽然半同步复制可能会对主服务器的性能产生一定影响(因为需要等待确认),但这种影响通常小于同步复制,并且比异步复制提供了更高的数据一致性保障。如果网络延迟较高或不稳定,可能会影响事务的提交性能。
相关推荐
C吴新科3 小时前
MySQL入门操作详解
mysql
Ai 编码助手5 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
陈燚_重生之又为程序员5 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle5 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻5 小时前
MySQL排序查询
数据库·mysql
萧鼎5 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^5 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋36 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
荒川之神6 小时前
ORACLE _11G_R2_ASM 常用命令
数据库·oracle
IT培训中心-竺老师6 小时前
Oracle 23AI创建示例库
数据库·oracle