mysql半同步復制的項目實踐
題目詳細答案
工作流程
(1)從庫會在連接到主庫時告訴主庫,它是不是配置了半同步。
(2)如果半同步復制在主庫端開啟,并且至少有一個半同步復制的從庫節(jié)點,那么此時主庫的事務線程在提交時會被阻塞并等待,結果有兩種可能:
(a)至少一個從庫節(jié)點通知它已經(jīng)收到了所有這個事務的Binlog事件;
(b)一直等待直到超過配置的某一個時間點為止,此時,半同步復制將自動關閉,轉(zhuǎn)換為異步復制。
(3)從庫節(jié)點只有在接收到某一個事務的所有 Binlog,將其寫入到 Relay Log 文件之后,才會通知對應主庫上面的等待線程。
(4)如果在等待過程中,等待時間已經(jīng)超過了配置的超時時間,沒有任何一個從節(jié)點通知當前事務,那么此時主庫會自動轉(zhuǎn)換為異步復制,當至少一個半同步從節(jié)點趕上來時,主庫便會自動轉(zhuǎn)換為半同步方式的復制。
(5)半同步復制必須是在主庫和從庫兩端都開啟時才行,如果在主庫上沒打開,或者在主庫上開啟了而在從庫上沒有開啟,主庫都會使用異步方式復制。
配置半同步復制
在主服務器上
安裝半同步復制插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
啟用半同步復制:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
設置超時時間(可選):
SET GLOBAL rpl_semi_sync_master_timeout = 10000; -- 單位為毫秒
在從服務器上
安裝半同步復制插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
啟用半同步復制:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
檢查半同步復制狀態(tài)
在主服務器上:
SHOW STATUS LIKE 'Rpl_semi_sync%';
在從服務器上:
SHOW STATUS LIKE 'Rpl_semi_sync%';
MySQL 半同步復制(Semi-Sync Replication):工作流程與配置實戰(zhàn)
半同步復制是 MySQL 中平衡數(shù)據(jù)安全性與性能的核心復制模式,它在異步復制的基礎上增加了 “主庫等待從庫確認” 的機制,既避免了全同步的性能損耗,又降低了異步復制的數(shù)據(jù)丟失風險。本文將詳細解析其工作流程、配置步驟及狀態(tài)檢查方法,幫助你快速落地半同步復制架構。
一、半同步復制的核心工作流程
半同步復制的核心邏輯是 “主庫提交事務前,等待至少一個從庫確認接收日志”,具體流程可拆解為 5 個關鍵步驟:
1. 初始化協(xié)商:主從確認復制模式
- 從庫啟動時,會通過復制連接向主庫發(fā)送 “是否支持半同步” 的標識;
- 主庫檢查自身半同步配置(
rpl_semi_sync_master_enabled),若啟用,則與從庫協(xié)商使用半同步模式; - 關鍵點:僅當主庫和從庫同時啟用半同步時,才會進入半同步流程,否則自動降級為異步復制。
2. 主庫事務提交與阻塞等待
- 主庫執(zhí)行事務(如
UPDATE/INSERT),完成本地操作(寫入 binlog、InnoDB 引擎提交)后,不會立即向客戶端返回成功; - 主庫的事務線程進入阻塞狀態(tài),等待至少一個從庫的 “日志接收確認”;
- 等待結果有兩種可能:
- (a)超時前收到確認:至少一個從庫返回 “已接收并寫入中繼日志(relay log)”,主庫立即完成提交并向客戶端返回 “成功”;
- (b)超時未收到確認:等待時間超過
rpl_semi_sync_master_timeout(默認 10 秒),主庫自動切換為異步復制,向客戶端返回 “成功”(此時存在數(shù)據(jù)丟失風險)。
3. 從庫接收日志并返回確認
- 從庫的 I/O 線程持續(xù)接收主庫發(fā)送的 binlog 日志;
- 當從庫接收到完整的事務 binlog 并寫入本地中繼日志后,向主庫返回 “ACK 確認”(告知主庫 “日志已安全存儲”);
- 注意:從庫僅確認 “收到日志”,無需等待事務應用到數(shù)據(jù)(即無需 SQL 線程執(zhí)行),這是半同步與全同步的核心區(qū)別(全同步需等待應用完成)。
4. 主庫復制模式的動態(tài)切換
- 若主庫因超時而切換為異步復制后,當有從庫重新追上并正常返回確認時,主庫會自動切回半同步模式;
- 切換過程對應用透明,無需人工干預,保證了復制模式的靈活性。
5. 異常場景處理
- 若從庫宕機或網(wǎng)絡中斷,主庫在等待超時后切換為異步,避免事務長期阻塞;
- 若主庫宕機,已收到確認的從庫必然保存了最新日志,可作為新主庫(數(shù)據(jù)丟失風險極低)。
二、半同步復制的配置步驟
環(huán)境準備
- 主庫:MySQL 5.7+(支持半同步插件),已配置基本主從(參考前文主從同步配置);
- 從庫:與主庫版本一致,已通過異步復制連接主庫。
步驟 1:主庫配置半同步
- 安裝半同步主庫插件
半同步功能通過插件實現(xiàn),需先安裝:
-- 登錄主庫 mysql -u root -p -- 安裝插件(Linux 系統(tǒng),Windows 為 semisync_master.dll) INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
若提示 “Plugin already installed”,說明已安裝,可跳過。
- 啟用半同步復制
-- 臨時啟用(重啟失效) SET GLOBAL rpl_semi_sync_master_enabled = 1; -- 永久啟用(需修改 my.cnf,重啟生效) [mysqld] rpl_semi_sync_master_enabled = 1
- 配置超時時間(可選)
設置主庫等待從庫確認的超時時間(默認 10000 毫秒 = 10 秒):
-- 臨時設置為 5 秒 SET GLOBAL rpl_semi_sync_master_timeout = 5000; -- 永久設置(my.cnf) [mysqld] rpl_semi_sync_master_timeout = 5000
步驟 2:從庫配置半同步
- 安裝半同步從庫插件
-- 登錄從庫 mysql -u root -p -- 安裝插件 INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
- 啟用半同步復制
-- 臨時啟用 SET GLOBAL rpl_semi_sync_slave_enabled = 1; -- 永久啟用(my.cnf) [mysqld] rpl_semi_sync_slave_enabled = 1
- 重啟從庫 I/O 線程
使半同步配置生效(無需重啟數(shù)據(jù)庫):
STOP SLAVE IO_THREAD; -- 停止 I/O 線程 START SLAVE IO_THREAD; -- 重啟 I/O 線程
三、檢查半同步復制狀態(tài)
配置完成后,需驗證半同步是否正常工作,關鍵通過 SHOW STATUS 查看狀態(tài)變量。
主庫狀態(tài)檢查
SHOW STATUS LIKE 'Rpl_semi_sync%';
核心字段說明:
Rpl_semi_sync_master_enabled:1 表示主庫半同步已啟用;Rpl_semi_sync_master_status:1 表示當前處于半同步模式(0 表示異步);Rpl_semi_sync_master_yes_tx:成功通過半同步提交的事務數(shù);Rpl_semi_sync_master_no_tx:因超時或異常降級為異步的事務數(shù)(若持續(xù)增長,需排查從庫或網(wǎng)絡問題)。
從庫狀態(tài)檢查
SHOW STATUS LIKE 'Rpl_semi_sync%';
核心字段說明:
Rpl_semi_sync_slave_enabled:1 表示從庫半同步已啟用;Rpl_semi_sync_slave_status:1 表示當前從庫參與半同步(0 表示未參與);Rpl_semi_sync_slave_send_ack:從庫向主庫發(fā)送的 ACK 確認次數(shù)(應隨事務增長)。
四、常見問題與注意事項
- 配置后仍為異步模式?
- 檢查主從庫是否同時啟用插件(
rpl_semi_sync_*_enabled均為 1); - 從庫 I/O 線程是否重啟(需執(zhí)行
STOP/START SLAVE IO_THREAD); - 主庫是否有至少一個半同步從庫(
Rpl_semi_sync_master_clients應 ≥ 1)。
- 檢查主從庫是否同時啟用插件(
- 主庫寫入延遲增加?
半同步會增加主庫等待時間(通常 10-100ms),若延遲過大:
- 檢查主從庫網(wǎng)絡延遲(建議同一機房,延遲 < 10ms);
- 適當調(diào)小超時時間(如 5 秒),避免長期阻塞。
- 從庫 ACK 確認不及時?
從庫接收日志慢可能是磁盤 I/O 瓶頸,建議從庫使用 SSD 存儲中繼日志。
五、總結
半同步復制通過 “主庫等待至少一個從庫確認日志接收” 的機制,在性能與數(shù)據(jù)安全間取得了平衡,是生產(chǎn)環(huán)境核心業(yè)務的首選復制模式。其配置關鍵點包括:
- 主從庫同時安裝并啟用半同步插件;
- 合理設置超時時間(根據(jù)網(wǎng)絡延遲調(diào)整);
- 通過狀態(tài)變量監(jiān)控同步模式和確認次數(shù)。
相比異步復制,半同步以微小的性能損耗(額外 10-100ms 延遲)顯著降低了數(shù)據(jù)丟失風險;相比全同步,它又避免了因等待所有從庫導致的性能災難。
到此這篇關于mysql半同步復制的項目實踐的文章就介紹到這了,更多相關mysql半同步復制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解如何在SpringBoot中配置MySQL數(shù)據(jù)庫的連接數(shù)
在Spring Boot中配置MySQL數(shù)據(jù)庫連接數(shù)通常涉及到兩個主要的配置,數(shù)據(jù)源配置和連接池配置,本文給大家介紹了Spring Boot項目如何配置MySQL數(shù)據(jù)庫連接數(shù)的詳細步驟,并通過代碼示例講解的非常詳細,需要的朋友可以參考下2024-06-06
2022最新版MySQL 8.0.30 安裝及配置教程(小白入門)
這篇文章主要介紹了2022最新版MySQL 8.0.30 安裝及配置教程,安裝過程算是比較簡單的,今天給大家分享的此文比較適合mysql數(shù)據(jù)庫的小白,需要的朋友可以參考下2022-09-09
MySQL優(yōu)化表時提示 Table is already up to date的解決方法
這篇文章主要介紹了MySQL優(yōu)化表時提示 Table is already up to date的解決方法,需要的朋友可以參考下2016-11-11
完美解決mysql in條件語句只讀取一條信息問題的2種方案
使用mysql多表查詢時一個表中的某個字段作為另一表的in查詢條件,只能讀取一條信息,而直接用數(shù)字的話可以正常讀取2018-04-04
關于MySql數(shù)據(jù)庫Update批量更新不同值的實現(xiàn)方法
這篇文章主要介紹了關于MySql數(shù)據(jù)庫Update批量更新不同值的實現(xiàn)方法,數(shù)據(jù)庫管理系統(tǒng)可以通過SQL管理數(shù)據(jù)庫,定義和操作數(shù)據(jù),維護數(shù)據(jù)的完整性和安全性,需要的朋友可以參考下2023-05-05

