當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]MySQL在生成環(huán)境中,如果是單機(jī)版的部署方式,就會(huì)有很大的可用性問(wèn)題,MySQL提供了一套主從復(fù)制的架構(gòu),以提高其可用性。MySQL主從復(fù)制架構(gòu),就是部署兩臺(tái)機(jī)器,一臺(tái)機(jī)器上部署的MySQL是master節(jié)點(diǎn),另一臺(tái)機(jī)器上部署的MySQL是slave節(jié)點(diǎn)。我們平時(shí)可以向mast...

MySQL在生成環(huán)境中,如果是單機(jī)版的部署方式,就會(huì)有很大的可用性問(wèn)題,MySQL提供了一套主從復(fù)制的架構(gòu),以提高其可用性。


MySQL主從復(fù)制架構(gòu),就是部署兩臺(tái)機(jī)器,一臺(tái)機(jī)器上部署的MySQL是master節(jié)點(diǎn),另一臺(tái)機(jī)器上部署的MySQL是slave節(jié)點(diǎn)。


我們平時(shí)可以向master節(jié)點(diǎn)讀寫(xiě)數(shù)據(jù),master節(jié)點(diǎn)會(huì)把寫(xiě)入的數(shù)據(jù)自動(dòng)復(fù)制到slave節(jié)點(diǎn)去,讓slave節(jié)點(diǎn)與master節(jié)點(diǎn)有一份一樣的數(shù)據(jù)。


一文講清,MySQL主從架構(gòu)

圖1 MySQL主從復(fù)制架構(gòu)


MySQL的主從復(fù)制架構(gòu),有一個(gè)大名鼎鼎的作用,就是讀寫(xiě)分離。


讀寫(xiě)分離就是,你的Java業(yè)務(wù)系統(tǒng)可以向master節(jié)點(diǎn)寫(xiě)入數(shù)據(jù),但是從slave節(jié)點(diǎn)讀取數(shù)據(jù),讀和寫(xiě)分別在不同的機(jī)器上。


一文講清,MySQL主從架構(gòu)

圖2 MySQL讀寫(xiě)分離


讀寫(xiě)分離的作用是顯而易見(jiàn)的,假設(shè)MySQL單機(jī)每秒抗4000讀寫(xiě)請(qǐng)求,1500的寫(xiě)請(qǐng)求 2500的讀請(qǐng)求,壓力已經(jīng)到極限了,此時(shí)你可以利用讀寫(xiě)分離架構(gòu),讓2500的讀請(qǐng)求分流到到slave節(jié)點(diǎn),就會(huì)大大降低master節(jié)點(diǎn)的壓力。


如果隨著業(yè)務(wù)發(fā)展,讀請(qǐng)求越來(lái)越多,一個(gè)salve節(jié)點(diǎn)也快扛不住讀請(qǐng)求了,你可以再部署幾個(gè)從節(jié)點(diǎn),MySQL主從架構(gòu)是支持一主多從的。讓多個(gè)從節(jié)點(diǎn)分?jǐn)傋x請(qǐng)求。

一文講清,MySQL主從架構(gòu)

圖3 MySQL主從復(fù)制一主多從



MySQL主從復(fù)制的工作原理


MySQL在執(zhí)行增刪改的時(shí)候,會(huì)記錄binlog日志,從庫(kù)上會(huì)起一個(gè)IO線(xiàn)程,這個(gè)線(xiàn)程會(huì)跟master節(jié)點(diǎn)建立一個(gè)TCP連接,請(qǐng)求master節(jié)點(diǎn)傳送binlog日志給自己,這個(gè)時(shí)候master上有一個(gè)IO dump線(xiàn)程,會(huì)負(fù)責(zé)通過(guò)這個(gè)TCP連接,把binlog日志傳輸給slave的IO線(xiàn)程。


然后,slave節(jié)點(diǎn)的IO線(xiàn)程會(huì)把讀取到的binlog日志寫(xiě)入到自己本地的relay日志文件里去,然后從庫(kù)上另外一個(gè)線(xiàn)程會(huì)讀取relay里的日志,進(jìn)行日志重做,把所有在master上執(zhí)行的增刪改操作在slave上也執(zhí)行一遍。


一文講清,MySQL主從架構(gòu)

圖3 MySQL主從復(fù)制原理


簡(jiǎn)單來(lái)說(shuō),你只要給master掛上一個(gè)slave節(jié)點(diǎn),slave節(jié)點(diǎn)的IO線(xiàn)程就會(huì)跟master節(jié)點(diǎn)建立網(wǎng)絡(luò)連接,然后請(qǐng)求master節(jié)點(diǎn)傳輸binlog日志,master節(jié)點(diǎn)的IO dump線(xiàn)程就負(fù)責(zé)傳輸binlog日志給從節(jié)點(diǎn),從節(jié)點(diǎn)收到日志后就可以回放增刪改操作恢復(fù)數(shù)據(jù)了。


canal就是把自己偽裝成slave,利用同樣的同步機(jī)制,把master節(jié)點(diǎn)binlog同步過(guò)去的。


通常master節(jié)點(diǎn)復(fù)制數(shù)據(jù)到slave節(jié)點(diǎn),有幾種方式。


(1)異步復(fù)制


master把日志寫(xiě)入binlog,就提交事務(wù)返回了,它不管slave有沒(méi)有收到日志。


如果此時(shí)數(shù)據(jù)還沒(méi)同步到salve,master宕機(jī)了,數(shù)據(jù)是不是就丟了?


因此你可以采用半同步的復(fù)制方式。


(2)半同步復(fù)制方式


半同步就是說(shuō),你master寫(xiě)入數(shù)據(jù),日志進(jìn)入binlog之后,會(huì)確保 binlog日志復(fù)制到slave了,再告訴客戶(hù)端說(shuō)本次寫(xiě)入事務(wù)成本了。


這樣就算master宕機(jī)了,你寫(xiě)入binlog的數(shù)據(jù)也到了slave,數(shù)據(jù)也不會(huì)丟失。


一般生產(chǎn)環(huán)境中,會(huì)采用半同步復(fù)制的方式。


主從復(fù)制延遲問(wèn)題如何解決?


master是多線(xiàn)程并發(fā)寫(xiě)入的,所以主庫(kù)寫(xiě)入數(shù)據(jù)的速度可能是很快的,但是slave是單個(gè)線(xiàn)程緩慢拉取數(shù)據(jù)的,所以必定會(huì)導(dǎo)致slave節(jié)點(diǎn)數(shù)據(jù)比master節(jié)點(diǎn)慢。


這導(dǎo)致的問(wèn)題也很明顯,你向master節(jié)點(diǎn)寫(xiě)入一條數(shù)據(jù),立馬去slave節(jié)點(diǎn)讀取,可能就讀不到。


怎么解決?


MySQL 5.7就已經(jīng)支持并行復(fù)制了,可以在slave節(jié)點(diǎn)里設(shè)置slave_parallel_workers>0,就是開(kāi)啟多個(gè)線(xiàn)程去同步binlog,然后把slave_parallel_type設(shè)置為L(zhǎng)OGICAL_CLOCK,就好了。


即使是這樣,也還是有可能主從不一致。


如果你要求主從數(shù)據(jù)強(qiáng)一致,那么你只能強(qiáng)制從master庫(kù)里去讀,這樣就肯定不會(huì)出現(xiàn)主從不一致的問(wèn)題了。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉