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


    系统:Macbook M1

    镜像版本:mysql:5.7

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

    准备工作

    1. 拉取镜像
    docker pull mysql:5.7
    
    • 1
    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后说加了这个就可以不报错

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 查看容器是否启动成功
    docker ps
    
    • 1

    在这里插入图片描述

    1. 测试数据库连接

    在这里插入图片描述

    1. 配置mysql_master挂载位置的my.cnf
    [mysqld]
    #要唯一
    server_id=100
    #开启bin log
    log-bin=master-mysql.bin
    binlog_format=mixed
    expire_logs_days=7
    #跳过主健重复
    slave_skip_errors=1062
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 重启mysql_master容器
    docker restart mysql_master
    
    docker ps
    
    • 1
    • 2
    • 3

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

    #进入容器
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 测试Slave1用户是否可以使用
    SELECT
    	  USER,
    	  HOST,
    	  account_locked,
    	  password_expired 
    FROM
    	  mysql.USER;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    在这里插入图片描述

    部署mysql_salve(从)

    1. 运行slave容器并查看状态
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    在这里插入图片描述

    1. 配置mysql_salve挂载位置的my.cnf
    [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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 重启mysql_slave容器并进入mysql_master容器内部查看对应内容
    
    docker restart mysql_slave
    
    docker ps
    
    #进入mysql_master容器内查询master内容
    docker exec -it mysql_master /bin/bash
    
    mysql -uroot -p
    
    show master status;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

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

    在这里插入图片描述

    1. 进入mysql_slave容器内开启slave
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    命令说明:

    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

  • 相关阅读:
    Git提交代码仓库的两种方式
    前端高频vue面试题合集
    java-php-net-python-代驾网站计算机毕业设计程序
    文件上传下载
    【大揭秘】美团面试题:ConcurrentHashMap和Hashtable有什么区别?一文解析!
    基于Android的个人电子相册设计与实现
    民安智库(第三方满意度调研公司)写字楼客户满意度调查
    自来水管网无线监控系统解决方案
    使用python调用ssh操作linux远程服务器办法
    科技赋能司法:易保全如何重塑法律文书签署与庭审流程
  • 原文地址:https://blog.csdn.net/weixin_43864927/article/details/132581566