Docker上部署mysql8主從復制的實現

環境準備

需要一個 MySQL8 版本的 MySQL,因為我個人沒有用過 mysql5,不知道二者是否會有一些特性上的偏差。

默認你與我的環境是一樣的。

簡易版本安裝

先僅僅安裝一個 MySQL,一上來就主從的話很多細節都會雜糅在一起。

docker run -d -p 3306:3306 --privileged=true -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456  --name mysql mysql

這裡的參數介紹一下:

-p:指定內外端口映射,虛擬機為外,docker 容器為內,寫在前面的為外部端口,寫在後面的為內部端口。因為 MySQL 本身端口為 3306,為瞭不使你們混淆,我外部端口不設置為 3306。
-v:指定內外存儲卷映射,Docker 實踐經驗(三)講的就是這個。
-e:往容器內部傳參,最後會由 MySQL 來接收。關於這個 -e 其實我也還沒研究它的一個走勢。

這樣一個簡易的 MySQL 就能動瞭。

設置密碼

沒有設置密碼的話,不確定第二次要登錄的時候是否還能進得去瞭。
不確定的意思就是可能進得去,可能進不去。

所以我們自行設置一個密碼比較保險。

mysql> use mysql

mysql> update user set authentication_string='123456' where user='root' and host='localhost';

mysql> flush privileges;

不用註釋吧。

現在這個 MySQL 能動瞭吧,可以考慮刪掉瞭,咱開始做主從復制。

如果想留著用的:
修改 my.cnf,通過數據卷同步給MySQL:

cd /mysql/conf
vim my.cnf
插入以下內容:
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

重啟MySQL:

docker restart mysql
docker exec -it mysql bash

配置 MySQL 主從復制

創建 bridge 網絡並指定 IP 區間

docker network create --driver bridge mysql-master-slave

mysql連接數默認不夠

set global max_connections=500;
set global mysqlx_max_connections=500;

創建數據和配置存放目錄

# 創建主庫數據存放目錄
mkdir -p /home/docker/mysql/master/data
# 創建主庫配置存放目錄
mkdir -p /home/docker/mysql/master/conf
 
# 創建從庫1數據存放目錄
mkdir -p /home/docker/mysql/slave1/data
# 創建從庫1配置存放目錄
mkdir -p /home/docker/mysql/slave1/conf

準備配置文件

主數據庫

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
 
secure-file-priv= NULL
 
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
 
# 服務器唯一ID,默認是1
server-id=10
 
# 啟用二進制日志
log-bin=mysql-bin
 
# 最大連接數 
max_connections=10000
 
# 設置默認時區
default-time_zone='+8:00'
 
# 0:區分大小寫
# 1:不區分大小寫
lower_case_table_names=1
 
!includedir /etc/mysql/conf.d/

從數據庫

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
 
secure-file-priv= NULL
 
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
 
# 服務器唯一ID,默認是1
server-id=11
 
# 啟用二進制日志
log-bin=mysql-bin
 
# 最大連接數 
max_connections=10000
 
# 設置默認時區
default-time_zone='+8:00'
 
# 0:區分大小寫
# 1:不區分大小寫
lower_case_table_names=1
 
!includedir /etc/mysql/conf.d/

啟動數據庫

啟動主數據庫

如果上面完全按照我的步驟來,這裡的命令也不用改參數。

docker run -d -p 3316:3306 --name mysql_master --restart=always --network mysql-master-slave -v /home/docker/mysql/master/data:/var/lib/mysql -v /home/docker/mysql/master/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql

啟動從數據庫

docker run -d -p 3326:3306 --name mysql_slave1 --restart=always --network mysql-master-slave -v /home/docker/mysql/slave1/data:/var/lib/mysql -v /home/docker/mysql/slave1/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql

遠程訪問配置(主從)

# 在容器 mysql_master 中開啟一個交互模式的終端
docker exec -it mysql_master /bin/bash
 
# 在容器 mysql_slave1 中開啟一個交互模式的終端
docker exec -it mysql_slave1 /bin/bash
 
# mysql 登錄
mysql -u root -p
 
# 給予遠程用戶所有表所有權限
GRANT ALL ON *.* TO 'root'@'%';
 
# 更改加密規則
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
 
# 遠程訪問
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
 
# 刷新權限
flush privileges;

主庫創建復制用戶

CREATE USER 'woniu'@'%' IDENTIFIED WITH mysql_native_password BY 'woniu123456';
 
GRANT REPLICATION SLAVE ON *.* TO 'woniu'@'%';

flush privileges;

查看 master 機器的狀態

SHOW MASTER STATUS;

從庫設置 master 的信息

如果前面完全按我的步驟來,這裡需要填寫你們自己宿主機上的 ip、還有上圖中顯示的那兩個數據。

change master to master_host='192.168.190.133', master_user='woniu', master_password='woniu123456', master_port=3316, master_log_file='mysql-bin.000003', master_log_pos=2838, master_connect_retry=30;

參數釋義:

  • master_host:主數據庫的IP地址;
  • master_port:主數據庫的運行端口;
  • master_user:在主數據庫創建的用於同步數據的用戶賬號;
  • master_password:在主數據庫創建的用於同步數據的用戶密碼;
  • master_log_file:指定從數據庫要復制數據的日志文件,通過查看主數據的狀態,獲取File參數;
  • master_log_pos:指定從數據庫從哪個位置開始復制數據,通過查看主數據的狀態,獲取Position參數;
  • master_connect_retry:連接失敗重試的時間間隔,單位為秒。

開啟主從復制

# 開始同步
start slave;
 
# 同步狀態
show slave status ;

如果成功,圈出來的地方要都是 yes、
如果失敗,會顯示日志:

可自行百度,不過百度出來的不一定就適用於咱,畢竟咱是在 docker 上部署的,現有資料較少。
要靠經驗。

到此這篇關於Docker上部署mysql8主從復制的實現的文章就介紹到這瞭,更多相關Docker部署mysql8主從復制內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: