MySQL主从复制作用和原理
該文章是轉(zhuǎn)載的,但是原文中有些描述的不準(zhǔn)確,進(jìn)行了修改。
一、什么是主從復(fù)制?
主從復(fù)制,是用來(lái)建立一個(gè)和主數(shù)據(jù)庫(kù)完全一樣的數(shù)據(jù)庫(kù)環(huán)境,稱(chēng)為從數(shù)據(jù)庫(kù);主數(shù)據(jù)庫(kù)一般是準(zhǔn)實(shí)時(shí)的業(yè)務(wù)數(shù)據(jù)庫(kù)。
二、主從復(fù)制的作用
1、做數(shù)據(jù)的熱備,作為后備數(shù)據(jù)庫(kù),主數(shù)據(jù)庫(kù)服務(wù)器故障后,可切換到從數(shù)據(jù)庫(kù)繼續(xù)工作,避免數(shù)據(jù)丟失。
2、架構(gòu)的擴(kuò)展。業(yè)務(wù)量越來(lái)越大,I/O訪問(wèn)頻率過(guò)高,單機(jī)無(wú)法滿足,此時(shí)做多庫(kù)的存儲(chǔ),降低磁盤(pán)I/O訪問(wèn)的頻率,提高單個(gè)機(jī)器的I/O性能。
3、讀寫(xiě)分離,使數(shù)據(jù)庫(kù)能支撐更大的并發(fā)。在報(bào)表中尤其重要。由于部分報(bào)表sql語(yǔ)句非常的慢,導(dǎo)致鎖表,影響前臺(tái)服務(wù)。如果前臺(tái)使用master,報(bào)表使用slave,那么報(bào)表sql將不會(huì)造成前臺(tái)鎖,保證了前臺(tái)速度。
二、主從復(fù)制的目的
目的是:保證主從節(jié)點(diǎn)數(shù)據(jù)的一致性,實(shí)現(xiàn)高可用
三、主從復(fù)制的原理
1.數(shù)據(jù)庫(kù)有個(gè)bin-log二進(jìn)制文件,記錄了所有sql語(yǔ)句。
2.我們的目標(biāo)就是把主數(shù)據(jù)庫(kù)的bin-log文件的sql語(yǔ)句復(fù)制過(guò)來(lái)。
3.讓其在從數(shù)據(jù)的relay-log重做日志文件中再執(zhí)行一次這些sql語(yǔ)句即可。
4.下面的主從配置就是圍繞這個(gè)原理配置
5.具體需要三個(gè)線程來(lái)操作:
1.binlog輸出線程:每當(dāng)有從庫(kù)連接到主庫(kù)的時(shí)候,主庫(kù)都會(huì)創(chuàng)建一個(gè)線程然后發(fā)送binlog內(nèi)容到從庫(kù)。在從庫(kù)里,當(dāng)復(fù)制開(kāi)始的時(shí)候,從庫(kù)就會(huì)創(chuàng)建兩個(gè)線程進(jìn)行處理:
2.從庫(kù)I/O線程:當(dāng)START SLAVE語(yǔ)句在從庫(kù)開(kāi)始執(zhí)行之后,從庫(kù)創(chuàng)建一個(gè)I/O線程,該線程連接到主庫(kù)并請(qǐng)求主庫(kù)發(fā)送binlog里面的更新記錄到從庫(kù)上。從庫(kù)I/O線程讀取主庫(kù)的binlog輸出線程發(fā)送的更新并拷貝這些更新到本地文件,其中包括relay log文件。
3.從庫(kù)的SQL線程:從庫(kù)創(chuàng)建一個(gè)SQL線程,這個(gè)線程讀取從庫(kù)I/O線程寫(xiě)到relay log的更新事件并執(zhí)行。
可以知道,對(duì)于每一個(gè)主從復(fù)制的連接,都有三個(gè)線程。擁有多個(gè)從庫(kù)的主庫(kù)為每一個(gè)連接到主庫(kù)的從庫(kù)創(chuàng)建一個(gè)binlog輸出線程,每一個(gè)從庫(kù)都有它自己的I/O線程和SQL線程。
主從復(fù)制如圖:
原理圖2,幫助理解!
步驟一:主庫(kù)db的更新數(shù)據(jù)的SQL(DDL/DML)被寫(xiě)到binlog
步驟二:從庫(kù)發(fā)起連接,連接到主庫(kù)
步驟三:此時(shí)主庫(kù)創(chuàng)建一個(gè)binlog dump線程,當(dāng)提交事務(wù)時(shí),通過(guò)事件的方式通知IO線程。把binlog的內(nèi)容發(fā)送到從庫(kù)
步驟四:從庫(kù)啟動(dòng)之后,創(chuàng)建一個(gè)I/O線程,接收到主機(jī)發(fā)送的事件之后,讀取主機(jī)傳過(guò)來(lái)的binlog內(nèi)容并寫(xiě)入到relay log.
步驟五:從機(jī)也會(huì)創(chuàng)建一個(gè)SQL線程,從relay log里面讀取新的SQL內(nèi)容,從Exec_Master_Log_Pos位置開(kāi)始執(zhí)行讀取到的更新事件,將更新內(nèi)容寫(xiě)入到slave的db.
?
總結(jié)
以上是生活随笔為你收集整理的MySQL主从复制作用和原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C C++面试常问简答题(2)
- 下一篇: 数据库中字段类型Number(n,m)大