mysql的主從複製 原理講解

qq_42533216發表於2020-11-10

為什麼要做主從複製

  1. 在業務複雜的系統中,有這麼一個情景,有一句sql語句需要鎖表,導致暫時不能使用讀的服務,那麼就很影響執行中的業務,使用主從複製,讓主庫負責寫,從庫負責讀,這樣,即使主庫出現了鎖表的情景,通過讀從庫也可以保證業務的正常執行。
  2. 做資料的熱備,主庫當機後能夠及時替換主庫,保證業務可用性。
  3. 架構的擴充套件。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的儲存,降低磁碟I/O訪問的頻率,提高單個機器的I/O效能。

MySQL主從複製的流程

在這裡插入圖片描述

  1. 主庫db的更新事件(update、insert、delete)被寫到binlog
  2. 主庫建立一個binlog dump thread,把binlog的內容傳送到從庫
  3. 從庫啟動併發起連線,連線到主庫
  4. 從庫啟動之後,建立一個I/O執行緒,讀取主庫傳過來的binlog內容並寫入到relay log
  5. 從庫啟動之後,建立一個SQL執行緒,從relay log裡面讀取內容,從Exec_Master_Log_Pos位置開始執行讀取到的更新事件,將更新內容寫入到slave的db

注:上述流程為相對流程,並非絕對流程

MySQL主從複製的原理

MySQL主從複製是一個非同步的複製過程,主庫傳送更新事件到從庫,從庫讀取更新記錄,並執行更新記錄,使得從庫的內容與主庫保持一致。

binlog:binary log,主庫中儲存所有更新事件日誌的二進位制檔案。binlog是資料庫服務啟動的一刻起,儲存資料庫所有變更記錄(資料庫結構和內容)的檔案。在主庫中,只要有更新事件出現,就會被依次地寫入到binlog中,之後會推送到從庫中作為從庫進行復制的資料來源。

binlog輸出執行緒:每當有從庫連線到主庫的時候,主庫都會建立一個執行緒然後傳送binlog內容到從庫。 對於每一個即將傳送給從庫的sql事件,binlog輸出執行緒會將其鎖住。一旦該事件被執行緒讀取完之後,該鎖會被釋放,即使在該事件完全傳送到從庫的時候,該鎖也會被釋放。

在從庫中,當複製開始時,從庫就會建立從庫I/O執行緒和從庫的SQL執行緒進行復制處理。

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

參考:https://www.hoohack.me/2017/07/11/learning-mysql-replication-detail

 

一、什麼是主從複製主從複製,是用來建立一個和主資料庫完全一樣的資料庫環境,稱為從資料庫;主資料庫一般是準實時的業務資料庫。 二、主從複製的作用(好處,或者說為什麼要做主從)重點! 1、做資料的熱備,作為後備資料庫,主資料庫伺服器故障後,可切換到從資料庫繼續工作,避免資料丟失。 2、架構的擴充套件。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的儲存,降低磁碟I/O...

  • yanbin0830

    yanbincn:寫了這麼多,有點沒理解,倒地是主庫有操作之後推給從庫,還是從庫連線主庫請求主庫傳送?7月前回復

    1

    • zai_xia

      佔位符號回覆:首先,主庫裡面執行緒是不會頻繁啟停的,有一個常駐執行緒,其次,主從連線用的是長連線,不是短連線,長連線消耗資源,這是對的,但是一個主庫連線幾個從庫的話,其消耗的資源是很小的,連幾十上百個從庫,這個消耗就很大了,但一般不會這麼配置。7月前回復

    • yanbin0830

      yanbincn回覆佔位符號:那就是說主庫實時修改就推,相當於複製是同步的,或者說是準同步的,並且執行緒停起頻繁,如果和從庫長鏈的話,消耗效能,如果是鍛鍊的話頻繁建立連線。這樣會不會增加主庫的壓力呢?7月前回復

    • zai_xia

      佔位符號回覆:主庫有操作之後,有一個執行緒向子庫傳送binlog資料,這時子庫還有另一個執行緒會接收來自主庫的binlog資料,並寫入到中繼日誌中(relay log),然後子庫再根據這個中繼日誌,再用一個執行緒去回放主庫中進行過的操作。7月前回復

相關文章