本文需要用户已安装Docker服务
版本信息
Docker版本:19.03.2
Mysql版本:8.0.17
Linux版本:3.10 (Centos7.6)
拉取Mysql官方镜像
docker pull mysql:8.0.17
创建Mysql主从服务所需引用外部目录及文件配置
(1) Master服务
mkdir -p /data/mysql/master/conf #my.cnf配置文件存放目录
mkdir -p /data/mysql/master/data #数据存储目录
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服务
mkdir -p /data/mysql/slave/conf #my.cnf配置文件存放目录
mkdir -p /data/mysql/slave/data #数据存储目录
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/
启动Mysql服务镜像(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
启动命令解释:
(1)-p 3306:3306 #指定端口号 第一个3306代表宿主机端口号,第二个端口号代表容器端口号
(2)--name mysql-master #指定容器名称
(3)--privileged=true #使用该参数,容器内的root拥有真正的root权限。否则,容器内的root只是外部的一个普通用户权限
(4)-v /data/mysql/master/conf/my.cnf:/etc/mysql/my.cnf -v /data/mysql/master/data:/var/lib/mysql # -v表示挂载外部目录,冒号前代表所挂载的外部目录,冒号后代表映射的容器内目录
(5)-e MYSQL_ROOT_PASSWORD=123456 # -e表示传入的环境参数,这里的MYSQL_ROOT_PASSWORD就是Mysql镜像所提供的root用户密码环境参数配置
(6)-d mysql:8.0.17 # -d 开启Daemon模式(守护进程),后面的mysql:8.0.17就是指定要运行的镜像
启动Mysql服务镜像(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
查看已启动的容器
docker ps
可以看到我们上面已经启动的两个mysql容器mysql-master和mysql-slave
配置mysql-master数据库(主数据库)
进入mysql-master容器
docker exec -it mysql-master /bin/bash
登录主库mysql数据库
mysql -u root -p
在主库上创建同步用户并授权
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地址应为对应容器的IP地址,可通过“docker inspect 容器ID”查看指定容器IP地址
最后增加远程访问用户 并赋予所有权限,远程访问测试用
CREATE USER tang IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'tang'@'%';
修复远程登录报报 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的状态,此处File,Position数据在配置从库时用到
show master status;
配置mysql-slave数据库(从数据库)
进入mysql-slave容器
docker exec -it mysql-slave /bin/bash
登录从库mysql数据库
mysql -u root -p
配置从服务器Slave:(后面两个数据从主库查询得出)
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的状态,Slave_IO_Running及Slave_SQL_Running进程必须正常运行,即YES状态,否则都是错误的状态
show slave status\G
最后同样增加远程访问用户 并赋予所有权限,远程访问测试用
CREATE USER tang IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'tang'@'%';
修复远程登录报报 caching_sha2_password异常
ALTER USER 'tang'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'tang'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
至此同步相关配置 已完成,接下来可以测试了,大家可以自己选择工具进行测试,这里就不进行赘述了。