基于Docker的MySQL主从复制环境搭建

本机版本信息:

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 版本之后分为 CECommunity 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/mysql/master

mkdir /usr/mysql/slave

 

 

 

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 statusG;

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

原文地址:https://www.cnblogs.com/chen117/p/12990310.html