本文需要用戶已安裝Docker服務(wù)
版本信息
Docker版本:19.03.2
Mysql版本:8.0.17
Linux版本:3.10 (Centos7.6)
拉取Mysql官方鏡像
docker pull mysql:8.0.17
創(chuàng)建Mysql主從服務(wù)所需引用外部目錄及文件配置
(1) Master服務(wù)
mkdir -p /data/mysql/master/conf #my.cnf配置文件存放目錄
mkdir -p /data/mysql/master/data #數(shù)據(jù)存儲(chǔ)目錄
vi /data/mysql/master/conf/my.cnf #編輯mysql配置文件
將如下代碼添加到my.cnf文件中
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
#注意此處server-id必須唯一
server-id=1
log-bin=mysql-bin
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
!includedir /etc/mysql/conf.d/
(2) Slave服務(wù)
mkdir -p /data/mysql/slave/conf #my.cnf配置文件存放目錄
mkdir -p /data/mysql/slave/data #數(shù)據(jù)存儲(chǔ)目錄
vi /data/mysql/slave/conf/my.cnf #編輯mysql配置文件
將如下代碼添加到my.cnf文件中
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
#注意此處server-id必須唯一
server-id=2
log-bin=mysql-bin
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
!includedir /etc/mysql/conf.d/
啟動(dòng)Mysql服務(wù)鏡像(master)
docker run -p 3306:3306 --name mysql-master --privileged=true -v /data/mysql/master/conf/my.cnf:/etc/mysql/my.cnf -v /data/mysql/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.17
啟動(dòng)命令解釋:
(1)-p 3306:3306 #指定端口號(hào) 第一個(gè)3306代表宿主機(jī)端口號(hào),第二個(gè)端口號(hào)代表容器端口號(hào)
(2)--name mysql-master #指定容器名稱
(3)--privileged=true #使用該參數(shù),容器內(nèi)的root擁有真正的root權(quán)限。否則,容器內(nèi)的root只是外部的一個(gè)普通用戶權(quán)限
(4)-v /data/mysql/master/conf/my.cnf:/etc/mysql/my.cnf -v /data/mysql/master/data:/var/lib/mysql # -v表示掛載外部目錄,冒號(hào)前代表所掛載的外部目錄,冒號(hào)后代表映射的容器內(nèi)目錄
(5)-e MYSQL_ROOT_PASSWORD=123456 # -e表示傳入的環(huán)境參數(shù),這里的MYSQL_ROOT_PASSWORD就是Mysql鏡像所提供的root用戶密碼環(huán)境參數(shù)配置
(6)-d mysql:8.0.17 # -d 開啟Daemon模式(守護(hù)進(jìn)程),后面的mysql:8.0.17就是指定要運(yùn)行的鏡像
啟動(dòng)Mysql服務(wù)鏡像(slave)
docker run -p 3307:3306 --name mysql-slave --privileged=true -v /data/mysql/slave/conf/my.cnf:/etc/mysql/my.cnf -v /data/mysql/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.17
查看已啟動(dòng)的容器
docker ps
可以看到我們上面已經(jīng)啟動(dòng)的兩個(gè)mysql容器mysql-master和mysql-slave

配置mysql-master數(shù)據(jù)庫(kù)(主數(shù)據(jù)庫(kù))
進(jìn)入mysql-master容器
docker exec -it mysql-master /bin/bash
登錄主庫(kù)mysql數(shù)據(jù)庫(kù)
mysql -u root -p
在主庫(kù)上創(chuàng)建同步用戶并授權(quán)
CREATE USER 'replicate'@'172.18.0.2' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'172.18.0.2';
FLUSH PRIVILEGES;
上面代碼中'replicate'@'172.18.0.2'的IP地址應(yīng)為對(duì)應(yīng)容器的IP地址,可通過“docker inspect 容器ID”查看指定容器IP地址
最后增加遠(yuǎn)程訪問用戶 并賦予所有權(quán)限,遠(yuǎn)程訪問測(cè)試用
CREATE USER tang IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'tang'@'%';
修復(fù)遠(yuǎn)程登錄報(bào)報(bào) caching_sha2_password異常
ALTER USER 'tang'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'tang'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
查詢master的狀態(tài),此處File,Position數(shù)據(jù)在配置從庫(kù)時(shí)用到
show master status;
配置mysql-slave數(shù)據(jù)庫(kù)(從數(shù)據(jù)庫(kù))
進(jìn)入mysql-slave容器
docker exec -it mysql-slave /bin/bash
登錄從庫(kù)mysql數(shù)據(jù)庫(kù)
mysql -u root -p
配置從服務(wù)器Slave:(后面兩個(gè)數(shù)據(jù)從主庫(kù)查詢得出)
change master to master_host='172.18.0.2',master_port=3006,master_user='replicate',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1593;
start slave;
查詢slave的狀態(tài),Slave_IO_Running及Slave_SQL_Running進(jìn)程必須正常運(yùn)行,即YES狀態(tài),否則都是錯(cuò)誤的狀態(tài)
show slave status\G
最后同樣增加遠(yuǎn)程訪問用戶 并賦予所有權(quán)限,遠(yuǎn)程訪問測(cè)試用
CREATE USER tang IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'tang'@'%';
修復(fù)遠(yuǎn)程登錄報(bào)報(bào) caching_sha2_password異常
ALTER USER 'tang'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'tang'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
至此同步相關(guān)配置 已完成,接下來可以測(cè)試了,大家可以自己選擇工具進(jìn)行測(cè)試,這里就不進(jìn)行贅述了。