MySQL讀寫分離延遲之讀庫不是主庫的實時鏡像
前言
讀寫分離是后端架構(gòu)常見優(yōu)化:寫走主庫,讀走從庫,降低主庫壓力。但讀庫不是主庫的實時鏡像。復(fù)制延遲一旦出現(xiàn),用戶剛寫完數(shù)據(jù)馬上讀,就可能讀到舊值。這個問題在訂單、權(quán)限、配置、AI 任務(wù)狀態(tài)里都很敏感。
讀寫分離不能只看吞吐,還要設(shè)計一致性體驗。
一、復(fù)制延遲是常態(tài)風(fēng)險
sequenceDiagram participant App participant Primary participant Replica App->>Primary: Write Primary-->>App: Success Primary->>Replica: Replication App->>Replica: Read Replica-->>App: Old Data
寫成功只代表主庫提交,不代表從庫已經(jīng)追上。延遲可能來自大事務(wù)、網(wǎng)絡(luò)、從庫 IO 或 SQL 線程壓力。
二、關(guān)鍵讀走主庫
寫后立刻讀的場景,可以短時間走主庫。
read_policy: after_write_window: 3s critical_resource: primary normal_list_page: replica
不是所有讀都要強一致。關(guān)鍵是把需要強一致的場景識別出來。
三、監(jiān)控復(fù)制延遲
SHOW REPLICA STATUS;
關(guān)注 Seconds_Behind_Source 只是開始,還要結(jié)合 relay log、IO thread、SQL thread 狀態(tài)。延遲指標(biāo)也要進(jìn)入應(yīng)用路由策略。
四、任務(wù)狀態(tài)別亂走讀庫
AI 后臺任務(wù)狀態(tài)、支付狀態(tài)、權(quán)限變更這類強依賴最新值的讀,不適合默認(rèn)走從庫。否則用戶會看到任務(wù)完成后頁面還顯示處理中。
strong_read_tables: - payment_order - ai_job_status - user_permission
架構(gòu)上可以給 DAO 或 repository 標(biāo)記一致性等級,而不是讓業(yè)務(wù)代碼隨手選數(shù)據(jù)源。
還可以在寫入后設(shè)置短期一致性標(biāo)記。比如用戶剛更新資料,接下來幾秒內(nèi)該用戶相關(guān)讀取走主庫。這樣不必讓所有請求都走主庫,也能保護(hù)寫后讀體驗。
read_after_write: key: user_id ttl: 3s route: primary
這種策略要謹(jǐn)慎控制范圍,否則會把主庫讀壓力重新打滿。
五、總結(jié)
MySQL 讀寫分離能提升讀能力,但讀庫不是主庫實時鏡像。寫后讀、任務(wù)狀態(tài)、權(quán)限、支付等場景要考慮強一致讀取。
讀寫分離不是把所有 SELECT 扔給從庫。知道哪些讀不能分,才是成熟架構(gòu)。
復(fù)制延遲不可怕,可怕的是業(yè)務(wù)假裝它不存在。把一致性等級顯式寫進(jìn)代碼,團(tuán)隊才知道自己在做什么取舍。
讀路由還要支持緊急切換。當(dāng)從庫延遲超過閾值時,關(guān)鍵讀自動回主庫,普通讀可以降級或提示稍后刷新。
replica_lag_policy: warn_at: 1s strong_read_to_primary_at: 2s disable_replica_at: 5s
這會增加主庫壓力,所以閾值要謹(jǐn)慎。但沒有策略,就只能在事故中手動改配置。
還要給用戶體驗留解釋。比如剛提交的配置還在同步中,可以提示“更新已保存,部分頁面可能稍后刷新”。這比讓用戶看到舊數(shù)據(jù)卻沒有解釋更好。
user_feedback: write_success: "已保存" replica_lag_hint: "數(shù)據(jù)同步中,請稍后刷新" force_primary_for_detail: true
當(dāng)然,支付、權(quán)限、任務(wù)狀態(tài)這類核心鏈路不要靠提示解決,應(yīng)該直接強一致讀取。提示只能用于低風(fēng)險體驗場景。
到此這篇關(guān)于MySQL讀寫分離延遲之讀庫不是主庫的實時鏡像的文章就介紹到這了,更多相關(guān)MySQL 讀寫分離延遲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL查詢結(jié)果實現(xiàn)發(fā)送給客戶端
這篇文章主要介紹了MYSQL查詢結(jié)果實現(xiàn)發(fā)送給客戶端方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-06-06
Mysql實現(xiàn)合并多個分組(GROUP_CONCAT及其平替函數(shù))
MySQL 中提供了多種合并字符串的函數(shù)和操作方法,包括 GROUP_CONCAT、CONCAT_WS 和 CONCAT 等,本文介紹了 MySQL 中 GROUP_CONCAT 函數(shù)以及 CONCAT_WS、CONCAT 函數(shù)并通過示例代碼演示了它們的用法,感興趣的可以了解一下2023-10-10

