Mysql主庫跑太快,從庫追不上怎麼做

2022-07-01 09:39:09 字數 2097 閱讀 6220

寫這篇文章是因為之前有一次刪庫操作,需要進行批量刪除資料,當時沒有控制好刪除速度,導致產生了主從延遲,出現了一點小事故。

隨著日益增長的訪問量,單台資料庫的應接能力已經捉襟見肘。因此採用主庫寫資料,從庫讀資料這種將讀寫分離開的主從架構便隨之衍生了出來。

在生產環境中,常見的主從架構有很多種,在這裡給大家介紹幾種比較常見的架構模式。

對於主從來說,通常的操作是主庫用來寫入資料,從庫用來讀取資料。這樣的好處是通過將讀寫壓力分散開,避免了所有的請求都打在主庫上。同時通過從庫進行水平擴充套件使系統的伸縮性及負載能力也得到了很大的提公升。

但是問題就來了,讀從庫時的資料要與主庫保持一致,那就需要主庫的資料在寫入後同步到從庫中。如何保持主庫與從庫的資料一致性,主庫又是通過什麼樣的方式將資料實時同步到從庫的?

基本原理

mysql主從複製時有兩個很重要的日誌檔案

binlog (二進位制日誌檔案)

relay log (中繼日誌檔案)

在主從同步的過程中,主庫會將所有的操作事件記錄在 binlog 中,從庫通過開啟乙個 i/o 執行緒保持與主庫的通訊,並在一定時間間隔內探測 binlog 日誌檔案是否發生改變。如果 binlog 日誌發生了變化,主庫生成乙個 binlog dump 執行緒向從庫 i/o 執行緒傳送 binlog。從庫上的 i/o 執行緒將 binlog 複製到自己的 relay log 中。最終由從庫中的 sql 執行緒讀取 relay log 中的事件重放到從庫上.

上面的流程我們已經知道了主從複製的相關過程了,但是主庫有更新就會同步從庫,那為什麼會出現主從延遲的情況呢?

隨機重放

mysql 主庫中寫 binlog 的操作是順序寫的,之前我們提到過,磁碟的順序讀寫速度是很快的。同樣的,從庫中的 i/o 執行緒操作日誌的速度效率也是很高的。但是別忘了,還有乙個 sql 執行緒來進行資料重放,而重放的過程是隨機寫盤的。到這裡你應該就明白了吧,某一時刻 relay log 裡的資料來不及重放進從庫,就會產生主從延遲的情況

主庫併發高

知道了從庫中 sql 執行緒的重放情況,對於主庫併發高導致主從延遲肯定就不難理解了。某一時刻,大量寫請求打到主庫上,意味著要不斷對 binlog 進行寫入,此時從庫中的 sql 執行緒就會應接不暇,自然會產生主從延遲。

鎖等待對於 sql 單執行緒來說,當遇到阻塞時就會一直等待,直到執行成功才會繼續進行。如果某一時刻從庫因為查詢產生了鎖等待的情況,此時只有當前的操作執行完成後才會進行下面的操作,同理也就產生了主從延遲的情況。

知道了主從延遲的原因,接下來我們看看如何來進行處理。

並行複製

既然 sql 單執行緒進行重放時速度有限,那麼能不能採用多執行緒的方式來進行重放呢?mysql 5.6 版本後,提供了一種並行複製的方式,通過將 sql 執行緒轉換為多個 work 執行緒來進行重放,這樣就解決了主從延遲的問題。

降低主庫併發

你可能會說了,我現在用的低版本的資料庫,也沒法公升版本啊,那我怎麼整。對於主庫併發高的情況,這種方式你只能通過控制併發來解決延遲了,多用用 redis。

讀主庫這種情況你肯定不陌生,對於一些實時性要求比較高的資料,你總不能讀從庫去拿吧,萬一延遲個大半天,你不得貢獻自己的年終獎啊。

主從複製原理

主從複製原因

主從延遲處理

Redis 主庫從庫如何保證資料一致

redis核心技術與實戰 06 資料盡量少丟失 通過 aof 和 rdb 保證 服務盡量少中斷 通過增加副本冗餘量來保證,將乙份資料同時儲存在多個例項上。即使有乙個例項出現了故障,需要過一段時間才能恢復,其他例項也可以對外提供服務,不會影響業務使用。目錄 一 主從庫模式 主從複製讀寫分離 以相對小開...

ogg主庫更新從庫沒有該記錄的處理辦法

目的庫複製程序引數如下 replicat repep userid goldengate,password goldengate gettruncates allownoopupdates assumetargetdefs dboptions suppresstriggers dboptions d...

mysql 從庫日誌 MySQL 從庫日誌比主庫多

宣告 本文可能無法幫到所有人,只是分享給真正需要的人,如果你已經會了,複習一遍,也沒什麼壞處 在群裡聊天的時候,乙個群友說,生產庫主庫宕機,但是主從資料庫資料一致,但是從庫的日誌比主庫多,很是不理解!諮詢後發現,生產庫的主庫沒有設定sync binlog 1,而是為sync binlog 0 因此,...