面試中的MySQL主從復制|手撕MySQL|對線面試官


關注微信公眾號【程序員白澤】,進入白澤的知識分享星球🌍

前言

作為《手撕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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM