半同步主从复制的概念
半同步主从复制(Semisynchronous Replication, SBR)是MySQL数据库中的一种数据复制方式,它在异步复制的基础上增加了一定程度的同步性,旨在提高数据安全性,减少数据丢失的风险。
半同步主从复制的原理
- 主服务器(Master)操作:客户端向主服务器发起写操作(如INSERT、UPDATE、DELETE等)。主服务器执行这些操作,并将它们封装在一个或多个事务中。事务完成后,主服务器将事务的所有更改记录到其本地的二进制日志(Binary Log, binlog)。
- binlog记录与传输:主服务器上运行的log dump线程负责通知从服务器来拿取二进制日志。
- 等待从服务器确认:与异步复制不同,半同步复制要求主服务器在提交事务后,等待至少一个从服务器的确认。即从服务器必须在接收到二进制日志并写入到中继日志(Relay Log)后将结果反馈给主服务器。主服务器接收到确认后,才将事务commit写入磁盘中。
- 从服务器操作:从服务器启动一个I/O线程,该线程连接到主服务器并请求从某个特定的binlog位置(如最后一次同步的位置)开始复制。I/O线程接收到主服务器发来的二进制日志后,将其写入到从服务器本地的中继日志。当I/O线程将二进制日志写入中继日志后,会向主服务器发送一个确认消息,表明已成功接收并持久化该事件。
- 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;