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.so
和semisync_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_master
和rpl_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)来获取与降级相关的信息。
使用半同步复制的好处
- 提高数据一致性:与异步复制相比,半同步复制能够确保至少有一个从服务器已经接收到并记录了主服务器上的事务,从而提高了数据的一致性。
- 减少数据丢失的风险:在发生故障转移时,由于至少有一个从服务器已经接收到事务,因此可以减少数据丢失的风险。
- 性能适中:虽然半同步复制可能会对主服务器的性能产生一定影响(因为需要等待确认),但这种影响通常小于同步复制,并且比异步复制提供了更高的数据一致性保障。如果网络延迟较高或不稳定,可能会影响事务的提交性能。