一、主從的應用場景是什麼,爲何要作mysql的主從mysql
(1)業務變多後,數據庫的須要執行的事務,存在一條鎖表的sql,這時候若是單臺mysql,就會影響業務的運轉,速度變慢或者卡住。這時候就須要一個主從複製,來幫助業務提高效率
sql
(2)熱備份,兩個數據庫,就算一臺服務器down掉,甚至是數據丟失,那麼還有另外一臺從的庫中保留着相對較新的數據數據庫
(3)數據庫讀寫分離,主庫負責寫,從庫負責讀,從而使數據庫提高效率安全
二、主從的原理服務器
(1)mysql的備份方式,增量備份方式,是基於binlog的備份,那binlog的用途,簡單來講就是記錄數據庫中的執行操做的記錄,執行日誌異步
(2)主從複製的基礎是主庫記錄數據庫的全部變動記錄到binlog。binlog是數據庫中保存配置中過時時間內全部修改數據庫結構或內容的一個文件。若是過時時間是10d的話,那麼就是最近10d的數據庫修改記錄。spa
(3)mysql主從複製是一個異步的複製過程,主庫發送更新事件到從庫,從庫讀取更新記錄,並執行更新記錄,使得從庫的內容與主庫保持一致。線程
(4)在主庫裏,只要有更新事件出現,就會被依次地寫入到binlog裏面,是以後從庫鏈接到主庫時,從主庫拉取過來進行復制操做的數據源。日誌
binlog輸出線程。每當有從庫鏈接到主庫的時候,主庫都會建立一個線程而後發送binlog內容到從庫。
對於每個即將發送給從庫的sql事件,binlog輸出線程會將其鎖住。一旦該事件被線程讀取完以後,該鎖會被釋放,即便在該事件徹底發送到從庫的時候,該鎖也會被釋放。code
在從庫裏,當複製開始的時候,從庫就會建立兩個線程進行處理:
從庫I/O線程。當START SLAVE語句在從庫開始執行以後,從庫建立一個I/O線程,該線程鏈接到主庫並請求主庫發送binlog裏面的更新記錄到從庫上。
從庫I/O線程讀取主庫的binlog輸出線程發送的更新並拷貝這些更新到本地文件,其中包括relay log文件。
從庫的SQL線程。從庫建立一個SQL線程,這個線程讀取從庫I/O線程寫到relay log的更新事件並執行。
能夠知道,對於每個主從複製的鏈接,都有三個線程。擁有多個從庫的主庫爲每個鏈接到主庫的從庫建立一個binlog輸出線程,每個從庫都有它本身的I/O線程和SQL線程。
從庫經過建立兩個獨立的線程,使得在進行復制時,從庫的讀和寫進行了分離。所以,即便負責執行的線程運行較慢,負責讀取更新語句的線程並不會所以變得緩慢。好比說,若是從庫有一段時間沒運行了,當它在此啓動的時候,儘管它的SQL線程執行比較慢,它的I/O線程能夠快速地從主庫裏讀取全部的binlog內容。這樣一來,即便從庫在SQL線程執行完全部讀取到的語句前中止運行了,I/O線程也至少徹底讀取了全部的內容,並將其安全地備份在從庫本地的relay log,隨時準備在從庫下一次啓動的時候執行語句。
仔細分爲如下五個步驟
- 步驟一:主庫db的更新事件(update、insert、delete)被寫到binlog
- 步驟二:從庫發起鏈接,鏈接到主庫
- 步驟三:此時主庫建立一個binlog dump thread,把binlog的內容發送到從庫
- 步驟四:從庫啓動以後,建立一個I/O線程,讀取主庫傳過來的binlog內容並寫入到relay log
- 步驟五:還會建立一個SQL線程,從relay log裏面讀取內容,從
Exec_Master_Log_Pos
位置開始執行讀取到的更新事件,將更新內容寫入到slave的db