docker容器搭建mysql8.x版本主从复制

目录

 

docker搭建mysql主从复制

1.创建master数据库

1.1创建MySQL容器并映射端口和改密码

1.2进入创建好MySQL容器,修改配置文件

1.3登陆MySQL配置信息

2.创建slave数据库

2.1创建MySQL容器并映射端口和改密码

2.2进入容器内部

2.3 进入mysql内部,设置主从信息

2.4设置主从信息

3. 出现异常参考

测试


docker搭建mysql主从复制

1.创建master数据库

1.1创建MySQL容器并映射端口和改密码

 

docker run -di --name=mysql_master -p port:3306 -e MYSQL_ROOT_PASSWORD=password mysql

--name 代表容器名称可以用来启动停止重启容器

-p 代表端口映射,格式为 宿主机映射端口:容器运行端口 向外映射端口 通过linux访问

-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码

1.1.1参考过程:

 

1.2进入创建好MySQL容器,修改配置文件

1.2.1 安装vim

#同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引
apt-get update
#安装vim
apt-get install -y vim

 

1.2.2 修改my.cnf文件

#进入刚才创建的容器 mysql_master  是你之前设置的 --name
docker exec -it mysql_master /bin/bash
vim /etc/mysql/my.cnf

新增信息

[mysqld]
## 设置server_id,注意要唯一
server-id=101  
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## 永久设置时区时间
default-time_zone = '+8:00' 

 

1.3登陆MySQL配置信息

mysql -u root -p 登录

MySQL8的默认的密码加密策略发生了变化,之前的一些客户端的软件会出现无法登录的 情况。

解决:

使用mysql原生的命令进去,使用之前的密码加密策略重新修改密码:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
#本地登录(如果用原生的命令行的话,不用改)
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '980224';
#远程登录
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '980224';
#创建同步用户
CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY '980224';
#授权
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'admin'@'%';
#然后修改root权限
use mysql;
#在 mysql 数据库的 user 表中查看当前 root 用户的相关信息
select host, user, authentication_string, plugin from user; 
#授权 root 用户的所有权限并设置远程访问
GRANT ALL ON *.* TO 'root'@'%';
#刷新权限列表
flush privileges;
#查看关键信File和Position字段的值,在后面的操作完成之前,
#需要保证master库不能做任何操作,否则将会引起状#态变化,
#File和Position字段的值变化。 如下图需要记下来在下面2.4步骤需要 下图中的mysql-slave-bin.000001 156
​
mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-slave-bin.000001
         Position: 156
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)
​

 

 

退出容器重启

#退出mysql
exit;
#退出容器
exit;
#再退出到宿主容器查看mysql的映射端口
firewall-cmd --zone=public --list-ports
#将mysql端口的防火墙打开  xxxxx  端口  
firewall-cmd --zone=public --add-port=3363/tcp --permanent
#重新载入
firewall-cmd --reload
docker restart mysql_master

 

至此,master数据库安装配置完成。

2.创建slave数据库

2.1创建MySQL容器并映射端口和改密码

 

docker run -di --name=mysql_slave -p 33307:3306 -e MYSQL_ROOT_PASSWORD=password mysql
#将mysql端口的防火墙打开  xxxxx  端口  
firewall-cmd --zone=public --add-port=33307/tcp --permanent
#重新载入
firewall-cmd --reload

2.2进入容器内部

docker exec -it mysql_slave /bin/bash
apt-get update 
apt-get install vim -y
vim /etc/mysql/my.cnf

 

2.3 进入mysql内部,设置主从信息

mysql -uroot -p980224
#本地要用客户端比如navicat连接,设置root的认证方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
#然后修改root权限
use mysql;
#在 mysql 数据库的 user 表中查看当前 root 用户的相关信息
select host, user, authentication_string, plugin from user; 
#授权 root 用户的所有权限并设置远程访问
GRANT ALL ON *.* TO 'root'@'%';
#刷新权限列表
flush privileges;

2.4设置主从信息

change master to master_host='ip', master_user='admin', master_password='--', master_port=port, master_log_file='mysql-slave-bin.000001', master_log_pos= 156, master_connect_retry=30,get_master_public_key=1;

参数介绍

master_host:Master的地址,指的是容器的独立IP,可以通过下面命令查询
[root@localhost ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' 5c2 172.17.0.4
master_port: Master的端口,指的是容器的端口号,不是映射端口
master_user:用于数据同步的用户
master_password:用户同步的用户的密码
master_log_file:指定Slave从哪个日志文件开始复制数据,即上文中提到的File字段的值
master_log_pos:指从哪个Position开始读,即上文中提到的Position字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
备注:之所以设置get_master_public_key=1,是因为开启主从复制的时候可能会报出下方的异常。原因是mysql8默认使用插件caching_sha2_password,有些client连接报这个错误,需要拿到server的public key来加密password

2.5 查看主从同步状态

show slave status \G;

正常情况下,Slave_IO_Running 和 Slave_SQL_Running 都是No,因为我们还没有开启主从复制的过程

 

2.6开启主从复制

 

start slave;

再次查询主从同步状态

show slave status \G;

 

然后退出重启容器。其他的slave的安装配置方法和slave的方法一样,区别就是cnf文件中的server-id不能相同罢了

3. 出现异常参考

3.1. 使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于拦截状态,这种情况一般是下面集中原因造成的,可以根据Last_IO_Error提示予以排除。

  • 网络不通

解决办法:检查IP,端口

  • 密码不对

检查是否创建用于同步的用户和用户密码是否正确

  • pos不对

检查master的position

3.2. 如果开启主从复制失败,需要修改和重启,可参考下方提示

停止主从复制

stop slave;

重置之前的配置信息

reset slave;

启动主从复制

start slave;

测试

测试在主数据库创建一个数据库,从数据库有的话代表成功

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值