mysql 讀寫分離時可能會出現的坑

現在 mysql 流行的架構就是一主一備多從,讀寫分離。也就是如下圖所示的架構:

通常情況下,數據庫的讀操作多於寫操作,主庫負責讀寫,從庫負責讀取,以便分擔主庫的讀壓力。

那麼現在有這種情況,用戶在前端添加了數據,數據寫入主庫,然後在讀取已經添加的數據的時候,由負載均衡器分到了從庫,讀從庫時並沒有讀取到新添加的數據,這是爲什麼呢?

主庫寫完數據後將 binlog 發送給從庫,從庫依據 binlog 來同步數據,這有一定的延遲。因此讀取從庫時並未讀取到新添加的數據。

遇到這種情況怎麼辦?

有三種解決方法:

第一種:sleep,在添加完數據後,等待一定的時間後再進行查詢,此時從庫基本已經更新完畢。還有一種更爲巧妙的處理情況,添加數據 ajax 提交數據後,直接在前端顯示 ajax 提交的數據做爲新添加的數據顯示在結果界面,用戶再刷新時其實已經完了一段時間,這時從庫已經更新完比。

第二種:強制走主庫。對於這種添加後立即需要查詢數據請求,可以直接由主庫返回查詢結果,具體來說,對於必須要拿到最新結果的請求,強制將其發到主庫上,對於可以讀到舊數據的請求,纔將其發到從庫上。

第三種:引入半同步機制。比如說主庫收到添加數據的請求後,自己先添加數據,然後將 binlog 發送給從庫,從庫收到後返回 ack,然後主庫再返回能給客戶端“事務完成”的確認。這種機制的名稱叫做 semi-sync 。

以上問題很有可能在面試中問到,建議大家做深入瞭解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章