基于 Docker 的 MySQL 主从复制搭建(Mac M1版本)

系统:Macbook M1

镜像版本:mysql:5.7

如果是要查 slave 连接不上 master 的问题,可以直接跳到文章末尾踩坑处

准备工作

  1. 拉取镜像
bash 复制代码
docker pull mysql:5.7
  1. 本地数据卷挂载

因为mysql不挂载的话,重启丢失数据,所以在本地创建三个空的文件夹conf、data、log即可

部署mysql_master(主)

  1. 运行master容器

不加 --platform linux/amd64 会导致出现 The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested 的提示, 容器虽然可以通过Docker Desktop手动启动,但是总觉得这样不对,然后谷歌问题之后看到这个篇文章:https://stackoverflow.com/questions/72152446/warning-the-requested-images-platform-linux-amd64-does-not-match-the-detecte后说加了这个就可以不报错

bash 复制代码
docker run --platform linux/amd64 -p 3309:3306 --name mysql_master \

-v /Users/miaomk/docker/volume/mysql/cluster/_master/log:/var/log/mysql \

-v //Users/miaomk/docker/volume/mysql/cluster/_master/data:/var/lib/mysql \

-v /Users/miaomk/docker/volume/mysql/cluster/_master/conf:/etc/mysql \

-e MYSQL_ROOT_PASSWORD=master123 \

-d mysql:5.7
  1. 查看容器是否启动成功
bash 复制代码
docker ps
  1. 测试数据库连接
  1. 配置mysql_master挂载位置的my.cnf
bash 复制代码
[mysqld]
#要唯一
server_id=100
#开启bin log
log-bin=master-mysql.bin
binlog_format=mixed
expire_logs_days=7
#跳过主健重复
slave_skip_errors=1062
  1. 重启mysql_master容器
bash 复制代码
docker restart mysql_master

docker ps

6.进行mysql_master容器创建slave用户并赋予对应的权限便于复制

bash 复制代码
#进入容器
docker exec -it mysql_master /bin/bash
#进入mysql
mysql -u root -p
# 5.7 可以创建用户和授权都一起处理,但是8.0以上得分开写
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'Slave1'@'%' identified by  'Slave123456';
  1. 测试Slave1用户是否可以使用
bash 复制代码
SELECT
	  USER,
	  HOST,
	  account_locked,
	  password_expired 
FROM
	  mysql.USER;

部署mysql_salve(从)

  1. 运行slave容器并查看状态
bash 复制代码
docker run --platform linux/amd64 -p 3310:3306 --name mysql_slave \

-v /Users/miaomk/docker/volume/mysql/cluster/_slave/log:/var/log/mysql \

-v //Users/miaomk/docker/volume/mysql/cluster/_slave/data:/var/lib/mysql \

-v /Users/miaomk/docker/volume/mysql/cluster/_slave/conf:/etc/mysql \

-e MYSQL_ROOT_PASSWORD=root \

-d mysql:5.7
  1. 配置mysql_salve挂载位置的my.cnf
bash 复制代码
[mysqld]

server_id=102

log-bin=master-mysql-slave.bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
#跳过主健重复
slave_skip_errors=1062
relay_log=master-mysql-relay-bin
#将复制事件写进自己的二进制日志
log_slave_updates=1
#replica 设置为只读(具有super权限的用户除外)
read_only=1
  1. 重启mysql_slave容器并进入mysql_master容器内部查看对应内容
bash 复制代码
docker restart mysql_slave

docker ps

#进入mysql_master容器内查询master内容
docker exec -it mysql_master /bin/bash

mysql -uroot -p

show master status;
FilePosition 都是我们后面要在mysql_slave容器中需要用到的
  1. 查询本机的ip

    ifconfig

  1. 进入mysql_slave容器内开启slave
bash 复制代码
docker exec -it mysql_slave /bin/bash

mysql -uroot -p

#设置master信息
CHANGE MASTER TO 
    master_host = '192.168.124.3',
    master_user = 'Slave1',
    master_password = 'Slave123456',
    master_port = 3309,
    master_log_file = 'mysql-master.000001',
    master_log_pos = 618,
    master_connect_retry = 30;

#查询slave状态
show slave status \G

#开启slave
start slave;

#开启slave后查看状态
show slave status \G

命令说明:

master_host :Master 的地址,看别人的文章里这里说的都是指的容器的独立 ip, 可以通过 docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称 | 容器 id 查询容器的 ip,但是我自己实验下来发现如果用这个host的话mysql_slave里的slave连不上master,看到一篇文章发现用的本机IP,实验后发现对我可行,大家可以参考一下

master_port:Master 的端口号,指的是容器的端口号

master_user:用于数据同步的用户

master_password:用于同步的用户的密码

master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值

master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是 60 秒

这样就代表上述的slave能连上master了

测试:在主库mysql_master中建库建表,插入数据,再去从库中查看,验证主从同步

最后:slave无法连接上master的踩坑分享

1.

FilePosition 设置不对,需要重新去mysql_master里面 show master status; 查看

2. error connect to master

  1. 网络不通 检查 ip, 端口(可能跟我一样是需要本机的ip,而不是容器的ip或者127.0.0.1或者localhsot

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

文章参考:https://blog.csdn.net/csdnfanguyinheng/article/details/123239722

相关推荐
欧恩意3 小时前
【Tools】Java反汇编工具推荐
java·汇编
苍何3 小时前
字节发力,豆包大模型2.0 震撼来袭(附 Trae 实测)
后端
苍何3 小时前
不会剪辑的人,开始用 AI 批量出爆款了
后端
苍何3 小时前
百度 APP 正式接入 OpenClaw,所有人限时免费!
后端
寻星探路3 小时前
【JVM 终极通关指南】万字长文从底层到实战全维度深度拆解 Java 虚拟机
java·开发语言·jvm·人工智能·python·算法·ai
lbb 小魔仙3 小时前
【Java】Java 实战项目:手把手教你写一个电商订单系统
android·java·python
星河耀银海3 小时前
Java安全开发实战:从代码防护到架构安全
java·安全·架构
青云交3 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市水资源管理与节水策略制定中的应用
java·java 大数据·java 大数据可视化·城市水资源管理·spark 数据清洗·echarts 热力图·管网漏损控制
紫陌涵光4 小时前
112. 路径总和
java·前端·算法
workflower4 小时前
多变量时间序列预测
java·hadoop·nosql·需求分析·big data·结对编程