怎样解决MySQL数据库主从复制延迟的问题?
1.網(wǎng)絡(luò)超時(shí)
2.慢查詢
3.流量
問題一:主庫的從庫太多,導(dǎo)致復(fù)制延遲
從庫數(shù)據(jù)以3-5個為宜,要復(fù)制的從節(jié)點(diǎn)數(shù)量過多,會導(dǎo)致復(fù)制延遲
問題二:從庫硬件比主庫差,導(dǎo)致復(fù)制延遲
查看Master和Slave的系統(tǒng)配置,可能會因?yàn)闄C(jī)器配置不當(dāng),包括磁盤I/O、CPU、內(nèi)存等各方面因素造成復(fù)制的延遲。一般發(fā)生在高并發(fā)大數(shù)據(jù)量寫入場景中
問題三:慢SQL語句過多
假如一條SQL語句執(zhí)行時(shí)間是20秒,那么從執(zhí)行完畢到從庫上能查到數(shù)據(jù)至少需要20秒,這樣就延遲20秒了。
一般要把SQL語句的優(yōu)化作為常規(guī)工作不斷地進(jìn)行監(jiān)控和優(yōu)化,如果單個SQL的寫入時(shí)間長,可以修改后分多次寫入。通過查看慢查詢?nèi)罩净騭how full processlist命令,找出執(zhí)行時(shí)間長的查詢語句或大的事務(wù)
問題四:主從復(fù)制的設(shè)計(jì)問題
例如主從復(fù)制單線程,如果主庫寫并發(fā)太大,來不及傳送到從庫,就會導(dǎo)致延遲。更高版本的MySQL可以支持多線程復(fù)制,門戶網(wǎng)站則會開發(fā)自己的多線程同步功能。
問題五:主從庫之間的網(wǎng)絡(luò)延遲
主從庫的網(wǎng)卡、網(wǎng)線、交換機(jī)等網(wǎng)絡(luò)設(shè)備都可能成為復(fù)制的瓶頸,導(dǎo)致復(fù)制延遲。另外,跨公網(wǎng)的主從復(fù)制很容易導(dǎo)致主從復(fù)制延遲
問題六:主庫讀寫壓力大,導(dǎo)致復(fù)制延遲
架構(gòu)的前端要加buffer及緩存層
?
1.MySQL數(shù)據(jù)庫主從同步延遲原理。
答:談到mysql數(shù)據(jù)庫主從同步延遲原理,得從mysql的數(shù)據(jù)庫主從復(fù)制原理說起,mysql的主從復(fù)制都是單線程的操作,主庫對所有DDL和DML產(chǎn)生binlog,binlog是順序?qū)?#xff0c;所以效率很高;slave的Slave_IO_Running線程會到主庫取日志,效率會比較高,slave的Slave_SQL_Running線程將主庫的DDL和DML操作都在slave實(shí)施。DML和DDL的IO操作是隨機(jī)的,不是順序的,因此成本會很高,還可能是slave上的其他查詢產(chǎn)生lock爭用,由于Slave_SQL_Running也是單線程的,所以一個DDL卡主了,需要執(zhí)行10分鐘,那么所有之后的DDL會等待這個DDL執(zhí)行完才會繼續(xù)執(zhí)行,這就導(dǎo)致了延時(shí)。有朋友會問:“主庫上那個相同的DDL也需要執(zhí)行10分,為什么slave會延時(shí)?”,答案是master可以并發(fā),Slave_SQL_Running線程卻不可以。
2.MySQL數(shù)據(jù)庫主從同步延遲是怎么產(chǎn)生的。
答:當(dāng)主庫的TPS并發(fā)較高時(shí),產(chǎn)生的DDL數(shù)量超過slave一個sql線程所能承受的范圍,那么延時(shí)就產(chǎn)生了,當(dāng)然還有就是可能與slave的大型query語句產(chǎn)生了鎖等待。
3.MySQL數(shù)據(jù)庫主從同步延遲解決方案
答:最簡單的減少slave同步延時(shí)的方案就是在架構(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í)時(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)重新建立主從連接時(shí),如果連接建立失敗,間隔多久后重試。
master-connect-retry單位為秒 默認(rèn)設(shè)置為 60秒
通常配置以上2個參數(shù)可以減少網(wǎng)絡(luò)問題導(dǎo)致的主從數(shù)據(jù)同步延遲
轉(zhuǎn)載于:https://www.cnblogs.com/hanling/p/7215354.html
總結(jié)
以上是生活随笔為你收集整理的怎样解决MySQL数据库主从复制延迟的问题?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#逻辑运算符及解析
- 下一篇: linux cmake编译源码,linu