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

