基于 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

相关推荐
吴声子夜歌2 小时前
ApacheCommons——commons-pool2(高性能通用对象池框架)
java·开发语言·apache
mldong6 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
Y3815326627 小时前
MySQL 慢查询排查实战:EXPLAIN 看懂 type 与 Extra,一个字段定位性能问题
数据库·mysql
xcl09257 小时前
幼儿托育系统开发实战:从需求分析到上线全流程指南
java·大数据·需求分析
吴声子夜歌7 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
小小猪的春天8 小时前
Java 手写第一个 MCP Server:Spring AI MCP 半小时跑通
java·人工智能·spring boot·ai编程
find1star8 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
爱学堂IT分享8 小时前
鹤翔老师pmp项目管理培训认证考试课 (直播录播题库送学时证明)【共58课时】-51CTO学堂
后端
今天AI了吗8 小时前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
王的宝库9 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang