一店诗、為什么要做主從復(fù)制
1、在業(yè)務(wù)復(fù)雜的系統(tǒng)中音榜,有這么一個(gè)情景庞瘸,有一句sql語句需要鎖表,導(dǎo)致暫時(shí)不能使用讀的服務(wù)赠叼,那么就很影響運(yùn)行中的業(yè)務(wù)擦囊,使用主從復(fù)制违霞,讓主庫負(fù)責(zé)寫,從庫負(fù)責(zé)讀瞬场,這樣买鸽,即使主庫出現(xiàn)了鎖表的情景,通過讀從庫也可以保證業(yè)務(wù)的正常運(yùn)行贯被。
2眼五、做數(shù)據(jù)的熱備,主庫宕機(jī)后能夠及時(shí)替換主庫刃榨,保證業(yè)務(wù)可用性弹砚。
3双仍、架構(gòu)的擴(kuò)展枢希。業(yè)務(wù)量越來越大,I/O訪問頻率過高朱沃,單機(jī)無法滿足苞轿,此時(shí)做多庫的存儲(chǔ),降低磁盤I/O訪問的頻率逗物,提高單個(gè)機(jī)器的I/O性能搬卒。
二、mysql主從復(fù)制的流程
1.主庫db的更新事件(update翎卓、insert契邀、delete)被寫到binlog
2.主庫創(chuàng)建一個(gè)binlog dump thread,把binlog的內(nèi)容發(fā)送到從庫
3.從庫啟動(dòng)并發(fā)起連接失暴,連接到主庫
4.從庫啟動(dòng)之后坯门,創(chuàng)建一個(gè)I/O線程,讀取主庫傳過來的binlog內(nèi)容并寫入到relay log
5.從庫啟動(dòng)之后逗扒,創(chuàng)建一個(gè)SQL線程古戴,從relay log里面讀取內(nèi)容,
從Exec_Master_Log_Pos位置開始執(zhí)行讀取到的更新事件矩肩,將更新內(nèi)容寫入到slave的db
三现恼、mysql主從復(fù)制的原理
1.數(shù)據(jù)庫有個(gè)bin-log二進(jìn)制文件,記錄了所有sql語句黍檩。
2.我們的目標(biāo)就是把主數(shù)據(jù)庫的bin-log文件的sql語句復(fù)制過來叉袍。
3.讓其在從數(shù)據(jù)的relay-log重做日志文件中再執(zhí)行一次這些sql語句即可。
4.下面的主從配置就是圍繞這個(gè)原理配置
5.具體需要三個(gè)線程來操作:
1.binlog輸出線程:每當(dāng)有從庫連接到主庫的時(shí)候刽酱,主庫都會(huì)創(chuàng)建一個(gè)線程然后發(fā)送binlog內(nèi)容到從庫喳逛。
在從庫里,當(dāng)復(fù)制開始的時(shí)候肛跌,從庫就會(huì)創(chuàng)建兩個(gè)線程進(jìn)行處理:
2.從庫I/O線程:當(dāng)START SLAVE語句在從庫開始執(zhí)行之后艺配,從庫創(chuàng)建一個(gè)I/O線程察郁,
該線程連接到主庫并請求主庫發(fā)送binlog里面的更新記錄到從庫上。
從庫I/O線程讀取主庫的binlog輸出線程發(fā)送的更新并拷貝這些更新到本地文件转唉,其中包括relay log文件皮钠。
3.從庫的SQL線程:從庫創(chuàng)建一個(gè)SQL線程,這個(gè)線程讀取從庫I/O線程寫到relay log的更新事件并執(zhí)行赠法。
四麦轰、主從復(fù)制的方式
一主一從
主主復(fù)制
一主多從—擴(kuò)展系統(tǒng)讀取的性能,因?yàn)樽x是在從庫讀取的砖织;
多主一從—5.7開始支持
聯(lián)級(jí)復(fù)制
五款侵、常見問題及解決方法
mysql主從復(fù)制存在的問題:
主庫宕機(jī)后,數(shù)據(jù)可能丟失
從庫只有一個(gè)sql Thread侧纯,主庫寫壓力大新锈,復(fù)制很可能延時(shí)
解決方法:
半同步復(fù)制—解決數(shù)據(jù)丟失的問題
并行復(fù)制—-解決從庫復(fù)制延遲的問題