半同步主从复制

半同步主从复制的概念

半同步主从复制(Semisynchronous Replication, SBR)是MySQL数据库中的一种数据复制方式,它在异步复制的基础上增加了一定程度的同步性,旨在提高数据安全性,减少数据丢失的风险。

半同步主从复制的原理

  1. 主服务器(Master)操作:客户端向主服务器发起写操作(如INSERT、UPDATE、DELETE等)。主服务器执行这些操作,并将它们封装在一个或多个事务中。事务完成后,主服务器将事务的所有更改记录到其本地的二进制日志(Binary Log, binlog)。
  2. binlog记录与传输:主服务器上运行的log dump线程负责通知从服务器来拿取二进制日志。
  3. 等待从服务器确认:与异步复制不同,半同步复制要求主服务器在提交事务后,等待至少一个从服务器的确认。即从服务器必须在接收到二进制日志并写入到中继日志(Relay Log)后将结果反馈给主服务器。主服务器接收到确认后,才将事务commit写入磁盘中。
  4. 从服务器操作:从服务器启动一个I/O线程,该线程连接到主服务器并请求从某个特定的binlog位置(如最后一次同步的位置)开始复制。I/O线程接收到主服务器发来的二进制日志后,将其写入到从服务器本地的中继日志。当I/O线程将二进制日志写入中继日志后,会向主服务器发送一个确认消息,表明已成功接收并持久化该事件。
  5. SQL线程执行:另一个在从服务器上运行的SQL线程负责读取中继日志中的事件,并按照事件在binlog中的顺序在从服务器上重新执行这些操作,以保持数据的一致性。

半同步主从复制的操作

1、环境准备

需要两台搭建好异步主从复制的服务器。

2、master服务器配置

sql 复制代码
// 主服务器安装半同步插件
root@(none) master-mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

// 修改配置
root@(none) master-mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1;
root@(none) master-mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

[root@master ~] vim /etc/my.cnf
# 添加
[mysqld]
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_master_enabled=1

// 刷新服务
[root@master ~] service mysqld restart

3、slave服务器配置

sql 复制代码
// 主服务器安装半同步插件
root@(none) slave-mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

// 修改配置
root@(none) slave-mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

[root@slave ~] vim /etc/my.cnf
# 添加
[mysqld]
rpl_semi_sync_slave_enabled=1

// 刷新服务
[root@slave ~] service mysqld restart

延迟备份

延迟备份的作用如下:

1. 数据恢复与容灾

  • 误操作恢复:在生产环境中,由于人为误操作(如误删除数据、表或库)导致的数据丢失是常见的风险。延迟备份允许在误操作发生前的一个时间点停止复制,从而保留误操作之前的数据状态,便于数据恢复。这一点对于避免数据灾难至关重要。
  • 容灾备份:延迟备份可以作为额外的容灾手段,即使主库或实时备份库出现问题,延迟备份库也能提供一定时间前的数据快照,保障数据的安全性和可恢复性。

2. 减轻主库压力

  • 降低同步负载:在高并发或大数据量环境下,实时同步可能会对主库造成较大的性能压力,包括I/O压力、CPU负载等。延迟备份通过控制同步的时机和频率,可以有效减轻主库的压力,避免影响主库的正常业务处理。

其具体操作如下:

// 在slave服务器上操作
root@(none) slave-mysql> stop slave;
// 这里的10为延迟10秒
root@(none) slave-mysql> CHANGE MASTER TO MASTER_DELAY = 10;
root@(none) slave-mysql> start slave;
相关推荐
爱学习的白杨树12 分钟前
什么是MVCC?
java·服务器·数据库
平行线也会相交27 分钟前
云图库平台(三)——后端用户模块开发
数据库·spring boot·mysql·云图库平台
恒辉信达1 小时前
hhdb客户端介绍(53)
数据库·mysql·hhdb·数据库可视化界面客户端
指尖上跳动的旋律3 小时前
shell脚本定义特殊字符导致执行mysql文件错误的问题
数据库·mysql
一勺菠萝丶3 小时前
MongoDB 常用操作指南(Docker 环境下)
数据库·mongodb·docker
m0_748244834 小时前
StarRocks 排查单副本表
大数据·数据库·python
C++忠实粉丝4 小时前
Redis 介绍和安装
数据库·redis·缓存
wmd131643067125 小时前
将微信配置信息存到数据库并进行调用
数据库·微信
是阿建吖!5 小时前
【Linux】基础IO(磁盘文件)
linux·服务器·数据库
凡人的AI工具箱5 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite