19.1 主從復(fù)制介紹
19.1.1 主從存在的意義
數(shù)據(jù)備份:為了避免單點(diǎn)故障,增加一個(gè)從服務(wù)器,用來(lái)復(fù)制主服務(wù)器上的數(shù)據(jù)。
分擔(dān)負(fù)載:將寫(xiě)操作在主上做,查詢(xún)操作在從上做。
19.1.2 主從復(fù)制原理
① 主上將所有變更事件記錄到binlog里
② 從發(fā)起請(qǐng)求連接主
③ 主的binlog備份線(xiàn)程將binlog傳給從
④ 從的I/O線(xiàn)程將binlog解析成自己的relay log
⑤ 從的SQL線(xiàn)程根據(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ì)被依次地寫(xiě)入到binlog中,之后會(huì)推送到從庫(kù)中作為從庫(kù)進(jìn)行復(fù)制的數(shù)據(jù)源。
binlog dump線(xiàn)程:每當(dāng)有從庫(kù)連接到主庫(kù)的時(shí)候,主庫(kù)都會(huì)創(chuàng)建一個(gè)線(xiàn)程然后發(fā)送binlog內(nèi)容到從庫(kù)。對(duì)于每一個(gè)即將發(fā)送給從庫(kù)的sql事件,binlog dump線(xiàn)程會(huì)將其鎖住。一旦該事件被線(xiàn)程讀取完之后,該鎖會(huì)被釋放,即使在該事件完全發(fā)送到從庫(kù)的時(shí)候,該鎖也會(huì)被釋放。
在從庫(kù)中,當(dāng)復(fù)制開(kāi)始時(shí),從庫(kù)就會(huì)創(chuàng)建從庫(kù)I/O線(xiàn)程和從庫(kù)的SQL線(xiàn)程進(jìn)行復(fù)制處理。
從庫(kù)I/O線(xiàn)程:當(dāng)START SLAVE語(yǔ)句在從庫(kù)開(kāi)始執(zhí)行之后,從庫(kù)創(chuàng)建一個(gè)I/O線(xiàn)程,該線(xiàn)程連接到主庫(kù)并請(qǐng)求主庫(kù)發(fā)送binlog里面的更新記錄到從庫(kù)上。從庫(kù)I/O線(xiàn)程讀取主庫(kù)的binlog輸出線(xiàn)程發(fā)送的更新并拷貝這些更新到本地文件,其中包括relay log文件。
從庫(kù)的SQL線(xiàn)程:從庫(kù)創(chuàng)建一個(gè)SQL線(xiàn)程,這個(gè)線(xiàn)程讀取從庫(kù)I/O線(xiàn)程寫(xiě)到relay log的更新事件并執(zhí)行。
19.2 搭建主從復(fù)制
19.2.1 基于二進(jìn)制日志文件位置的復(fù)制
① 根據(jù)我們前面的文檔,搭建兩臺(tái)MySQL服務(wù),具體步驟略
192.168.222.128 主 192.168.222.132 從
② 檢查并配置兩臺(tái)機(jī)器的server_id
vi my.cnf #搜索server_id ,如果沒(méi)有則增加 主上設(shè)置為server_id=1 從上設(shè)置為 server_id = 2
③ 在主上創(chuàng)建用作主從復(fù)制的用戶(hù)
create user 'rep'@'192.168.222.132' identified with 'mysql_native_password' by 'AmingLinux.Com'; grant REPLICATION SLAVE on *.* to 'rep'@'192.168.222.132'; flush privileges;
④在主上查詢(xún)?nèi)罩久忠约拔恢?/p>
show master status; ##記錄下對(duì)應(yīng)的日志命令以及位置 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | aminglinux.000001 | 853| | | +------------------+----------+--------------+------------------+
⑤到從上執(zhí)行
change master to master_host='192.168.222.128',master_user='rep',master_password='AmingLinux.Com',master_log_file='aminglinux.000001',master_log_pos=853; start slave; show slave statusG
19.2.2 基于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線(xiàn)程將變更的binlog,寫(xiě)入到本地的relay log中。
③sql線(xiàn)程從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)有就用全部掃描。
4. GTID復(fù)制搭建
由于之前做過(guò)主從配置,可以先取消之前的主從。
slave上執(zhí)行:
stop slave; reset slave all;
master上執(zhí)行:
reset master;
① 主上修改配置文件,重啟mysql服務(wù)
server_id = 1 gtid_mode = on enforce_gtid_consistency=on log_bin=mysql-bin binlog_format=row log-slave-updates=1 skip-slave-start=1
② 從上修改配置文件,重啟mysql服務(wù)
server_id = 2 gtid_mode = on enforce_gtid_consistency=on log_bin=mysql-bin binlog_format=row log-slave-updates=1 skip-slave-start=1
③ 主上授權(quán)用戶(hù)
create user 'rep'@'192.168.222.132' identified with 'mysql_native_password' by 'AmingLinux.Com'; grant REPLICATION SLAVE on *.* to 'rep'@'192.168.222.132'; flush privileges;
④ 從上配置主從
stop slave; CHANGE MASTER TO MASTER_HOST='192.168.222.128', MASTER_USER='rep',MASTER_PASSWORD='AmingLinux.Com',MASTER_AUTO_POSITION=1,MASTER_CONNECT_RETRY=10; start slave;
④ 查看主從狀態(tài)
從上執(zhí)行
show slave statusG
⑤ 測(cè)試主從
主上新建一個(gè)數(shù)據(jù)庫(kù)
create database testd;
到從上查看是否有testd數(shù)據(jù)庫(kù)
show databases;
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9596瀏覽量
86968 -
數(shù)據(jù)備份
+關(guān)注
關(guān)注
0文章
57瀏覽量
11980 -
MySQL
+關(guān)注
關(guān)注
1文章
840瀏覽量
27332 -
日志
+關(guān)注
關(guān)注
0文章
140瀏覽量
10784 -
線(xiàn)程
+關(guān)注
關(guān)注
0文章
507瀏覽量
20019
原文標(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進(jìn)行一主一從的主從復(fù)制
MySQL主從復(fù)制原理詳解
一個(gè)操作把MySQL主從復(fù)制整崩了

聊聊RocketMQ的主從復(fù)制

什么是Redis主從復(fù)制

評(píng)論