1. 程式人生 > >運維必須要懂的MySQL主從複製原理

運維必須要懂的MySQL主從複製原理

為什麼要做主從複製?

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

2、做資料的熱備

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

MySQL主從複製的原理是什麼?

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

主從複製的基礎是主庫記錄資料庫的所有變更記錄到binlog。binlog是資料庫伺服器啟動的那一刻起,儲存所有修改資料庫結構或內容的一個檔案。

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主從複製是非同步的,不是按照上面的步驟執行的。

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

優秀的IT運維管理工具雲雀運維提醒您:作為一名運維的同學,這些基礎的MySQL知識還是需要多多學習哦。