本机版本信息:
CentOS 7.6.1810 64bit
Docker 19.03.10
Mysql 8.0.20
参考链接:https://www.cnblogs.com/djj123/p/11289043.html
一、Docker下载与安装
Docker 运行在 CentOS 7 以上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),安装CE版本就可以。
(较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,需要卸载它们以及相关的依赖项。)
1、安装所需的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2 |
2、设置软件源仓库
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
更新 yum 缓存: yum makecache fast
3、 安装docker
yum -y install docker-ce |
4、查看版本
docker version |
5、启动docker
systemctl start docker |
二、创建镜像
拉取 MySQL 镜像
docker pull mysql |
格式:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
tag默认最新版本,也就是latest
创建mysql主从文件
1、创建 master(主) 和 slave(从) 两个文件夹
mkdir /usr/ mkdir /usr/ |
2、在 master 和 slave 文件夹下 创建 Dockerfile 内容为:
FROM mysql
COPY my.cnf /etc/mysql/
EXPOSE 3306
CMD ["mysqld"]
3、在 master 和slave文件夹下 创建 my.cnf
master/my.cnf 内容:
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=1 //[必须]服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配
slave/my.cnf 内容:
[mysqld]
log-bin = mysql-bin
server-id = 2
log-slave-updates = 1
read-only = 1
4、在 master 和slave文件夹下 创建data 目录用来保存数据文件的目录
创建镜像
切换到 master 目录下构建 mysql-master 镜像
docker build -t master/mysql . |
(命令最后有个.,不要忘记,代表当前目录)
然后切换到 slave 目录下构建 mysql-slave 镜像
docker build -t slave/mysql . |
(命令最后有个.,不要忘记,代表当前目录)
-t指定镜像名字,命令最后的点(.)表示Dockerfile文件所在路径
看是否创建成功:docker images
三、创建及运行容器
安装完成后,我们可以使用以下命令来运行 mysql 容器:
1、创建mysql-master容器并运行:
docker run -p 5116:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/master/data:/var/lib/mysql-files -d master/mysql |
2、创建mysql-slave容器并运行
docker run -p 5117:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/slave/data:/var/lib/mysql-files -d slave/mysql |
3、查看运行的容器:docker ps
4、打开两个终端,分别进入mysql
(1)master 终端执行
docker exec -it mysql-master bash mysql -uroot -p |
输入密码 mysql 进入到 mysql 环境
(2)slave 终端执行
docker exec -it mysql-slave bash mysql -uroot -p |
四、进行权限设置
1、master下,创建用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; |
2、给用户赋予连接权限(REPLICATION CLIENT)和复制权限(REPLICATION SLAVE)
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'slave'@'%'; |
3、执行show master status;
File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
4、进入从库mysql下,执行
change master to master_host='XXX.XXX.XXX.XXX', master_user='slave', master_password='123456', master_port=5116, master_log_file='mysql-bin.000003', master_log_pos= 712; |
5、查看主从同步状态
正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。
6、开启主从复制过程,
start slave; |
然后再次查询主从同步状态show slave status \G;
五、测试主从连接
1、登录master终端
create database test;
show databases;
use test;
create table stu(id int(3), name char(10));
2、登录slave终端
show databases;
use test;
select * from stu;
六、排查错误,重建主从关系
实际上,进入mysql时,通过 show slave status \G; 查看Error状态已经报错:
Last_IO_Error: error connecting to master 'slave@119.3.25.253:5116' - retry-time: 60 retries: 6 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
原因:
MySQL8.0默认指定使用需要SSL的身份验证插件caching_sha2_password,而我们在创建同步复制账号时候没有指定REQUIRE SSL。为了降低这件事情的复杂性,我们选择了社区的解决方法,选择绕过SSL插件的验证,改为mysql_native_password验证来做同步复制。
查看加密方式:
use mysql;
select user,host,plugin,authentication_string from user \G;
解决办法:
1、取消主从关系
从库mysql下执行:
停止主从同步: stop slave;
去除关联ip: change master to master_host=' ';
查看状态信息:show slave status\G;
2、重建slave用户
drop user slave;
CREATE USER 'slave'@'%' IDENTIFIED WITH 'mysql_native_password' BY '123456';
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
3、重建主从关系
在Master进入mysql,执行show master status;
创建主从关系: change master to master_host='XXX.XXX.XXX.XXX', master_user='slave', master_password='123456', master_port=5116, master_log_file='mysql-bin.000004', master_log_pos= 1390;
查询主从同步状态 show slave status \G;
开启主从复制过程 start slave