MySql主從複製,從原理到實踐!

SpringBoot實戰電商項目mall(25k+star)地址:github.com/macrozheng/…mysql

摘要

本文將從MySql主從複製的原理出發,詳細介紹MySql在Docker環境下的主從複製搭建,以一個主實例和一個從實例實現主從複製爲例。git

什麼是主從複製?

主從複製是指將主數據庫的DDL和DML操做經過二進制日誌傳到從數據庫上,而後在從數據庫上對這些日誌進行從新執行,從而使從數據庫和主數據庫的數據保持一致。github

主從複製的原理

  • MySql主庫在事務提交時會把數據變動做爲事件記錄在二進制日誌Binlog中;
  • 主庫推送二進制日誌文件Binlog中的事件到從庫的中繼日誌Relay Log中,以後從庫根據中繼日誌重作數據變動操做,經過邏輯複製來達到主庫和從庫的數據一致性;
  • MySql經過三個線程來完成主從庫間的數據複製,其中Binlog Dump線程跑在主庫上,I/O線程和SQL線程跑着從庫上;
  • 當在從庫上啓動複製時,首先建立I/O線程鏈接主庫,主庫隨後建立Binlog Dump線程讀取數據庫事件併發送給I/O線程,I/O線程獲取到事件數據後更新到從庫的中繼日誌Relay Log中去,以後從庫上的SQL線程讀取中繼日誌Relay Log中更新的數據庫事件並應用,以下圖所示。

主實例搭建

  • 運行mysql主實例:
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7
複製代碼
  • 在mysql的配置文件夾/mydata/mysql-master/conf中建立一個配置文件my.cnf
touch my.cnf
複製代碼
  • 修改配置文件my.cnf,配置信息以下:
[mysqld]
## 設置server_id,同一局域網中須要惟一
server_id=101 
## 指定不須要同步的數據庫名稱
binlog-ignore-db=mysql  
## 開啓二進制日誌功能
log-bin=mall-mysql-bin  
## 設置二進制日誌使用內存大小(事務)
binlog_cache_size=1M  
## 設置使用的二進制日誌格式(mixed,statement,row)
binlog_format=mixed  
## 二進制日誌過時清理時間。默認值爲0,表示不自動清理。
expire_logs_days=7  
## 跳過主從複製中遇到的全部錯誤或指定類型的錯誤,避免slave端複製中斷。
## 如:1062錯誤是指一些主鍵重複,1032錯誤是由於主從數據庫數據不一致
slave_skip_errors=1062  
複製代碼
  • 修改完配置後重啓實例:
docker restart mysql-master
複製代碼
  • 進入mysql-master容器中:
docker exec -it mysql-master /bin/bash
複製代碼
  • 在容器中使用mysql的登陸命令鏈接到客戶端:
mysql -uroot -proot
複製代碼
  • 建立數據同步用戶:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
複製代碼

從實例搭建

  • 運行mysql從實例:
docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7
複製代碼
  • 在mysql的配置文件夾/mydata/mysql-slave/conf中建立一個配置文件my.cnf
touch my.cnf
複製代碼
  • 修改配置文件my.cnf:
[mysqld]
## 設置server_id,同一局域網中須要惟一
server_id=102
## 指定不須要同步的數據庫名稱
binlog-ignore-db=mysql  
## 開啓二進制日誌功能,以備Slave做爲其它數據庫實例的Master時使用
log-bin=mall-mysql-slave1-bin  
## 設置二進制日誌使用內存大小(事務)
binlog_cache_size=1M  
## 設置使用的二進制日誌格式(mixed,statement,row)
binlog_format=mixed  
## 二進制日誌過時清理時間。默認值爲0,表示不自動清理。
expire_logs_days=7  
## 跳過主從複製中遇到的全部錯誤或指定類型的錯誤,避免slave端複製中斷。
## 如:1062錯誤是指一些主鍵重複,1032錯誤是由於主從數據庫數據不一致
slave_skip_errors=1062  
## relay_log配置中繼日誌
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave將複製事件寫進本身的二進制日誌
log_slave_updates=1  
## slave設置爲只讀(具備super權限的用戶除外)
read_only=1  
複製代碼
  • 修改完配置後重啓實例:
docker restart mysql-slave
複製代碼

將主從數據庫進行鏈接

  • 鏈接到主數據庫的mysql客戶端,查看主數據庫狀態:
show master status;
複製代碼
  • 主數據庫狀態顯示以下:

  • 進入mysql-slave容器中:
docker exec -it mysql-slave /bin/bash
複製代碼
  • 在容器中使用mysql的登陸命令鏈接到客戶端:
mysql -uroot -proot
複製代碼
  • 在從數據庫中配置主從複製:
change master to master_host='192.168.6.132', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;  
複製代碼
  • 主從複製命令參數說明:sql

    • master_host:主數據庫的IP地址;
    • master_port:主數據庫的運行端口;
    • master_user:在主數據庫建立的用於同步數據的用戶帳號;
    • master_password:在主數據庫建立的用於同步數據的用戶密碼;
    • master_log_file:指定從數據庫要複製數據的日誌文件,經過查看主數據的狀態,獲取File參數;
    • master_log_pos:指定從數據庫從哪一個位置開始複製數據,經過查看主數據的狀態,獲取Position參數;
    • master_connect_retry:鏈接失敗重試的時間間隔,單位爲秒。
  • 查看主從同步狀態:docker

show slave status \G;
複製代碼
  • 從數據庫狀態顯示以下:

  • 開啓主從同步:
start slave;
複製代碼
  • 查看從數據庫狀態發現已經同步:

主從複製測試

主從複製的測試方法有不少,能夠在主實例中建立一個數據庫,看看從實例中是否有該數據庫,若是有,表示主從複製已經搭建成功。數據庫

  • 在主實例中建立一個數據庫mall

  • 在從實例中查看數據庫,發現也有一個mall數據庫,能夠判斷主從複製已經搭建成功。

公衆號

mall項目全套學習教程連載中,關注公衆號第一時間獲取。bash

公衆號圖片
相關文章
相關標籤/搜索