什么是主從復(fù)制
簡(jiǎn)單講,MySQL主從復(fù)制就是數(shù)據(jù)寫入一臺(tái)服務(wù)器(主服務(wù)器)后,同時(shí)還會(huì)額外寫入另外的服務(wù)器(從服務(wù)器)。也就是說(shuō)數(shù)據(jù)會(huì)寫多份,這樣做的目的主要有兩個(gè):
1)備份數(shù)據(jù);
2)做負(fù)載均衡,對(duì)于寫來(lái)說(shuō)沒(méi)有效果,但是對(duì)于讀是可以做到負(fù)載均衡的。
主從復(fù)制原理
1)主上將所有變更事件記錄到binlog里
2)從發(fā)起請(qǐng)求連接主
3)主的binlog備份線程將binlog傳給從
4)從的I/O線程將binlog解析成自己的relay log
5)從的SQL線程根據(jù)relay log來(lái)執(zhí)行具體的SQL語(yǔ)句
MySQL主從復(fù)制是一個(gè)異步的復(fù)制過(guò)程,主庫(kù)發(fā)送更新事件到從庫(kù),從庫(kù)讀取更新記錄,并執(zhí)行更新記錄,使得從庫(kù)的內(nèi)容與主庫(kù)保持一致。
概念解釋
Binlog:binary log,主庫(kù)中保存所有更新事件日志的二進(jìn)制文件。binlog是數(shù)據(jù)庫(kù)服務(wù)啟動(dòng)的一刻起,保存數(shù)據(jù)庫(kù)所有變更記錄(數(shù)據(jù)庫(kù)結(jié)構(gòu)和內(nèi)容)的文件。在主庫(kù)中,只要有更新事件出現(xiàn),就會(huì)被依次地寫入到binlog中,之后會(huì)推送到從庫(kù)中作為從庫(kù)進(jìn)行復(fù)制的數(shù)據(jù)源。
Binlog dump線程:每當(dāng)有從庫(kù)連接到主庫(kù)的時(shí)候,主庫(kù)都會(huì)創(chuàng)建一個(gè)線程然后發(fā)送binlog內(nèi)容到從庫(kù)。對(duì)于每一個(gè)即將發(fā)送給從庫(kù)的sql事件,binlog dump線程會(huì)將其鎖住。一旦該事件被線程讀取完之后,該鎖會(huì)被釋放,即使在該事件完全發(fā)送到從庫(kù)的時(shí)候,該鎖也會(huì)被釋放。
在從庫(kù)中,當(dāng)復(fù)制開始時(shí),從庫(kù)就會(huì)創(chuàng)建從庫(kù)I/O線程和從庫(kù)的SQL線程進(jìn)行復(fù)制處理。
從庫(kù)I/O線程:當(dāng)START SLAVE語(yǔ)句在從庫(kù)開始執(zhí)行之后,從庫(kù)創(chuàng)建一個(gè)I/O線程,該線程連接到主庫(kù)并請(qǐng)求主庫(kù)發(fā)送binlog里面的更新記錄到從庫(kù)上。從庫(kù)I/O線程讀取主庫(kù)的binlog輸出線程發(fā)送的更新并拷貝這些更新到本地文件,其中包括relay log文件。
從庫(kù)的SQL線程:從庫(kù)創(chuàng)建一個(gè)SQL線程,這個(gè)線程讀取從庫(kù)I/O線程寫到relay log的更新事件并執(zhí)行。
基于GTID的主從復(fù)制
1)什么是GTID
GTID(Global Transaction ID)是對(duì)于一個(gè)已提交事務(wù)的編號(hào),并且是一個(gè)全局唯一的編號(hào)。GTID實(shí)際上是由UUID+TID組成的。其中UUID是一個(gè)MySQL實(shí)例的唯一標(biāo)識(shí),保存在mysql數(shù)據(jù)目錄下的auto.cnf文件里。TID代表了該實(shí)例上已經(jīng)提交的事務(wù)數(shù)量,并且隨著事務(wù)提交單調(diào)遞增。下面是一個(gè)GTID的具體形式:3E11FA47-71CA-11E1-9E33-C80AA9429562:23
2)GTID的作用
根據(jù)GTID可以知道事務(wù)最初是在哪個(gè)實(shí)例上提交的,GTID的存在方便了Replication的Failover(故障切換)
3)GTID比傳統(tǒng)復(fù)制的優(yōu)勢(shì)
更簡(jiǎn)單的實(shí)現(xiàn)failover,不用以前那樣在需要找log_file和log_Pos。更簡(jiǎn)單的搭建主從復(fù)制。比傳統(tǒng)復(fù)制更加安全。GTID是連續(xù)沒(méi)有空洞的,因此主從庫(kù)出現(xiàn)數(shù)據(jù)沖突時(shí),可以用添加空事物的方式進(jìn)行跳過(guò)。
4)GTID的工作原理:
① master更新數(shù)據(jù)時(shí),會(huì)在事務(wù)前產(chǎn)生GTID,一同記錄到binlog日志中。
② slave端的i/o線程將變更的binlog,寫入到本地的relay log中。
③ sql線程從relay log中獲取GTID,然后對(duì)比slave端的binlog是否有記錄。
④ 如果有記錄,說(shuō)明該GTID的事務(wù)已經(jīng)執(zhí)行,slave會(huì)忽略。
⑤ 如果沒(méi)有記錄,slave就會(huì)從relay log中執(zhí)行該GTID的事務(wù),并記錄到binlog。
⑥ 在解析過(guò)程中會(huì)判斷是否有主鍵,如果有就用二級(jí)索引,如果沒(méi)有就用全部掃描。
審核編輯:湯梓紅
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9306瀏覽量
86070 -
SQL
+關(guān)注
關(guān)注
1文章
775瀏覽量
44252 -
MySQL
+關(guān)注
關(guān)注
1文章
829瀏覽量
26743 -
線程
+關(guān)注
關(guān)注
0文章
505瀏覽量
19758 -
binlog
+關(guān)注
關(guān)注
0文章
7瀏覽量
1256
原文標(biāo)題:MySQL主從復(fù)制原理
文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Mysql如何實(shí)現(xiàn)雙向互為主從復(fù)制?
利用MySQL進(jìn)行一主一從的主從復(fù)制
一個(gè)操作把MySQL主從復(fù)制整崩了
![一個(gè)操作把<b class='flag-5'>MySQL</b><b class='flag-5'>主從復(fù)制</b>整崩了](https://file1.elecfans.com//web2/M00/82/A9/wKgaomRcXYOAQAZvAAbzaOa26Bc211.jpg)
聊聊RocketMQ的主從復(fù)制
![聊聊RocketMQ的<b class='flag-5'>主從復(fù)制</b>](https://file1.elecfans.com/web2/M00/8B/F6/wKgaomSjeX-ADkILAAAM_cnCa4Q966.jpg)
什么是Redis主從復(fù)制
![什么是Redis<b class='flag-5'>主從復(fù)制</b>](https://file1.elecfans.com/web2/M00/A9/29/wKgZomUjpZKAWtLGAABcBiWRjug998.jpg)
評(píng)論