Docker搭建mysql主从

目录

 

1. 安装配置master

1.1. 运行mysql容器

1.2. 更新基础软件和安装vim

1.3. 编辑配置文件

1.4. 创建用户并授权,用于再主从库之间同步数据

2. slave数据库安装配置

2.1. 运行容器

2.2. 进入容器内部

2.2. 更新基础软件和安装vim

2.3. 编辑配置文件

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

2.5. 查看主从同步状态

2.6. 开启主从复制

2.7. 再次查询主从同步状态

3. 出现异常参考


1. 安装配置master

1.1. 运行mysql容器

docker run -itd --name mysqlMaster3307 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:latest

参数介绍:

  • --name mysqlMaster3307 表示容器的名称
  • -p 3307:3306 表示将宿主机的3307端口映射到docker的3306端口
  • -e MYSQL_ROOT_PASSWORD=root 表示设置用户root的密码为root
  • mysql:latest 表示使用的镜像版本

1.2. 更新基础软件和安装vim

apt-get update apt-get install vim -y

1.3. 编辑配置文件

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' 

退出保存

:wq
  • 配置default-time_zone = ‘+8:00’,不然当datetime类型的默认值为CURRENT_TIMESTAMP时,插入的时间会比系统时间少了8个小时

1.4. 创建用户并授权,用于再主从库之间同步数据

进入mysql内部

mysql -uroot -proot

创建同步用户

CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'slave';

授予权限

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

备注:

如果本地要用客户端比如Navicat连接,最好设置root的认证方式

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

否则可能报错

2059 - authentication plugin 'caching_sha2_password' cannot be loaded...

1.5. 查看关键信息

查看两个关键信息,File和Position字段的值,在后面的操作完成之前,需要保证master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。

show master status;

Docker搭建mysql主从_第1张图片

 

退出mysql

exit

退出容器

exit

重启容器

docker restart 5c2

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

2. slave数据库安装配置

2.1. 运行容器

docker run -itd --name slave0_3308 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root mysql:latest

2.2. 进入容器内部

docker exec -it 3bb /bin/bash

2.2. 更新基础软件和安装vim

apt-get update 
apt-get install vim -y

2.3. 编辑配置文件

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' 

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

进入mysql内部

mysql -uroot -proot

注:如果本地要用客户端比如navicat连接,最好设置root的认证方式

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

设置主从信息

change master to master_host='172.17.0.4', master_user='slave', master_password='slave', master_port=3306, master_log_file='mysql-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

ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

2.5. 查看主从同步状态

show slave status \G;

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

Docker搭建mysql主从_第2张图片

2.6. 开启主从复制

start slave;

2.7. 再次查询主从同步状态

show slave status \G;

Docker搭建mysql主从_第3张图片

 

然后退出重启容器。其他的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;

备注:

如果不重置修改后直接启动可能会报出下方异常

ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

 

3.3. Navicat 连接MySQL 8.0.11 出现2059错误

参考连接:https://www.cnblogs.com/lifan1998/p/9177731.html

Docker搭建mysql主从_第4张图片

原因:mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password

解决:更改加密规则

mysql -uroot -ppassword #登录

use mysql; #选择数据库
# 远程连接请将'localhost'换成'%'
#更改加密方式
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; 
#更新用户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; 
#刷新权限
FLUSH PRIVILEGES; 

 

参考连接:https://blog.csdn.net/qq_32574435/article/details/105921029

 

 

 

 

 

 

 

 

问题交流群,不定期分享各种技术文档:

QQ群号:464512055

群二维码:

这是一个神器的二维码,扫描之后你会少掉一块钱。

你可能感兴趣的:(Docker)