天天看點

mysql主從複制原理探索

經曆過一次mysql主從延遲之後,就開始思考,主從複制是什麼東西?它是怎麼實作的呢?它的原理是什麼?于是乎就開始查閱資料、文章,現将自己了解到的内容總結在此,加深印象。

上一篇文章裡面,講到了遇到mysql主從同步延遲的坑,對于這次的坑多說兩句,以前也看過這樣的例子,也知道不能夠寫完之後馬上更新,但是真正開發的時候還是沒有注意到這一點,道理大家都懂,但是還是會犯錯,隻有等到自己親生體驗到該錯誤之後,才真正的掌握到該道理。

為什麼要做主從複制?

1、在業務複雜的系統中,有這麼一個情景,有一句sql語句需要鎖表,導緻暫時不能使用讀的服務,那麼就很影響運作中的業務,使用主從複制,讓主庫負責寫,從庫負責讀,這樣,即使主庫出現了鎖表的情景,通過讀從庫也可以保證業務的正常運作。

2、做資料的熱備

3、架構的擴充。業務量越來越大,I/O通路頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O通路的頻率,提高單個機器的I/O性能。

mysql主從複制的原理是什麼?

binlog: binary log,主庫中儲存更新事件日志的二進制檔案。

主從複制的基礎是主庫記錄資料庫的所有變更記錄到binlog。binlog是資料庫中儲存配置中過期時間内所有修改資料庫結構或内容的一個檔案。如果過期時間是10d的話,那麼就是最近10d的資料庫修改記錄。

mysql主從複制是一個異步的複制過程,主庫發送更新事件到從庫,從庫讀取更新記錄,并執行更新記錄,使得從庫的内容與主庫保持一緻。

在主庫裡,隻要有更新事件出現,就會被依次地寫入到binlog裡面,是之後從庫連接配接到主庫時,從主庫拉取過來進行複制操作的資料源。

binlog輸出線程。每當有從庫連接配接到主庫的時候,主庫都會建立一個線程然後發送binlog内容到從庫。

對于每一個即将發送給從庫的sql事件,binlog輸出線程會将其鎖住。一旦該事件被線程讀取完之後,該鎖會被釋放,即使在該事件完全發送到從庫的時候,該鎖也會被釋放。

在從庫裡,當複制開始的時候,從庫就會建立兩個線程進行處理:

從庫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,随時準備在從庫下一次啟動的時候執行語句。

檢視主從複制的狀态

當主從複制正在進行中時,如果想檢視從庫兩個線程運作狀态,可以通過執行在從庫裡執行”show slave status\G”語句,以下的字段可以給你想要的資訊:

Master_Log_File — 上一個從主庫拷貝過來的binlog檔案
Read_Master_Log_Pos — 主庫的binlog檔案被拷貝到從庫的relay log中的位置
Relay_Master_Log_File — SQL線程目前進行中的relay log檔案
Exec_Master_Log_Pos — 目前binlog檔案正在被執行的語句的位置
           

整個主從複制的流程可以通過以下圖示了解:

  • 步驟一:主庫db的更新事件(update、insert、delete)被寫到binlog
  • 步驟二:從庫發起連接配接,連接配接到主庫
  • 步驟三:此時主庫建立一個binlog dump thread,把binlog的内容發送到從庫
  • 步驟四:從庫啟動之後,建立一個I/O線程,讀取主庫傳過來的binlog内容并寫入到relay log
  • 步驟五:還會建立一個SQL線程,從relay log裡面讀取内容,從

    Exec_Master_Log_Pos

    位置開始執行讀取到的更新事件,将更新内容寫入到slave的db
注:上面的解釋是解釋每一步做了什麼,整個mysql主從複制是異步的,不是按照上面的步驟執行的。
           

其他

關于主從複制架構的搭建,可以參考網上更多的文檔,文筆有限,不做更多的介紹。

作為一名開發,這些基礎的mysql知識還是需要多多學習。

參考資料

What is MySQL Replication and How Does It Work?

Replication Implementation Details

原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。

如果本文對你有幫助,請點下推薦吧,謝謝_

更多精彩内容,請關注個人公衆号。

繼續閱讀