Docker搭建mysql 主从复制

docker单间mysql集群

  • 拉取镜像
docker pull mysql:5.6.43

  • 创建主从容器
# 主
docker run -itd --name mysql_master --restart=always \
-p 28002:3306 \
-e mysqld \
-e MYSQL_ROOT_PASSWORD=cloud \
-e MYSQL_USER=cloud \
-e MYSQL_PASSWORD=cloud \
-v /opt/mysql_master/data:/var/lib/mysql \
-d mysql:5.6.43

# 从
docker run -itd --name mysql_slave --restart=always \
-p 28003:3306 \
-e mysqld \
-e MYSQL_ROOT_PASSWORD=cloud \
-e MYSQL_USER=slave \
-e MYSQL_PASSWORD=slave \
-v /opt/mysql_slave/data:/var/lib/mysql \
-d mysql:5.6.43
# /opt/mysql_master/data 在当前服务器上传创建文件夹
# /opt/mysql_slave/data 在当前服务器上传创建文件夹
  • master 配置

# 进入 master终端
docker exec -it mysql_master /bin/bash

# 进入etc/mysql/文件目录下
cd etc/mysql/

# 更新命令
apt-get update
apt-get install vim

# vim 修改 my.cnf
vim my.cnf

# 修改内容 ## 同一局域网内注意要唯一 ## 开启二进制日志功能,可以随便取(关键)
[mysqld]
server_id=100  
log-bin=mysql-bin



# 重启mysql服务
service mysql restart

# 重启容器
docker restart mysql_master
# 进入容器
docker exec -it mysql_master /bin/bash

# 连接mysql
mysql -u root -p
cloud

# 创建用户
# 如果出现ERROR 1396 (HY000): Operation CREATE USER failed for 'slave'@'%'
drop user 'slave'@'%';
flush privileges;

#否则就直接执行
CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';

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

  • slave终端
# 进入 slave终端
docker exec -it mysql_slave /bin/bash
# 进入etc/mysql/文件目录下
cd etc/mysql/

# vim 修改 my.cnf
apt-get update
apt-get install vim


vim my.cnf

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

# 重启mysql服务
service mysql restart

# 重启容器
docker restart mysql_slave
# 进入容器
docker exec -it mysql_slave /bin/bash

# 连接mysql
mysql -u root -p
cloud

  • 链接Master(主)和Slave(从)
show master status;

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

  • 在slave执行

# 查看容器的固定ip
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql_master
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql_slave

# master_port:Master的端口号,指的是容器的端口号 用的外网IP
# master_user:用于数据同步的用户
# master_password:用于同步的用户的密码
# master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
# master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
# master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

change master to master_host='47.104.152.19', master_user='slave', master_password='slave', master_port=28002, master_log_file='mysql-bin.000002', master_log_pos= 512, master_connect_retry=30;

# 在Slave 中的mysql终端执行show slave status \G;用于查看主从同步状态
show slave status \G;

# 开启主从复制
start slave;
# 如果出现ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
reset slave;

  • 使用navicat连接数据库 账号密码
# master
root: slave
password: slave

# slave

root:root
password: cloud

  • 问题
使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

网络不通

检查ip,端口

密码不对

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

pos不对

检查Master的 Position

你可能感兴趣的:(docker,docker搭建集群,Docker入门及精通)