什么是主從復制
簡單講,MySQL主從復制就是數據寫入一臺服務器(主服務器)后,同時還會額外寫入另外的服務器(從服務器)。也就是說數據會寫多份,這樣做的目的主要有兩個:
1)備份數據;
2)做負載均衡,對于寫來說沒有效果,但是對于讀是可以做到負載均衡的。
主從復制原理
1)主上將所有變更事件記錄到binlog里
2)從發起請求連接主
3)主的binlog備份線程將binlog傳給從
4)從的I/O線程將binlog解析成自己的relay log
5)從的SQL線程根據relay log來執行具體的SQL語句
MySQL主從復制是一個異步的復制過程,主庫發送更新事件到從庫,從庫讀取更新記錄,并執行更新記錄,使得從庫的內容與主庫保持一致。
概念解釋
Binlog:binary log,主庫中保存所有更新事件日志的二進制文件。binlog是數據庫服務啟動的一刻起,保存數據庫所有變更記錄(數據庫結構和內容)的文件。在主庫中,只要有更新事件出現,就會被依次地寫入到binlog中,之后會推送到從庫中作為從庫進行復制的數據源。
Binlog dump線程:每當有從庫連接到主庫的時候,主庫都會創建一個線程然后發送binlog內容到從庫。對于每一個即將發送給從庫的sql事件,binlog dump線程會將其鎖住。一旦該事件被線程讀取完之后,該鎖會被釋放,即使在該事件完全發送到從庫的時候,該鎖也會被釋放。
在從庫中,當復制開始時,從庫就會創建從庫I/O線程和從庫的SQL線程進行復制處理。
從庫I/O線程:當START SLAVE語句在從庫開始執行之后,從庫創建一個I/O線程,該線程連接到主庫并請求主庫發送binlog里面的更新記錄到從庫上。從庫I/O線程讀取主庫的binlog輸出線程發送的更新并拷貝這些更新到本地文件,其中包括relay log文件。
從庫的SQL線程:從庫創建一個SQL線程,這個線程讀取從庫I/O線程寫到relay log的更新事件并執行。
基于GTID的主從復制
1)什么是GTID
GTID(Global Transaction ID)是對于一個已提交事務的編號,并且是一個全局唯一的編號。GTID實際上是由UUID+TID組成的。其中UUID是一個MySQL實例的唯一標識,保存在mysql數據目錄下的auto.cnf文件里。TID代表了該實例上已經提交的事務數量,并且隨著事務提交單調遞增。下面是一個GTID的具體形式:3E11FA47-71CA-11E1-9E33-C80AA9429562:23
2)GTID的作用
根據GTID可以知道事務最初是在哪個實例上提交的,GTID的存在方便了Replication的Failover(故障切換)
3)GTID比傳統復制的優勢
更簡單的實現failover,不用以前那樣在需要找log_file和log_Pos。更簡單的搭建主從復制。比傳統復制更加安全。GTID是連續沒有空洞的,因此主從庫出現數據沖突時,可以用添加空事物的方式進行跳過。
4)GTID的工作原理:
① master更新數據時,會在事務前產生GTID,一同記錄到binlog日志中。
② slave端的i/o線程將變更的binlog,寫入到本地的relay log中。
③ sql線程從relay log中獲取GTID,然后對比slave端的binlog是否有記錄。
④ 如果有記錄,說明該GTID的事務已經執行,slave會忽略。
⑤ 如果沒有記錄,slave就會從relay log中執行該GTID的事務,并記錄到binlog。
⑥ 在解析過程中會判斷是否有主鍵,如果有就用二級索引,如果沒有就用全部掃描。
審核編輯:湯梓紅
-
服務器
+關注
關注
12文章
9293瀏覽量
85850 -
SQL
+關注
關注
1文章
773瀏覽量
44211 -
MySQL
+關注
關注
1文章
829瀏覽量
26670 -
線程
+關注
關注
0文章
505瀏覽量
19722 -
binlog
+關注
關注
0文章
7瀏覽量
1252
原文標題:MySQL主從復制原理
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論