這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)怎么在MySQL數(shù)據(jù)庫(kù)中實(shí)現(xiàn)主備同步,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)專注于秀洲企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),購(gòu)物商城網(wǎng)站建設(shè)。秀洲網(wǎng)站建設(shè)公司,為秀洲等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)主備同步,也叫主從復(fù)制,是MySQL提供的一種高可用的解決方案,保證主備數(shù)據(jù)一致性的解決方案。
在生產(chǎn)環(huán)境中,會(huì)有很多不可控因素,例如數(shù)據(jù)庫(kù)服務(wù)掛了。為了保證應(yīng)用的高可用,數(shù)據(jù)庫(kù)也必須要是高可用的。
因此在生產(chǎn)環(huán)境中,都會(huì)采用主備同步。在應(yīng)用的規(guī)模不大的情況下,一般會(huì)采用一主一備。
除了上面提到的數(shù)據(jù)庫(kù)服務(wù)掛了,能夠快速切換到備庫(kù),避免應(yīng)用的不可用外,采用主備同步還有以下好處:
提升數(shù)據(jù)庫(kù)的讀并發(fā)性,大多數(shù)應(yīng)用都是讀比寫要多,采用主備同步方案,當(dāng)使用規(guī)模越來越大的時(shí)候,可以擴(kuò)展備庫(kù)來提升讀能力。
備份,主備同步可以得到一份實(shí)時(shí)的完整的備份數(shù)據(jù)庫(kù)。
快速恢復(fù),當(dāng)主庫(kù)出錯(cuò)了(比如誤刪表),通過備庫(kù)來快速恢復(fù)數(shù)據(jù)。對(duì)于規(guī)模很大的應(yīng)用,對(duì)于數(shù)據(jù)恢復(fù)速度的容忍性很低的情況,通過配置一臺(tái)與主庫(kù)的數(shù)據(jù)快照相隔半小時(shí)的備庫(kù),當(dāng)主庫(kù)誤刪表,就可以通過備庫(kù)和binlog來快速恢復(fù),最多等待半小時(shí)。
說了主備同步是什么和好處,下面讓我們來了解一下主備同步是怎么實(shí)現(xiàn)的。
我們先來了解一下主備同步的原理,下面以一個(gè)update語句來介紹主庫(kù)與備庫(kù)間是如何進(jìn)行同步的。
上圖是一個(gè)update語句在節(jié)點(diǎn)A執(zhí)行,然后同步到節(jié)點(diǎn)B的完整流程圖,具體步驟有:
主庫(kù)接受到客戶端發(fā)送的一條update語句,執(zhí)行內(nèi)部事務(wù)邏輯,同時(shí)寫binlog。
備庫(kù)通過 change master 命令,設(shè)置主庫(kù)的IP、端口、用戶名和密碼,以及要從哪個(gè)位置開始請(qǐng)求 binlog。這個(gè)位置包含文件名和偏移量。
在備庫(kù)上執(zhí)行start slave命令,啟動(dòng)兩個(gè)線程 io_thread 和 sql_thread,其中 io_thread 負(fù)責(zé)與主機(jī)進(jìn)行連接。
主庫(kù)校驗(yàn)完用戶名和密碼,按照接收到的位置去讀取binlog,發(fā)給備庫(kù)。
備庫(kù)接收到binlog后,寫到本地文件(relay log,中轉(zhuǎn)文件)。
備庫(kù)讀取中轉(zhuǎn)文件,解析出命令,然后執(zhí)行。
主備同步的工作原理其實(shí)就是一個(gè)完全備份加上二進(jìn)制日志備份的還原。不同的是這個(gè)二進(jìn)制日志的還原操作基本上是實(shí)時(shí)的。
備庫(kù)通過兩個(gè)線程來實(shí)現(xiàn)同步:
一個(gè)是 I/O 線程,負(fù)責(zé)讀取主庫(kù)的二進(jìn)制日志,并將其保存為中繼日志。
一個(gè)是 SQL 線程,負(fù)責(zé)執(zhí)行中繼日志。
從上面的流程可以看出,主備同步的關(guān)鍵是binlog
M-S結(jié)構(gòu),兩個(gè)節(jié)點(diǎn),一個(gè)當(dāng)主庫(kù)、一個(gè)當(dāng)備庫(kù),不允許兩個(gè)節(jié)點(diǎn)互換角色。
在狀態(tài)1中,客戶端的讀寫都直接訪問節(jié)點(diǎn)A,而節(jié)點(diǎn)B是A的備庫(kù),只是將A的更新都同步過來,到本地執(zhí)行。這樣可以保持節(jié)點(diǎn)B和A的數(shù)據(jù)是相同的。
當(dāng)需要切換的時(shí)候,就切成狀態(tài)2。這時(shí)候客戶端讀寫訪問的都是節(jié)點(diǎn)B,而節(jié)點(diǎn)A是B的備庫(kù)。
雙M結(jié)構(gòu),兩個(gè)節(jié)點(diǎn),一個(gè)當(dāng)主庫(kù),一個(gè)當(dāng)備庫(kù),允許兩個(gè)節(jié)點(diǎn)互換角色。
對(duì)比前面的M-S結(jié)構(gòu)圖,可以發(fā)現(xiàn),雙M結(jié)構(gòu)和M-S結(jié)構(gòu),其實(shí)區(qū)別只是多了一條線,即節(jié)點(diǎn)A和B之間總是互為主備關(guān)系。這樣在切換的時(shí)候就不用再修改主備關(guān)系。
在實(shí)際生產(chǎn)使用中,多數(shù)情況是使用雙M結(jié)構(gòu)的。但是,雙M結(jié)構(gòu)還有一個(gè)問題需要解決。
業(yè)務(wù)邏輯在節(jié)點(diǎn)A執(zhí)行更新,會(huì)生成binlog并同步到節(jié)點(diǎn)B。節(jié)點(diǎn)B同步完成后,也會(huì)生成binlog。(log_slave_updates設(shè)置為on,表示備庫(kù)也會(huì)生成binlog)。
當(dāng)節(jié)點(diǎn)A同時(shí)也是節(jié)點(diǎn)B的備庫(kù)時(shí),節(jié)點(diǎn)B的binlog也會(huì)發(fā)送給節(jié)點(diǎn)A,造成循環(huán)復(fù)制。
解決辦法:
設(shè)置節(jié)點(diǎn)的server-id,必須不同,不然不允許設(shè)置為主備結(jié)構(gòu)
備庫(kù)在接到binlog后重放時(shí),會(huì)記錄原記錄相同的server-id,即誰產(chǎn)生即為誰的。
每個(gè)節(jié)點(diǎn)在接受binlog時(shí),會(huì)判斷server-id,如果是自己的就丟掉。
解決后的流程:
業(yè)務(wù)邏輯在節(jié)點(diǎn)A執(zhí)行更新,會(huì)生成帶有節(jié)點(diǎn)A的server-id的binlog。
節(jié)點(diǎn)B接受到節(jié)點(diǎn)A發(fā)過來的binlog,并執(zhí)行完成后,會(huì)生成帶有節(jié)點(diǎn)A的server-id的binlog。
節(jié)點(diǎn)A接受到binlog后,發(fā)現(xiàn)是自己的,就丟掉。死循環(huán)就在這里斷掉了。
上述就是小編為大家分享的怎么在MySQL數(shù)據(jù)庫(kù)中實(shí)現(xiàn)主備同步了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站標(biāo)題:怎么在MySQL數(shù)據(jù)庫(kù)中實(shí)現(xiàn)主備同步-創(chuàng)新互聯(lián)
分享鏈接:http://jinyejixie.com/article10/jeido.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、ChatGPT、網(wǎng)頁設(shè)計(jì)公司、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)