互聯(lián)網(wǎng)場(chǎng)景一般讀請(qǐng)求次數(shù)遠(yuǎn)大于寫請(qǐng)求育谬。筆者所在的公司膛檀,跨境電商場(chǎng)景,讀寫比高達(dá)100:1 泳炉!所以在業(yè)務(wù)量上漲之后花鹅,讀寫分離是一個(gè)很好的性能優(yōu)化方案刨肃。
那么問(wèn)題來(lái)了, 一旦啟動(dòng)讀寫分離的方案膏潮,從庫(kù)的延遲變得極為敏感满力。
首先介紹下 MySQL主從復(fù)制的原理:
主庫(kù)上有個(gè) dump線程,從庫(kù)上有 slave io 和 slave sql 線程 刻帚,
簡(jiǎn)單來(lái)說(shuō)崇众, dump線程負(fù)責(zé)將 生成的binlog發(fā)送給從庫(kù)顷歌,slave io 線程負(fù)責(zé)將binlog 落地為relaylog幔睬,slave sql線程負(fù)責(zé)解析relaylog并應(yīng)用到從庫(kù)中
MySQL從庫(kù)延遲本質(zhì)原因是邏輯復(fù)制赦抖,binlog是邏輯日志辅肾,應(yīng)用sql肯定要花費(fèi)時(shí)間
整條鏈路上任何一個(gè)環(huán)節(jié)都有可能導(dǎo)致從庫(kù)延遲宛瞄。通常有哪些場(chǎng)景會(huì)導(dǎo)致MySQL主從延遲呢份汗?
1杯活、網(wǎng)絡(luò)
binlog通過(guò)網(wǎng)絡(luò)從主庫(kù)傳輸?shù)綇膸?kù),如果網(wǎng)絡(luò)發(fā)生抖動(dòng)吸重,或者帶寬打滿嚎幸,必然會(huì)影響從庫(kù)復(fù)制
2嫉晶、機(jī)器配置
有時(shí)候因?yàn)橘Y源限制替废,從庫(kù)可能會(huì)使用低配機(jī)器,cpu/磁盤不給力诈火,導(dǎo)致從庫(kù)應(yīng)用sql變慢冷守,產(chǎn)生復(fù)制延遲教沾。所以強(qiáng)烈建議授翻,主從數(shù)據(jù)庫(kù)配置保持一致堪唐。
3翎蹈、負(fù)載
很多時(shí)候荤堪,會(huì)將從庫(kù)提供給BI/大數(shù)據(jù)側(cè)使用澄阳,ap型復(fù)雜sql導(dǎo)致從庫(kù)負(fù)載高碎赢,slave sql thread執(zhí)行緩慢,產(chǎn)生復(fù)制延遲襟齿。所以要提供專用從庫(kù)給BI/大數(shù)據(jù)猜欺,并且聲明數(shù)據(jù)非實(shí)時(shí)(準(zhǔn)實(shí)時(shí))
4开皿、鎖
從庫(kù)在備份的時(shí)候副瀑,為獲取一致性位點(diǎn)信息恋谭,執(zhí)行FTWRL (flush tables with read lock) 生成一個(gè)全局讀鎖糠睡。如果FTWRL 被阻塞,后續(xù)涉及到該表的會(huì)話都會(huì)被阻塞疚颊,包括 slave sql thread狈孔;
此外 ,從庫(kù)在執(zhí)行ddl時(shí)被 長(zhǎng)事務(wù)/長(zhǎng)sql阻塞材义,無(wú)法獲取mdl鎖,也會(huì)導(dǎo)致復(fù)制延遲其掂。 所以在從庫(kù)執(zhí)行備份時(shí)油挥,要關(guān)注會(huì)話狀態(tài)
5、大表DDL
直接在主庫(kù)上 對(duì) 大表執(zhí)行DDL操作款熬,主庫(kù)需要多長(zhǎng)時(shí)間深寥,從庫(kù)就需要多長(zhǎng)時(shí)間。例如:主庫(kù)某表加個(gè)字段需要1min贤牛,那么從庫(kù)執(zhí)行ddl也需要1min惋鹅, 那么在這1min之內(nèi),從庫(kù)就處于延遲狀態(tài)殉簸。
所以針對(duì)大表ddl闰集, DBA會(huì)使用一些工具來(lái)完成,而不是直接在主庫(kù)上執(zhí)行?
6般卑、大事務(wù)
一個(gè)大事務(wù)武鲁,比如修改了大量數(shù)據(jù),花費(fèi)了N秒椭微,那么同樣的洞坑,在從庫(kù)上也需要執(zhí)行N秒。所以強(qiáng)烈建議將大事務(wù)拆成小事務(wù)蝇率,單個(gè)事務(wù)修改不超過(guò)2000行迟杂。
7、長(zhǎng)事務(wù)
長(zhǎng)事務(wù)未必是大事務(wù)本慕,是指事務(wù)中的sql執(zhí)行間隔比較長(zhǎng)
Seconds_Behind_Master計(jì)算邏輯 :從庫(kù)執(zhí)行時(shí)間點(diǎn)-主庫(kù)執(zhí)行時(shí)間點(diǎn)-?△z主從時(shí)間差
長(zhǎng)事務(wù)會(huì)導(dǎo)致Seconds_Behind_Master值出現(xiàn)抖動(dòng)排拷,飚的很高,很快恢復(fù)
8锅尘、性能參數(shù)
sync_binlog监氢、innodb_flush_log_at_trx_commit布蔗、innodb_io_capacity等刷盤性能參數(shù),影響從庫(kù)的io性能浪腐,可適當(dāng)調(diào)整
9纵揍、并行復(fù)制
MySQL從5.7開(kāi)始,引入行級(jí)別并行復(fù)制议街,相繼經(jīng)歷 commit order泽谨、logic clock、write set 方式特漩,一般情況下吧雹,并行線程數(shù)slave_parallel_workers設(shè)為 8或16 達(dá)到最大性能。