溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL主從延遲原因以及解決方案

發(fā)布時間:2020-08-10 10:17:19 來源:網(wǎng)絡(luò) 閱讀:7958 作者:lyanhong 欄目:數(shù)據(jù)庫

1.MySQL數(shù)據(jù)庫主從同步延遲原理。

    談到MySQL數(shù)據(jù)庫主從同步延遲原理,得從mysql的數(shù)據(jù)庫主從復(fù)制原理說起,mysql的主從復(fù)制都是單線程的操作(mysql5.6版本之前),主庫對所有DDLDML產(chǎn)生binlog,binlog是順序?qū)?,所以效率很高?/span>slaveSlave_IO_Running線程會到主庫取日志,效率會比較高,slaveSlave_SQL_Running線程將主庫的DDLDML操作都在slave實(shí)施。DMLDDLIO操作是隨機(jī)的,不是順序的,因此成本會很高,還可能是slave上的其他查詢產(chǎn)生lock爭用,由于Slave_SQL_Running也是單線程的,所以一個DDL卡主了,需要執(zhí)行10分鐘,那么所有之后的DDL會等待這個DDL執(zhí)行完才會繼續(xù)執(zhí)行,這就導(dǎo)致了延時。有朋友會問:主庫上那個相同的DDL也需要執(zhí)行10分,為什么slave會延時?,答案是master可以并發(fā),Slave_SQL_Running線程卻不可以。

2.MySQL數(shù)據(jù)庫主從同步延遲是怎么產(chǎn)生的。

   當(dāng)主庫的TPS并發(fā)較高時,產(chǎn)生的DDL數(shù)量超過slave一個sql線程所能承受的范圍,那么延時就產(chǎn)生了,當(dāng)然還有就是可能與slave的大型query語句產(chǎn)生了鎖等待。

3.MySQL數(shù)據(jù)庫主從同步延遲解決方案

   最簡單的減少slave同步延時的方案就是在架構(gòu)上做優(yōu)化,盡量讓主庫的DDL快速執(zhí)行。還有就是主庫是寫,對數(shù)據(jù)安全性較高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設(shè)置,而slave則不需要這么高的數(shù)據(jù)安全,完全可以講sync_binlog設(shè)置為0或者關(guān)閉binlog,innodb_flushlog也可以設(shè)置為0來提高sql的執(zhí)行效率。另外就是使用比主庫更好的硬件設(shè)備作為slave。

4.MySQL數(shù)據(jù)庫主從同步延遲產(chǎn)生的因素。
1.
網(wǎng)絡(luò)延遲
2. master
負(fù)載
3. slave
負(fù)載
一般的做法是,使用多臺slave來分?jǐn)傋x請求,再從這些slave中取一臺專用的服務(wù)器,只作為備份用,不進(jìn)行其他任何操作,就能相對最大限度地達(dá)到實(shí)時的要求了

另外,再介紹2個可以減少延遲的參數(shù)
–slave-net-timeout=seconds
參數(shù)含義:當(dāng)slave從主數(shù)據(jù)庫讀取log數(shù)據(jù)失敗后,等待多久重新建立連接并獲取數(shù)據(jù)
slave_net_timeout
單位為秒 默認(rèn)設(shè)置為 3600
| slave_net_timeout | 3600
–master-connect-retry=seconds
參數(shù)含義:當(dāng)重新建立主從連接時,如果連接建立失敗,間隔多久后重試。
master-connect-retry
單位為秒 默認(rèn)設(shè)置為 60
通常配置以上2個參數(shù)可以減少網(wǎng)絡(luò)問題導(dǎo)致的主從數(shù)據(jù)同步延遲

 


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI