主備同步,也叫主從復(fù)制,是MySQL提供的一種高可用的解決方案,保證主備數(shù)據(jù)一致性的解決方案。
在生產(chǎn)環(huán)境中,會有很多不可控因素,例如數(shù)據(jù)庫服務(wù)掛了。為了保證應(yīng)用的高可用,數(shù)據(jù)庫也必須要是高可用的。
因此在生產(chǎn)環(huán)境中,都會采用主備同步。在應(yīng)用的規(guī)模不大的情況下,一般會采用一主一備。
除了上面提到的數(shù)據(jù)庫服務(wù)掛了,能夠快速切換到備庫,避免應(yīng)用的不可用外,采用主備同步還有以下好處:
提升數(shù)據(jù)庫的讀并發(fā)性,大多數(shù)應(yīng)用都是讀比寫要多,采用主備同步方案,當(dāng)使用規(guī)模越來越大的時候,可以擴(kuò)展備庫來提升讀能力。
備份,主備同步可以得到一份實時的完整的備份數(shù)據(jù)庫。
快速恢復(fù),當(dāng)主庫出錯了(比如誤刪表),通過備庫來快速恢復(fù)數(shù)據(jù)。對于規(guī)模很大的應(yīng)用,對于數(shù)據(jù)恢復(fù)速度的容忍性很低的情況,通過配置一臺與主庫的數(shù)據(jù)快照相隔半小時的備庫,當(dāng)主庫誤刪表,就可以通過備庫和binlog來快速恢復(fù),最多等待半小時。
說了主備同步是什么和好處,下面讓我們來了解一下主備同步是怎么實現(xiàn)的。
我們先來了解一下主備同步的原理,下面以一個update語句來介紹主庫與備庫間是如何進(jìn)行同步的。
上圖是一個update語句在節(jié)點A執(zhí)行,然后同步到節(jié)點B的完整流程圖,具體步驟有:
主備同步的工作原理其實就是一個完全備份加上二進(jìn)制日志備份的還原。不同的是這個二進(jìn)制日志的還原操作基本上是實時的。
備庫通過兩個線程來實現(xiàn)同步:
從上面的流程可以看出,主備同步的關(guān)鍵是binlog
M-S結(jié)構(gòu),兩個節(jié)點,一個當(dāng)主庫、一個當(dāng)備庫,不允許兩個節(jié)點互換角色。
在狀態(tài)1中,客戶端的讀寫都直接訪問節(jié)點A,而節(jié)點B是A的備庫,只是將A的更新都同步過來,到本地執(zhí)行。這樣可以保持節(jié)點B和A的數(shù)據(jù)是相同的。
當(dāng)需要切換的時候,就切成狀態(tài)2。這時候客戶端讀寫訪問的都是節(jié)點B,而節(jié)點A是B的備庫。
雙M結(jié)構(gòu),兩個節(jié)點,一個當(dāng)主庫,一個當(dāng)備庫,允許兩個節(jié)點互換角色。
對比前面的M-S結(jié)構(gòu)圖,可以發(fā)現(xiàn),雙M結(jié)構(gòu)和M-S結(jié)構(gòu),其實區(qū)別只是多了一條線,即節(jié)點A和B之間總是互為主備關(guān)系。這樣在切換的時候就不用再修改主備關(guān)系。
在實際生產(chǎn)使用中,多數(shù)情況是使用雙M結(jié)構(gòu)的。但是,雙M結(jié)構(gòu)還有一個問題需要解決。
業(yè)務(wù)邏輯在節(jié)點A執(zhí)行更新,會生成binlog并同步到節(jié)點B。節(jié)點B同步完成后,也會生成binlog。(log_slave_updates設(shè)置為on,表示備庫也會生成binlog)。
當(dāng)節(jié)點A同時也是節(jié)點B的備庫時,節(jié)點B的binlog也會發(fā)送給節(jié)點A,造成循環(huán)復(fù)制。
解決辦法:
解決后的流程:
以上就是MySQL是如何實現(xiàn)主備同步的詳細(xì)內(nèi)容,更多關(guān)于MySQL 主備同步的資料請關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:黔東 拉薩 沈陽 珠海 移動 沈陽 鹽城 徐州
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL是如何實現(xiàn)主備同步》,本文關(guān)鍵詞 MySQL,是,如何,實現(xiàn),主備,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。