分散式專題|面試官問我瞭解Mysql主從複製原理麼,我能說不會麼?

樂哉開講發表於2020-11-22

搭建Mysql主從同步之前,我們先來說他們之間同步的過程與原理:

同步複製過程

獻上一張圖,這張圖詮釋了整個同步過程
在這裡插入圖片描述

主從複製過程:

  • slave節點與主節點進行連線,建立主從關係,並把從哪開始同步,及哪個日誌檔案都一併傳送到master
  • master將修改的資料儲存到binlog中
  • master開啟binlog dump執行緒,將binlog日誌推送到連線的slave中
  • slave接受到推送的binlog,slave開啟IO執行緒將資料寫到中繼日誌(relay log)中
  • slave同時還會開啟一個SQL執行緒,對比中繼日誌中新增的內容,並且解析SQL,回放資料到從資料庫中

好的,複製過程已經說完了,我們現在實踐下,快速搭建一個mysql主從架構。

沒錯,我這裡還是使用docker搭建,因為它很香啊!

搭建Mysql 主從

建立mysql網路

docker network create mysqlNet

安裝mysql

  • 執行mysql主節點
docker run -p 3306:3306 --name mysql_master -h mysql_master --net=mysqlNet \
	-v ~/docker/mysql/mysql_master/log:/var/log/mysql \
	-v ~/docker/mysql/mysql_master/data:/var/lib/mysql \
	-v ~/docker/mysql/mysql_master/conf:/etc/mysql  \
	-e lower_case_table_names=1 \
	-e MYSQL_ROOT_PASSWORD=root \
	-d mysql:5.7
  • 修改配置檔案
# 編輯檔案
vim ~/docker/mysql/mysql_master/conf

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection=utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
## 同一區域網內注意要唯一
server-id=1  
## 開啟二進位制日誌功能,可以隨便取(關鍵)
log-bin=mysql-bin
  • 重啟mysql_master
docker restart mysql_master
  • 在master節點上 建立給從節點進行復制的使用者
docker exec -it mysql_master mysql -uroot -proot
# 建立使用者
CREATE USER 'mysql_slave'@'%' IDENTIFIED BY '111111';
# 授權
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'mysql_slave'@'%';
  • 執行mysql從節點
docker run -p 33306:3306 --name mysql_slave -h mysql_slave --net=mysqlNet \
	-v ~/docker/mysql/mysql_slave/log:/var/log/mysql \
	-v ~/docker/mysql/mysql_slave/data:/var/lib/mysql \
	-v ~/docker/mysql/mysql_slave/conf:/etc/mysql  \
	-e lower_case_table_names=1 \
	-e MYSQL_ROOT_PASSWORD=root \
	-d mysql:5.7
  • 編輯從節點配置檔案
# 編輯檔案
vim ~/docker/mysql/mysql_master/conf

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection=utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
## 設定server_id,注意要唯一
server-id=2 
## 開啟二進位制日誌功能,以備Slave作為其它Slave的Master時使用
log-bin=mysql-slave-bin   
## relay_log配置中繼日誌
relay_log=edu-mysql-relay-bin
## 設定只讀許可權
read_only = 1
innodb_read_only
## 使得更新的資料寫進二進位制日誌中
log_slave_updates = 1
#如果master庫名與salve庫名不同,使用以下配置[需要做對映]
#replicate-rewrite-db = [主庫名] -> [從庫名]
#如果不是要全部同步[預設全部同步],則指定需要同步的表
#replicate-wild-do-table=庫名.表1
#replicate-wild-do-table=庫名.表2

現在主從節點已經安裝完成,我們接下來需要讓他們建立關係:

先檢視master節點當前的狀態,主要看下日誌檔案和當前的位置

docker exec -it mysql_master mysql -uroot -proot
show master status;
exit
exit

結果如下:檔案為mysql-bin.000001 位置為629
在這裡插入圖片描述

拿到這些資訊之後,我們現在就可以讓從節點與主節點建立關係,並執行同步了:

docker exec -it mysql_slave mysql -uroot -proot
change master to master_host='mysql_master', master_user='mysql_slave', master_password='111111', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 629, master_connect_retry=30;

我們繼續看下slave節點的狀態

show slave status\G;

在這裡插入圖片描述

我們看到我們在文首提到的兩個執行緒並沒有啟動,所以我們需要手動啟動著兩個執行緒,一個命令就好了

start slave;

在這裡插入圖片描述

現在可以看到兩個執行緒已經在執行了。
到此,已經搭建完成了

測試

這個我就不演示了,大家可以在mysql_master上建立一個資料庫,看看是不是會同步到mysql_slave上。

微信搜一搜【樂哉開講】關注帥氣的我,回覆【乾貨領取】,將會有大量面試資料和架構師必看書籍等你挑選,包括java基礎、java併發、微服務、中介軟體等更多資料等你來取哦。

相關文章