深入挖崛:mysql主從複製原理

一、基本原理

MySQL複製過程分成三步:

  • 1)、master將改變記錄到二進制日誌(binary log)。這些記錄過程叫做二進制日誌事件,binary log events

  • 2)、slave將master的binary log events拷貝到它的中繼日誌(relay log);

  • 3)、slave重做中繼日誌中的事件,將改變應用到自己的數據庫中。 MySQL複製是異步的且串行化的。

簡單來說: slave會從master讀取binlog來進行數據同步

v2-c21ba63651aaf997100e7b096b9458ac_hd.jpg


v2-bd5ed2099cb67d2762f782d3798e5bc8_hd.jpg


Mysql的複製(replication)是一個異步的複製

實現整個複製操作主要由三個進程完成的,其中兩個進程在Slave(Sql進程和IO進程),另外一個進程在 Master(IO進程)上。

要實施複製,首先必須打開Master端的binary log(bin-log)功能,否則無法實現。

因爲整個複製過程實際上就是Slave從Master端獲取該日誌然後再在自己身上完全順序的執行日誌中所記錄的各種操作。

複製的詳細過程:
(1)Slave上面的IO進程連接上Master,並請求從指定日誌文件的指定位置(或者從最開始的日誌)之後的日誌內容;
(2)Master接收到來自Slave的IO進程的請求後,通過負責複製的IO進程根據請求信息讀取制定日誌指定位置之後的日誌信息,返回給Slave 的IO進程。返回信息中除了日誌所包含的信息之外,還包括本次返回的信息已經到Master端的bin-log文件的名稱以及bin-log的位置;
(3)Slave的IO進程接收到信息後,將接收到的日誌內容依次添加到Slave端的relay-log文件的最末端,並將讀取到的Master端的 bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的高速Master“我需要從某個bin-log的哪個位置開始往後的日誌內容,請發給我”;
(4)Slave的Sql進程檢測到relay-log中新增加了內容後,會馬上解析relay-log的內容成爲在Master端真實執行時候的那些可執行的內容,並在自身執行。

原則:

  • 每個slave只有一個master;

  • 每個slave只能有一個唯一的服務器ID;

  • 每個master可以有多個salve;

二、一主一從相關配置

演示主機爲Windows (配置文件爲my.ini文件),從機爲Linux(配置文件爲my.cnf

1、主機配置(windows的my.ini)

  • 1)、[必須]主服務器唯一ID;

  • 2)、[必須]啓用二進制日誌;

    • log-bin=自己本地的路徑/data/mysqlbin

    • log-bin=D:/devSoft/MySQLServer5.5/data/mysqlbin


  • 3)、[可選]啓用錯誤日誌

    • log-err=自己本地的路徑/data/mysqlerr

    • log-err=D:/devSoft/MySQLServer5.5/data/mysqlerr


  • 4)、[可選]根目錄

    • basedir="自己本地路徑"

    • basedir="D:/devSoft/MySQLServer5.5/"


  • 5)、[可選]臨時目錄

    • tmpdir="自己本地路徑"

    • tmpdir="D:/devSoft/MySQLServer5.5/"


  • 6)、[可選]數據目錄

    • datadir="自己本地路徑/Data/"

    • datadir="D:/devSoft/MySQLServer5.5/Data/"


  • 7)、[可選]設置不要複製的數據庫

    • binlog-ignore-db=mysql


  • 8)、[可選]設置需要複製的數據庫

    • binlog-do-db=需要複製的主數據庫名字


2、從機配置(linux的my.cnf)

  • [必須]從服務器唯一ID;

  • [可選]啓用二進制日誌;

v2-b7da989cd26d2d20be735bbb23c3c32e_hd.jpg


3、因修改過配置文件,請主機+從機都重啓後臺mysql服務

4、主從機都關閉linux防火牆

  • windows手動關閉;

  • 關閉虛擬機linux防火牆 service iptables stop

5、在Windows主機上建立帳戶並授權slave

  • GRANT REPLICATION SLAVE ON *.* TO 'zhangsan'@'從機器數據庫IP' IDENTIFIED BY '123456';

  • 刷新一下配置flush privileges;

  • 查詢master的狀態。

    • show master status;

    • 記錄下File和Position的值


  • 執行完此步驟後不要再操作主服務器MYSQL,防止主服務器狀態值變化。

v2-6ed1cd02f911b44b43f790ce4a49a671_hd.jpg


v2-d380fc0c39bc083bad5a09e1c4b4d0d9_hd.jpg


6、在Linux從機上配置需要複製的主機

  • 配置

CHANGE MASTER TO MASTER_HOST='主機IP',MASTER_USER='zhangsan',MASTER_PASSWORD='123456',MASTER_LOG_FILE='File名字',MASTER_LOG_POS=Position數字;
  • 啓動從服務器複製功能,start slave;

  • 查看配置

    • 下面兩個參數都是Yes,則說明主從配置成功!

    • Slave_IO_Running: Yes

    • Slave_SQL_Running: Yes


CHANGE MASTER TO MASTER_HOST='192.168.124.3',
MASTER_USER='zhangsan',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysqlbin.具體數字',MASTER_LOG_POS=具體值;

v2-a82b1fc4a89202fa7c79982e14dfffc8_hd.jpg


v2-15b7e173eaa783d4656c60b8bb8b3f44_hd.jpg


7、主機鍵表,看從機有沒有
8、如何停止主從服務複製功能
linux下面輸入stop slave;


免費Java高級資料需要自己領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高併發分佈式等教程,一共30G。
傳送門:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章