MySQL主從延遲現(xiàn)象及原理分析詳解
一、現(xiàn)象
凌晨對線上一張表添加索引,表數(shù)據(jù)量太大(1億+數(shù)據(jù),數(shù)據(jù)量50G以上),造成主從延遲幾個小時,各個依賴從庫的系統(tǒng)無法查詢數(shù)據(jù),最終影響業(yè)務(wù)。
現(xiàn)在就梳理下主從延遲的原理。
二、原理
根據(jù) MySQL 官方文檔 MySQL Replication Implementation Details 中的描述,MySQL 主從復(fù)制依賴于三個線程:master一個線程(Binlog dump thread),slave兩個線程(I/O thread和SQL thread)。主從復(fù)制流程如下圖:

master 服務(wù)器和 slave 服務(wù)器連接時,創(chuàng)建Binlog dump thread以發(fā)送bin log數(shù)據(jù):
- 一個
Binlog dump thread對應(yīng)一個 slave 服務(wù)器; Binlog dump thread從bin log獲取數(shù)據(jù)時會加鎖,獲取到數(shù)據(jù)后,立即釋放鎖。
當(dāng) slave 服務(wù)器收到 START_SLAVE 命令時,會創(chuàng)建I/O thread和SQL thread:
I/O thread以拉的方式,從 master 讀取事件,并存儲到 slave 服務(wù)器的relay log中;SQL thread從relay log中讀取事件并執(zhí)行;slave可以按照自己的節(jié)奏讀取和更新數(shù)據(jù),也可以隨意操作復(fù)制進程(啟動和停止)。
注: START_SLAVE命令成功啟動線程后,如果后面I/O thread或SQL thread因為某些原因停止,則不會有任何的警告,業(yè)務(wù)方無法感知??梢酝ㄟ^查看 slave 的 error 日志,或者通過 SHOW SLAVE STATUS 查看 slave 上的線程狀態(tài)。
通過 SHOW PROCESSLIST 可查看線程狀態(tài):
Binlog dump thread:
mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 2 User: root Host: localhost:32931 db: NULL Command: Binlog Dump Time: 94 State: Has sent all binlog to slave; waiting for binlog to be updated Info: NULL
I/O thread 和 SQL thread:
mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 10 User: system user Host: db: NULL Command: Connect Time: 11 State: Waiting for master to send event Info: NULL *************************** 2. row *************************** Id: 11 User: system user Host: db: NULL Command: Connect Time: 11 State: Has read all relay log; waiting for the slave I/O thread to update it Info: NULL
三、分析
根據(jù)上面的原理,由于slave是單線程(I/O thread)讀取數(shù)據(jù),單線程(SQL thread)更新數(shù)據(jù),而master是多線程寫入,那么只要master寫入的頻率大于slave讀取更新的頻率,就有可能出現(xiàn)主從延遲的情況,如:
master寫入tps較高,大于slave更新速度;slave執(zhí)行某些語句耗時較長,如持有鎖等;master執(zhí)行某些DDL語句時,執(zhí)行的時間較長,在slave也執(zhí)行相同的時間;
此處創(chuàng)建了索引,咨詢 DBA,產(chǎn)生的bin log文件有100多G,數(shù)據(jù)量太大,導(dǎo)致從庫I/O thread一直讀取DDL操作產(chǎn)生的bin log事件,而影響到正常的業(yè)務(wù)DML事件的更新,從而表現(xiàn)為主從同步延遲。
四、解決方案
從主從延遲的原因來看,解決方案可以從以下幾個方向入手:
- 業(yè)務(wù)選型,對于無法忍受從庫延遲的架構(gòu),可選擇分布式架構(gòu)等,避開從庫延遲問題
- 執(zhí)行時間,對大表進行線上
DDL操作盡量選擇凌晨等業(yè)務(wù)量較小的時候 - 硬件配置,升級從庫硬件配置,如SSD
- 減少請求,增加緩存層,減少讀請求落庫
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
mysql格式化小數(shù)保留小數(shù)點后兩位(小數(shù)點格式化)
今天遇到一個問題,格式化浮點數(shù)的問題,用format(col,2)保留兩位小數(shù)點,出現(xiàn)一個問題,例如下面的語句,后面我們給出解決方法2013-12-12
Xtrabackup使用指南 InnoDB數(shù)據(jù)備份工具
Xtrabackup是一個對InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時不影響數(shù)據(jù)讀寫),是商業(yè)備份工具InnoDB Hotbackup的一個很好的替代品2011-10-10
詳解監(jiān)聽MySQL的binlog日志工具分析:Canal
Canal主要用途是基于MySQL數(shù)據(jù)庫增量日志解析,提供增量數(shù)據(jù)訂閱和消費,目前主要支持MySQL。接下來通過本文給大家介紹監(jiān)聽MySQL的binlog日志工具分析:Canal的相關(guān)知識,感興趣的朋友一起看看吧2020-10-10

