docker搭建mysql的主從複製架構

本教程環境

服務器:CentOS7.7(推薦使用該版本)
需安裝docker,安裝docker環境教程請移步 https://blog.csdn.net/weixin_44790046/article/details/105612438

一、搭建主數據庫

注意:主從複製需要注意的地方
	● 主DB server和從DB server數據庫的版本一致
	● 主DB server和從DB server數據庫數據一致
	● 主DB server開啓二進制日誌,主DB server和從DB server的server_id都必須唯一

1)創建目錄

#進入根目錄
cd /
#創建目錄
mkdir -p mysql/master
cd mysql/master
mkdir conf data

在這裏插入圖片描述
2)創建配置文件

cd conf/
#創建配置文件
vim my.cnf

#在裏面寫入如下內容
[mysqld]
server-id	= 1	#服務id,不可重複
log-bin		= mysql-bin	#開啓二進制日誌

3)拉取mysql5.7鏡像

docker pull mysql:5.7

鏡像已拉取
在這裏插入圖片描述
4)創建mysql容器

docker run -d \
--name mysql_master \
-v /mysql/master/data:/var/lib/mysql \
-v /mysql/master/conf/my.cnf:/etc/my.cnf \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=362623 \
mysql:5.7

在這裏插入圖片描述
5)查看目錄是否掛載成功(重要),如果/mysql/master/data目錄有如下文件說明掛載成功
在這裏插入圖片描述
6)進入容器登錄mysql(可以用遠程連接工具連接)

docker exec -it mysql_master /bin/bash

在這裏插入圖片描述
7)創建一個同步用戶以及授權

create user 'admin'@'%' identified by '362623';

grant replication slave on *.* to 'admin'@'%';

flush privileges;

看到mysql數據庫中多了一個admin用戶
在這裏插入圖片描述
如果執行過程中出現[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and錯誤

#解決方案,在my.cnf配置文件中添加如下設置
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'

8)查看mysql二進制日誌功能是否開啓

#查看mysql二進制日誌功能是否開啓
show variables like '%log_bin%';

在這裏插入圖片描述

#查看master狀態
show master status;

#查看二進制日誌相關的配置項
show global variables like 'binlog%';

#查看s erver相關的配置項
show global variables like 'server%';

在這裏插入圖片描述
出現這個日誌文件就可以了,後面要用這兩個信息

二、搭建從數據庫

1)創建目錄

#進入根目錄
cd /
#創建目錄
mkdir -p mysql/slave01
cd mysql/slave01
mkdir conf data

在這裏插入圖片描述
2)創建配置文件

cd conf/
#創建配置文件
vim my.cnf

#在裏面寫入如下內容
[mysqld]
server-id	= 2	#服務id,不可重複

創建mysql從數據庫容器

#創建容器
docker run -d \
--name mysql_slave01 \
-v /mysql/slave01/data:/var/lib/mysql \
-v /mysql/slave01/conf/my.cnf:/etc/my.cnf \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=362623 \
mysql:5.7

在這裏插入圖片描述
4)查看目錄是否掛載成功(重要),如果/mysql/slave01/data目錄有如下文件說明掛載成功
在這裏插入圖片描述
5)進入容器登錄mysql(可以用遠程連接工具連接)

docker exec -it mysql_slave01 /bin/bash

在這裏插入圖片描述
6)設置主庫master的相關信息(注意:以下執行sql都是在從庫中執行

#設置主庫master的相關信息
CHANGE MASTER TO
 master_host='192.168.200.131',	#你的宿主機ip
 master_user='admin',	#上面在主數據庫添加的用戶名
 master_password= '362623',	#上面在主數據庫添加的用戶名密碼
 master_port=3306,	#主數據庫端口
 master_log_file='mysql-bin.000003',	#主數據庫搭建最後一步的那兩個信息
 master_log_pos=741;	#主數據庫搭建最後一步的那兩個信息

在這裏插入圖片描述
7)啓動同步

start slave;

注意:這裏如果執行start slave 命令出現 Slave failed to initialize relay log info structure from the repository 錯誤,那麼就是執行 reset slave; 命令清除記錄再次執行第6步設置主庫master的相關信息

在這裏插入圖片描述
8)查看master狀態,如果紅框兩項都爲yes那麼恭喜你搭建成功

show slave status;

在這裏插入圖片描述

三、修改主從複製模式

#查看mysql_master二進制日誌相關的配置項
show global variables like 'binlog%';

可以看到當前模式默認爲ROW(基於行的複製)
在這裏插入圖片描述

在查看二進制日誌相關參數內容中,會發現默認的模式爲ROW ,其實在MySQL中提供了有3種模式,基於SQL語句的複製(statement-based replication, SBR) ,基於行的複製(row-based replication, RBR) ,混合模式複製(mixed-based replication, MBR)。對應的, binlog的格式也有三種: STATEMENT , ROW , MIXED。

STATEMENT模式(SBR)

  • 優點是並不需要記錄每一條sql語句和每一 行的數據變化 ,減少了binlog日誌量,節約IO ,提高性能。
  • 缺點是在某些情況下會導致master-slave中的數據不一致(如sleep)函數 ,last_insert_id() ,以及user-defined functions(udf)等會出現問題

ROW模式( RBR )

  • 不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改成什麼樣了。而且不會出現某些特定情況下
    的存儲過程、或function、 或trgger的調用和觸發無法被正確複製的問題。缺點是會產生大量的日誌,尤其是
    alter table的時候會讓日誌暴漲。

MIXED模式( MBR )

  • 以上兩種模式的混合使用,一般的複製使用STATEMENT模式保存binlog ,對於STATEMENT模式無法複製的操作使
    用ROW模式保存binlog , MySQL會根據執行的SQL語句選擇日誌保存方式。
    建議使用MIXED模式。

修改主庫配置文件my.cnf

#追加下面配置
binlog_format	= MIXED

#重啓並查看日誌
docker restart mysql_master && docker logs -f mysql_master

#再次查看二進制日誌相關的配置項
show global variables like 'binlog%';

在這裏插入圖片描述
在這裏插入圖片描述

測試

在主庫中新建ceshi數據庫並創建user表,在裏面添加一條記錄
在這裏插入圖片描述
我們發現從庫也有了這張表和數據
在這裏插入圖片描述

至此,我們就實現了主從複製,當我們去執行寫入的操作就可以寫入到主庫中,當執行查的操作就去從庫查詢,這樣就節省了主庫的壓力。

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