MySQL復(fù)制機(jī)制原理講解
背景介紹
復(fù)制,就是對(duì)數(shù)據(jù)的完整拷貝,說(shuō)到為什么要復(fù)制,首先能想到的是怕數(shù)據(jù)意外丟失,使得用戶蒙受損失。
當(dāng)完成了數(shù)據(jù)復(fù)制之后,會(huì)發(fā)現(xiàn)它的優(yōu)勢(shì)不止這一點(diǎn),假如一臺(tái)機(jī)器宕機(jī)了,可以啟用備份在另一臺(tái)機(jī)器的數(shù)據(jù)。畢竟宕機(jī)的概率很小,閑暇時(shí)間還可以讓備份機(jī)器分擔(dān)主機(jī)器的流量壓力。除此之外,當(dāng)要升級(jí)數(shù)據(jù)庫(kù)版本時(shí),可以在不停止用戶服務(wù)的情況下優(yōu)先升級(jí)備用機(jī)器,待觀測(cè)其可用穩(wěn)定時(shí)再將主數(shù)據(jù)庫(kù)升級(jí)。
但是,也不能總讓DBA手動(dòng)拷貝來(lái)完成復(fù)制,萬(wàn)一在DBA蹲坑的時(shí)候宕機(jī)了,在蹲坑期間產(chǎn)生的數(shù)據(jù)由于沒(méi)有及時(shí)備份,會(huì)導(dǎo)致備用數(shù)據(jù)庫(kù)的數(shù)據(jù)缺失,所以還是要設(shè)計(jì)一套可以自動(dòng)復(fù)制的機(jī)制。
設(shè)計(jì)復(fù)制機(jī)制
我們暫定被復(fù)制的數(shù)據(jù)庫(kù)為主庫(kù),粘貼出來(lái)的為從庫(kù),要實(shí)現(xiàn)主庫(kù)到從庫(kù)的復(fù)制,看起來(lái)非常簡(jiǎn)單,只需一個(gè)計(jì)劃任務(wù),定時(shí)將主庫(kù)數(shù)據(jù)文件復(fù)制一份,并傳輸?shù)綇膸?kù)所在服務(wù)器。
但畢竟定時(shí)任務(wù)不是實(shí)時(shí)的,萬(wàn)一主庫(kù)在上次復(fù)制的十分鐘后發(fā)生了故障,被激活的從庫(kù)用的是最近一次復(fù)制的數(shù)據(jù),所以會(huì)缺失十分鐘的數(shù)據(jù),后果不堪設(shè)想。
還是要實(shí)時(shí)復(fù)制,那可以這樣,主庫(kù)將每次執(zhí)行完的語(yǔ)句實(shí)時(shí)發(fā)給從庫(kù),讓從庫(kù)馬上執(zhí)行,就能保證兩邊數(shù)據(jù)一致了。
不太好的是,主庫(kù)是實(shí)時(shí)發(fā)送數(shù)據(jù)給從庫(kù)的,需要等從庫(kù)執(zhí)行完畢才能處理下一條語(yǔ)句,嚴(yán)重占用了主庫(kù)的執(zhí)行時(shí)間,如果從庫(kù)過(guò)多,主庫(kù)就廢了。
還得改成異步才能節(jié)省主庫(kù)的時(shí)間,可以將主庫(kù)執(zhí)行完的語(yǔ)句存到文件里,讓從庫(kù)來(lái)取,這樣主庫(kù)就不用等待從庫(kù)了。既然是寫(xiě)到文件,速度是很快的,主庫(kù)完全可以在執(zhí)行前就將語(yǔ)句寫(xiě)到文件中,達(dá)到更高的同步效率。
上述有些問(wèn)題,從庫(kù)無(wú)法做到跑去主庫(kù)取數(shù)據(jù),只能起一個(gè)線程先與主庫(kù)建立連接,并向主庫(kù)索要數(shù)據(jù),然后主庫(kù)也起一個(gè)線程讀取文件內(nèi)容,并推給從庫(kù)線程,從庫(kù)收到語(yǔ)句后就可以馬上執(zhí)行了。
這樣效率還是很低,主庫(kù)的線程要等從庫(kù)收到語(yǔ)句并執(zhí)行完畢才能推下一條,如果有多個(gè)從庫(kù),主庫(kù)就要開(kāi)啟多個(gè)線程長(zhǎng)期與各個(gè)從庫(kù)保持通信,占用主庫(kù)服務(wù)器資源,不如從庫(kù)也創(chuàng)建個(gè)文件臨時(shí)保存主庫(kù)發(fā)來(lái)的語(yǔ)句,先存起來(lái)再慢慢執(zhí)行,主庫(kù)壓力小了,從庫(kù)也放心。
現(xiàn)在從庫(kù)有了自己的文件做中繼,就不用著急了,從庫(kù)可以再起一個(gè)線程,慢慢執(zhí)行中繼文件中的語(yǔ)句,執(zhí)行完畢之后原文件沒(méi)有價(jià)值了,就可以清理掉,免得占用服務(wù)器資源。
到目前為止,最基本的復(fù)制機(jī)制就設(shè)計(jì)完了,這種由主庫(kù)到從庫(kù)的復(fù)制方式就是典型的主從架構(gòu),在此基礎(chǔ)上可以進(jìn)行演化,比如從庫(kù)有很多,主庫(kù)要為每個(gè)從庫(kù)推送數(shù)據(jù),主庫(kù)的壓力會(huì)隨之增大,又因?yàn)橹鲙?kù)的職責(zé)不僅僅是同步數(shù)據(jù),還要忙著讀寫(xiě)數(shù)據(jù),所以同步數(shù)據(jù)的事可以找人代替,比如在主庫(kù)與從庫(kù)之間再建立一個(gè)主庫(kù),新建立的主庫(kù)唯一的職責(zé)就是同步數(shù)據(jù)給從庫(kù),這樣真正的主庫(kù)就只需要推送一次數(shù)據(jù)給新建的主庫(kù),其余時(shí)間就可以安心讀寫(xiě)數(shù)據(jù)了。
這種演化而來(lái)的復(fù)制模式叫做多級(jí)復(fù)制架構(gòu),本文到此結(jié)束,上述就是三種復(fù)制架構(gòu)中的其中兩種,除此之外還有一個(gè)“主主”架構(gòu),在這里就不再多說(shuō)了,感興趣的可以自行了解或關(guān)注后續(xù)的文章。
以上就是全部關(guān)于MySQL復(fù)制機(jī)制的知識(shí)點(diǎn)內(nèi)容,感謝大家對(duì)腳本之家的支持。
相關(guān)文章
MySQL8.0.21.0社區(qū)版安裝教程(圖文詳解)
這篇文章主要介紹了MySQL8.0.21.0社區(qū)版安裝教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08關(guān)于skip_name_resolve參數(shù)的總結(jié)分享
下面小編就為大家?guī)?lái)一篇關(guān)于skip_name_resolve參數(shù)的總結(jié)分享。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家。給大家一個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-03-03關(guān)于對(duì)mysql語(yǔ)句進(jìn)行監(jiān)控的方法詳解
這篇文章主要給大家介紹了關(guān)于對(duì)mysql語(yǔ)句進(jìn)行監(jiān)控的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Mysql?5.7?新特性之?json?類型的增刪改查操作和用法
這篇文章主要介紹了Mysql?5.7?新特性之json?類型的增刪改查,主要通過(guò)代碼介紹mysql?json類型的增刪改查等基本操作的用法,需要的朋友可以參考下2022-09-09mysql SELECT FOR UPDATE語(yǔ)句使用示例
本文介紹在mysql中使用mysql SELECT FOR UPDATE 語(yǔ)句時(shí)的一些問(wèn)題與解決辦法2013-11-11MySQL筆記之?dāng)?shù)據(jù)備份與還原的使用詳解
數(shù)據(jù)很重要,這點(diǎn)用腳趾頭想都知道,為了保證數(shù)據(jù)的安全,因此需要定期對(duì)數(shù)據(jù)備份2013-05-05