面試中的MySQL主從複製|手撕MySQL|對線面試官

白澤來了發表於2022-03-07

關注微信公眾號【程式設計師白澤】,進入白澤的知識分享星球?

前言

作為《手撕MySQL》系列的第三篇文章,今天講解使用bin log實現主從複製的功能。主從複製也是MySQL叢集實現高可用、資料庫讀寫分離的基石。因為是系列文章,上一篇文章中(傳送門)我們已經介紹了在MySQL中檢視bin log的相關狀態以及檔案資訊,並且藉助bin log(二進位制日誌)實現資料恢復的案例。因此在這篇文章中如有涉及相關知識,將不再贅述。

重申一下,資料恢復主從複製是bin log最重要的兩個功能,也是面試的重點,一定要有所瞭解~

主從複製架構

一主一從/一主多從/級聯

image-20220306182608427

這裡給出了基礎的兩種主從複製的架構圖,左側由一個主庫向三個從庫同步對資料庫的變更操作(上一篇文章中我們提到過bin log只會記錄變更資料庫的操作)。而右側則在這個基礎之上,將同步到資料的從庫繼續作為後一個從庫的“主庫”同步資料庫變更操作,但是這些操主從複製模式的基本原理都是一樣的。為了便於學習,本文後面講解的demo將基於一主一從的最簡單模式。

主從複製原理

image-20220306191346779

MySQL主從複製會有三個執行緒參與:

  • master端的log dump執行緒:

    當從結點連線到主結點之後,主節點會為每一個來自從結點的連線建立一個log dump執行緒與之通訊,log dump執行緒負責讀取master端的bin log資料檔案(多個log dump執行緒之間會互斥訪問bin log檔案——加鎖),將其傳送給對應slave端的接收執行緒。

  • slave端的I/O執行緒和SQL執行執行緒:

    slave端的兩個執行緒中,I/O執行緒是負責連線主節點,並不斷請求master端的新記錄的bin log變更日誌。I/O執行緒接收到log dump執行緒傳送過來的bin log變更之後,將其儲存在slave端本地的relay log檔案中(非同步緩衝),然後會由SQL執行緒讀取relay log檔案中的內容,並且轉換成SQL用於在slave端執行,達到同步主庫變更的效果(在講bin log資料恢復的時候,我們明白了資料恢復的本質就是再次執行一遍原先的SQL語句,而bin log中會記錄資料庫變更操作/行資料)

主從複製演示

下面我會用自己本地的MySQL資料庫作為從庫,而自己雲伺服器的MySQL作為主節點,通過主從複製,同步雲資料庫中的資料。並且在開始下面兩個步驟之前要確保主庫和從庫的server-id不同。

  • 從庫server-id設定為2,這個值可以通過修改mysql配置檔案並重啟的方式設定,也可以通過set global引數值的形式設定,具體可以Google~

image-20220306232631739

  • 主庫server-id設定為1

image-20220306232834013

配置master節點

我的雲資料庫是通過Docker映象部署的,如果你還不太清楚容器化技術,這裡也可以閱讀我寫過的一篇Docker入門文章(傳送門),下面會涉及一些docker操作命令,但如果只是為了瞭解主從複製的流程,繼續看下去也沒有任何問題 。

先通過docker ps檢視正在執行的docker容器,找到MySQL容器對應的ID

image-20220306193556361

通過容器ID,進入MySQL的docker映象(這裡-it後面是你MySQL容器的)

image-20220306193416832

然後在MySQL容器內部登入MySQL

image-20220306193727515

首先確保master節點的bin log已經開啟

image-20220306194214603

接下來在master節點上建立test_copy使用者,設定密碼為123456,並設定REPLICATION SLAVE許可權(這個賬號是給slave節點請求master節點用的)

image-20220306194416370

檢視當前master節點的bin log資料檔案的pos點(position點是位置的意思,可以簡單理解成每執行一個資料庫事務,就會從當前position開始執行,直到下一個position結束,下一次另一個事務就從前一個事務的結束position為起點開始記錄,因此兩個position之間就儲存著一個事務的執行步驟,而資料恢復也好,主從複製也好,核心原理就是拿到兩個pos點之間的資料檔案轉意成SQL事務,再執行一遍SQL事務)

image-20220306231135364

為了方便就直接用資料庫管理工具建立一張copy表,設立id和username兩個欄位,插入3條資料,我們再來看一下現在bin log資料檔案的pos點果然向後推了,表示對資料庫的變更被記錄到了bin log資料檔案中。

image-20220306231306203

至此master節點的配置完成,建立好了給slave節點的使用者,並且也準備了用於同步的資料。

image-20220306195845414

配置slave節點

現在我們用本地的MySQL資料庫作為從結點,執行下面的命令,通過上面我們在主結點註冊好的test_copy使用者去獲取主節點bin log中的變更資料。其中master_host是你的雲資料庫對應的伺服器的IP地址:xx.xx.xx.xx。

image-20220306231545682

執行start slave命令,從結點開始同步主節點變更資料。

image-20220306232105690

最後在本地資料庫(從資料庫上查詢得到copy資料庫被成功同步下來!大功告成,如果遇到了問題,我再手撕MySQL系列第一篇文章就教大家在遇到MySQL啟動相關問題時可以通過查詢錯誤日誌去看warning和error,找到原因),當然這只是一主一從進行資料同步的最簡單的一個demo,還有通過全域性事務ID代替pos點進行資料同步的方式,需要額外學習,本文就不多贅述。

image-20220306233011287

結束語

本文講解了使用bin log進行主從複製的基本原理,結合上一篇文章的資料恢復,二進位制日誌的兩大功能已經全部講解完成,相信在面試中如果遇到相關的知識點可以對答如流。

我是白澤,一名熱衷於知識分享的程式設計師/學生黨,關注微信公眾號【程式設計師白澤】,我會同步我的部落格文章,回覆簡歷,也可以獲得我正在使用的簡歷模板,建立了一個春秋招備戰/內推/閒聊群,歡迎交流。

image-20220307092954839

相關文章