關注微信公眾號【程序員白澤】,進入白澤的知識分享星球🌍
前言
作為《手撕MySQL》系列的第三篇文章,今天講解使用bin log
實現主從復制的功能。主從復制也是MySQL集群實現高可用、數據庫讀寫分離的基石。因為是系列文章,上一篇文章中(傳送門)我們已經介紹了在MySQL中查看bin log
的相關狀態以及文件信息,並且借助bin log
(二進制日志)實現數據恢復的案例。因此在這篇文章中如有涉及相關知識,將不再贅述。
重申一下,數據恢復和主從復制是bin log最重要的兩個功能,也是面試的重點,一定要有所了解~
主從復制架構
一主一從/一主多從/級聯
這里給出了基礎的兩種主從復制的架構圖,左側由一個主庫向三個從庫同步對數據庫的變更操作(上一篇文章中我們提到過bin log只會記錄變更數據庫的操作)。而右側則在這個基礎之上,將同步到數據的從庫繼續作為后一個從庫的“主庫”同步數據庫變更操作,但是這些操主從復制模式的基本原理都是一樣的。為了便於學習,本文后面講解的demo將基於一主一從的最簡單模式。
主從復制原理
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~
- 主庫server-id設置為1
配置master節點
我的雲數據庫是通過Docker鏡像部署的,如果你還不太清楚容器化技術,這里也可以閱讀我寫過的一篇Docker入門文章(傳送門),下面會涉及一些docker操作命令,但如果只是為了了解主從復制的流程,繼續看下去也沒有任何問題 。
先通過docker ps查看正在運行的docker容器,找到MySQL容器對應的ID
通過容器ID,進入MySQL的docker鏡像(這里-it后面是你MySQL容器的)
然后在MySQL容器內部登錄MySQL
首先確保master節點的bin log已經開啟
接下來在master節點上創建test_copy用戶,設置密碼為123456,並設置REPLICATION SLAVE權限(這個賬號是給slave節點請求master節點用的)
查看當前master節點的bin log數據文件的pos點(position點是位置的意思,可以簡單理解成每執行一個數據庫事務,就會從當前position開始執行,直到下一個position結束,下一次另一個事務就從前一個事務的結束position為起點開始記錄,因此兩個position之間就存儲着一個事務的執行步驟,而數據恢復也好,主從復制也好,核心原理就是拿到兩個pos點之間的數據文件轉意成SQL事務,再執行一遍SQL事務)
為了方便就直接用數據庫管理工具建立一張copy表,設立id和username兩個字段,插入3條數據,我們再來看一下現在bin log數據文件的pos點果然向后推了,表示對數據庫的變更被記錄到了bin log數據文件中。
至此master節點的配置完成,創建好了給slave節點的用戶,並且也准備了用於同步的數據。
配置slave節點
現在我們用本地的MySQL數據庫作為從結點,執行下面的命令,通過上面我們在主結點注冊好的test_copy用戶去獲取主節點bin log中的變更數據。其中master_host是你的雲數據庫對應的服務器的IP地址:xx.xx.xx.xx。
執行start slave命令,從結點開始同步主節點變更數據。
最后在本地數據庫(從數據庫上查詢得到copy數據庫被成功同步下來!大功告成,如果遇到了問題,我再手撕MySQL系列第一篇文章就教大家在遇到MySQL啟動相關問題時可以通過查詢錯誤日志去看warning和error,找到原因),當然這只是一主一從進行數據同步的最簡單的一個demo,還有通過全局事務ID代替pos點進行數據同步的方式,需要額外學習,本文就不多贅述。
結束語
本文講解了使用bin log進行主從復制的基本原理,結合上一篇文章的數據恢復,二進制日志的兩大功能已經全部講解完成,相信在面試中如果遇到相關的知識點可以對答如流。
我是白澤,一名熱衷於知識分享的程序員/學生黨,關注微信公眾號【程序員白澤】,我會同步我的博客文章,回復簡歷,也可以獲得我正在使用的簡歷模板,建立了一個春秋招備戰/內推/閑聊群,歡迎交流。