首頁  >  文章  >  資料庫  >  為什麼要做主從複製?

為什麼要做主從複製?

零下一度
零下一度原創
2017-07-20 21:05:332294瀏覽

經歷過一次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 Replication

  • ##步驟一:主庫db的更新事件(update、insert、delete)被寫到binlog

  • 步驟二:從庫發起連接,連接到主庫

  • 步驟三:此時主庫建立一個binlog dump thread,把binlog的內容傳送到從函式庫

  • ##步驟四:從庫啟動之後,建立一個I/O線程,讀取主庫傳過來的binlog內容並寫入到relay log
  • 步驟五:也會建立一個SQL線程,從relay log裡面讀取內容,從
  • Exec_Master_Log_Pos

    位置開始執行讀取到的更新事件,將更新內容寫入到slave的db

注:上面的解释是解释每一步做了什么,整个mysql主从复制是异步的,不是按照上面的步骤执行的。

以上是為什麼要做主從複製?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn