半同步主從復制的概念
半同步主從復制(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服務器配置
// 主服務器安裝半同步插件
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服務器配置
// 主服務器安裝半同步插件
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;