背景介紹
復(fù)制,就是對數(shù)據(jù)的完整拷貝,說到為什么要復(fù)制,首先能想到的是怕數(shù)據(jù)意外丟失,使得用戶蒙受損失。
當(dāng)完成了數(shù)據(jù)復(fù)制之后,會發(fā)現(xiàn)它的優(yōu)勢不止這一點(diǎn),假如一臺機(jī)器宕機(jī)了,可以啟用備份在另一臺機(jī)器的數(shù)據(jù)。畢竟宕機(jī)的概率很小,閑暇時(shí)間還可以讓備份機(jī)器分擔(dān)主機(jī)器的流量壓力。除此之外,當(dāng)要升級數(shù)據(jù)庫版本時(shí),可以在不停止用戶服務(wù)的情況下優(yōu)先升級備用機(jī)器,待觀測其可用穩(wěn)定時(shí)再將主數(shù)據(jù)庫升級。
但是,也不能總讓DBA手動(dòng)拷貝來完成復(fù)制,萬一在DBA蹲坑的時(shí)候宕機(jī)了,在蹲坑期間產(chǎn)生的數(shù)據(jù)由于沒有及時(shí)備份,會導(dǎo)致備用數(shù)據(jù)庫的數(shù)據(jù)缺失,所以還是要設(shè)計(jì)一套可以自動(dòng)復(fù)制的機(jī)制。
![](/d/20211018/891f60b7a587c94f91a6b129db0439d7.gif)
設(shè)計(jì)復(fù)制機(jī)制
我們暫定被復(fù)制的數(shù)據(jù)庫為主庫,粘貼出來的為從庫,要實(shí)現(xiàn)主庫到從庫的復(fù)制,看起來非常簡單,只需一個(gè)計(jì)劃任務(wù),定時(shí)將主庫數(shù)據(jù)文件復(fù)制一份,并傳輸?shù)綇膸焖诜?wù)器。
![](/d/20211018/d8bee1d38eab8e97637aea32a5fa5d5c.gif)
但畢竟定時(shí)任務(wù)不是實(shí)時(shí)的,萬一主庫在上次復(fù)制的十分鐘后發(fā)生了故障,被激活的從庫用的是最近一次復(fù)制的數(shù)據(jù),所以會缺失十分鐘的數(shù)據(jù),后果不堪設(shè)想。
![](/d/20211018/8bc19e25a99703554c98b3b821d3b8b8.gif)
還是要實(shí)時(shí)復(fù)制,那可以這樣,主庫將每次執(zhí)行完的語句實(shí)時(shí)發(fā)給從庫,讓從庫馬上執(zhí)行,就能保證兩邊數(shù)據(jù)一致了。
![](/d/20211018/7c7655a28e25c3446043333d9cdba24d.gif)
不太好的是,主庫是實(shí)時(shí)發(fā)送數(shù)據(jù)給從庫的,需要等從庫執(zhí)行完畢才能處理下一條語句,嚴(yán)重占用了主庫的執(zhí)行時(shí)間,如果從庫過多,主庫就廢了。
![](/d/20211018/6dc31f44cc0be5cc576a4a5d776ec75c.gif)
還得改成異步才能節(jié)省主庫的時(shí)間,可以將主庫執(zhí)行完的語句存到文件里,讓從庫來取,這樣主庫就不用等待從庫了。既然是寫到文件,速度是很快的,主庫完全可以在執(zhí)行前就將語句寫到文件中,達(dá)到更高的同步效率。
![](/d/20211018/ea3fe24a4fc44f824752417bbddf0698.gif)
上述有些問題,從庫無法做到跑去主庫取數(shù)據(jù),只能起一個(gè)線程先與主庫建立連接,并向主庫索要數(shù)據(jù),然后主庫也起一個(gè)線程讀取文件內(nèi)容,并推給從庫線程,從庫收到語句后就可以馬上執(zhí)行了。
![](/d/20211018/26a4efd576a5d55e95a73946e5fc15e6.gif)
這樣效率還是很低,主庫的線程要等從庫收到語句并執(zhí)行完畢才能推下一條,如果有多個(gè)從庫,主庫就要開啟多個(gè)線程長期與各個(gè)從庫保持通信,占用主庫服務(wù)器資源,不如從庫也創(chuàng)建個(gè)文件臨時(shí)保存主庫發(fā)來的語句,先存起來再慢慢執(zhí)行,主庫壓力小了,從庫也放心。
![](/d/20211018/c1704b7806a77922b814ef071ee15de4.gif)
現(xiàn)在從庫有了自己的文件做中繼,就不用著急了,從庫可以再起一個(gè)線程,慢慢執(zhí)行中繼文件中的語句,執(zhí)行完畢之后原文件沒有價(jià)值了,就可以清理掉,免得占用服務(wù)器資源。
![](/d/20211018/9291720afd8d998747d29467ab758d17.gif)
到目前為止,最基本的復(fù)制機(jī)制就設(shè)計(jì)完了,這種由主庫到從庫的復(fù)制方式就是典型的主從架構(gòu),在此基礎(chǔ)上可以進(jìn)行演化,比如從庫有很多,主庫要為每個(gè)從庫推送數(shù)據(jù),主庫的壓力會隨之增大,又因?yàn)橹鲙斓穆氊?zé)不僅僅是同步數(shù)據(jù),還要忙著讀寫數(shù)據(jù),所以同步數(shù)據(jù)的事可以找人代替,比如在主庫與從庫之間再建立一個(gè)主庫,新建立的主庫唯一的職責(zé)就是同步數(shù)據(jù)給從庫,這樣真正的主庫就只需要推送一次數(shù)據(jù)給新建的主庫,其余時(shí)間就可以安心讀寫數(shù)據(jù)了。
![](/d/20211018/468e1971c7812112c462f85291ee4c57.gif)
這種演化而來的復(fù)制模式叫做多級復(fù)制架構(gòu),本文到此結(jié)束,上述就是三種復(fù)制架構(gòu)中的其中兩種,除此之外還有一個(gè)“主主”架構(gòu),在這里就不再多說了,感興趣的可以自行了解或關(guān)注后續(xù)的文章。
以上就是全部關(guān)于MySQL復(fù)制機(jī)制的知識點(diǎn)內(nèi)容,感謝大家對腳本之家的支持。
您可能感興趣的文章:- MYSQL 完全備份、主從復(fù)制、級聯(lián)復(fù)制、半同步小結(jié)
- 實(shí)現(xiàn)mysql級聯(lián)復(fù)制的方法示例
- Mysql將一個(gè)表中的某一列數(shù)據(jù)復(fù)制到另一個(gè)表中某一列里的方法
- MySQL不同表之前的字段復(fù)制
- 深入理解MySQL主從復(fù)制線程狀態(tài)轉(zhuǎn)變
- Mysql主從復(fù)制注意事項(xiàng)的講解