docker搭建mysql8.0主备(主从复制)
目录前言1. 拉取mysql8.0.25镜像前言由于最近项目中开始要用到mysql主备模式,所以赶紧去mysql官网学习下,尝试用docker搭建一个mysql主备(一主一从),启动两台容器来模拟两台服务器,原理和在两台服务器上搭建主备是一样的,需要注意的是,不管是两个容器还是两台linux服务器之间必须要能够相互通信的,否则搭建主备无法完成1. 拉取mysql8.0.25镜像下面使用的是mysq
前言
由于最近项目中开始要用到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;
更多推荐
所有评论(0)