前言

由于最近项目中开始要用到mysql主备模式,所以赶紧去mysql官网学习下,尝试用docker搭建一个mysql主备(一主一从),启动两台容器来模拟两台服务器,原理和在两台服务器上搭建主备是一样的,需要注意的是,不管是两个容器还是两台linux服务器之间必须要能够相互通信的,否则搭建主备无法完成

1. 拉取mysql8.0.25镜像

下面使用的是mysql8.0.25版本镜像(docker官网的镜像,应该是比较新的)

docker pull mysql:8.0.25

在这里插入图片描述

2. 启动mysql容器

启动两台容器,一主一从,docker ps检查两台容器的运行状态,如下所示表示启动运行正常

--ip是用来指定容器启动过程中的ip地址,如果不指定,每次启动容器ip地址不固定,这样就会导致第一次搭建好的mysql主从复制在容器重启后无法组成主从复制了,因为主机容器的ip变了,从机容器无法连接到主机容器,所以这里才需要指定,一旦指定ip后,不管什么时候重启容器,容器的ip地址不会再发生变化
docker run -d --name  mainer  -p 8008:3306 -e MYSQL_ROOT_PASSWORD=root  --ip 10.88.0.13 mysql:8.0.25
docker run -d --name  follower  -p 8009:3306 -e MYSQL_ROOT_PASSWORD=root  --ip 10.88.0.14  mysql:8.0.25

在这里插入图片描述

3. 修改配置文件

(1)编辑主容器my.cnf

将容器中的mysql配置文件my.cnf复制到宿主机
docker cp 8b7d5c7a7903:/etc/mysql/my.cnf ./
===========================================
vim my.cnf
[mysqld]加上下面两行
log-bin=mysql-bin
server-id=1
===========================================
将编辑好的my.cnf配置文件放回容器中
docker cp ./my.cnf 8b7d5c7a7903:/etc/mysql
重启mysql主容器
docker restart 8b7d5c7a7903

在这里插入图片描述
(2)查看主容器my.cnf文件

docker exec -it mainer /bin/bash
cat /etc/mysql/my.cnf

(3)编辑从容器my.cnf

将容器中的mysql配置文件my.cnf复制到宿主机
docker cp a7edc962301f:/etc/mysql/my.cnf ./
===========================================
vim my.cnf
[mysqld]加上下面两行
log-bin=mysql-bin
server-id=2
===========================================
将编辑好的my.cnf配置文件放回容器中
docker cp ./my.cnf a7edc962301f:/etc/mysql
重启mysql从容器
docker restart a7edc962301f

在这里插入图片描述
(4)查看从容器my.cnf文件

docker exec -it follower /bin/bash
cat /etc/mysql/my.cnf

4. 进入主容器mysql

docker exec -it mainer /bin/bash
mysql -u root -p
进入mysql,执行以下命令:
CREATE USER 'jamy'@'%' IDENTIFIED WITH mysql_native_password BY 'jamy';
GRANT REPLICATION SLAVE ON *.* TO 'jamy'@'%';

5. 进入从容器mysql

查看主容器Ip
docker inspect 8b7d5c7a7903
得到主容器IP:10.88.0.13
=============================================
docker exec -it a7edc962301f /bin/bash
mysql -u root -p
进入mysql执行以下命令:
CHANGE MASTER TO 
MASTER_HOST='10.88.0.13',
MASTER_PORT=3306,
MASTER_USER='jamy',
MASTER_PASSWORD='jamy',
master_log_file='mysql-bin.000001',
master_log_pos=542;

Or from MySQL 8.0.23: //mysql8.0.23以后用下面这个命令
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='10.88.0.13',
SOURCE_PORT=3306,
SOURCE_USER='jamy',
SOURCE_PASSWORD='jamy';

============================================
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
Or from MySQL 8.0.22:     //mysql8.0.22以后用下面的
mysql> START REPLICA;
mysql> SHOW REPLICA STATUS\G          //查看主从状态

如下图所示这样说明mysql主从复制搭建成功!如果此处出现下面这样,请参考文章末尾的注意事项中的解决方法

Slave_IO_Running: connecting
Slave_SQL_Running: Yes

在这里插入图片描述

6. 测试主从复制效果

进入主机mysql创建数据库

create database test default charset utf8mb4;
show databases;

在这里插入图片描述
进入从机mysql查看数据库
show databases;
在这里插入图片描述
到此mysql主从复制搭建成功!

注意事项:

1、首先执行下面命令查询下身份验证插件到底是哪一个?

use mysql;
select user,host,plugin from user;

2、如果复制用户的身份验证插件是:caching_sha2_password,则需要指定GET_MASTER_PUBLIC_KEY=1;

CHANGE MASTER TO 
MASTER_HOST='10.88.0.15',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='root',
master_log_file='mysql-bin.000001',
master_log_pos=552,
master_connect_retry=60, 
GET_MASTER_PUBLIC_KEY=1;

3、如果复制用户的身份验证插件是:mysql_native_password,则不需要指定GET_MASTER_PUBLIC_KEY=1;

CHANGE MASTER TO 
MASTER_HOST='10.88.0.15',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='root',
master_log_file='mysql-bin.000001',
master_log_pos=552;
Logo

更多推荐