M1的Mac在本机中使用docker 环境下启动2个mysql实例,并完成主从复制

94 阅读5分钟

M1的Mac在本机中使用docker 环境下启动2个mysql实例,并完成主从复制

1: 写在前面

之前在学习Java的时候,为了完成主从复制,当时安装了2个虚拟机,并在2个虚拟机上同时安装相同版本的mysql。然后用ssl进行连接完成主从。感觉比较吃空间和内存。后来接触到了docker,就想着是否可以利用docker来启动2个mysql实例,并完成实现主从。由于本人使用的M1芯片的Mac,不是X86的系统,网络上很多攻略根本无法使用,只能自己不断摸索。

下面是具体操作流程。

2. 环境准备

docker使用的是OrbStack进行管理。(神器,比docker desktop好用太多,而且针对个人用户永久免费 下载地址 )安装之后记得启动docker。

docker version  
Client:
 Version:      28.2.2
 API version:    1.50
 Go version:    go1.24.3
 Git commit:    e6534b4
 Built:       Fri May 30 12:07:35 2025
 OS/Arch:      darwin/arm64
 Context:      orbstack

由于docker服务器的问题,需要对于docker 进行换源,在OrbStack中换源也很简单,在软件的设置里面完成即可,配置文件再见。

截屏2025-06-19 19.57.39.png

{
  "registry-mirrors" : [
    "https://docker.m.daocloud.io",
    "https://docker.imgdb.de",
    "https://docker-0.unsee.tech",
    "https://docker.hlmirror.com",
    "https://docker.1ms.run",
    "https://func.ink",
    "https://lispy.org",
    "https://docker.xiaogenban1993.com"
  ]
}

添加后可以重启一下,然后就可以进行获取docker的镜像了。如果实在不行,那就只能科学上网了。

docker pull mysql:8.0

有人问为什么要8.0,其他版本可以吗?

建议不要,本人试过mysql:8.4.5、mysql:latest、mysql:9 均以失败告终,而且网上的解决方案不能用。

不知道为啥,有大佬知道的话请赐教。

下载好了之后,现在可以准备进行主从复制啦!!

3. 操作流程

1. 创建 Docker 网络

首先创建一个专用的 Docker 网络以便容器间通信:

docker network create mysql-replication-net
2. 启动主数据库 (Master)
docker run -d --name mysql-master \
  --network mysql-replication-net \
  -e MYSQL_ROOT_PASSWORD=rootpassword \
  -e TZ=Asia/Shanghai \
  -v mysql-master-data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0 \
  --server-id=1 \
  --log-bin=mysql-bin \
  --binlog-format=ROW \
  --binlog-ignore-db=mysql \
  --binlog-ignore-db=sys \
  --binlog-ignore-db=information_schema \
  --binlog-ignore-db=performance_schema \
  --gtid-mode=ON \
  --enforce-gtid-consistency=ON
3. 配置主数据库

进入主数据库容器:

docker exec -it mysql-master mysql -uroot -prootpassword

创建复制链接用户

#查看用户是否存在
SELECT User, Host FROM mysql.user WHERE User = 'connect_user';
​
#如果存在可以删除用户,并重新创建
DROP USER 'connect_user'@'%';
FLUSH PRIVILEGES;
​
#重新创建复制用户
CREATE USER 'connect_user'@'%' IDENTIFIED BY 'replpassword';
​
#给复制用户赋予 链接权限
GRANT REPLICATION SLAVE ON *.* TO 'connect_user'@'%';
FLUSH PRIVILEGES;
4. 启动从数据库 (Slave)

创建从数据库容器:

docker run -d --name mysql-slave \
  --network mysql-replication-net \
  -e MYSQL_ROOT_PASSWORD=rootpassword \
  -e TZ=Asia/Shanghai \
  -v mysql-slave-data:/var/lib/mysql \
  -p 3307:3306 \
  mysql:8.0 \
  --server-id=2 \
  --log-bin=mysql-bin \
  --binlog-format=ROW \
  --gtid-mode=ON \
  --enforce-gtid-consistency=ON \
  --skip-slave-start
5. 配置从数据库

进入从数据库容器:

docker exec -it mysql-slave mysql -uroot -prootpassword

在 MySQL 中执行以下命令:

#配置复制
CHANGE REPLICATION SOURCE TO
    SOURCE_HOST='mysql-master',
    SOURCE_USER='connect_user',
    SOURCE_PASSWORD='replpassword',
    SOURCE_AUTO_POSITION=1;
    
#启动复制
START REPLICA;

#查看复制状态
SHOW REPLICA STATUS\G
               Slave_IO_State: Waiting for source to send event
                  Master_Host: mysql-master
                  Master_User: connect_user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 2033
               Relay_Log_File: e7100a170e49-relay-bin.000002
                Relay_Log_Pos: 2249
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

检查 Slave_IO_Running 和 Slave_SQL_Running 是否都为 Yes,表示复制已正常工作。

6. 检查验证

切到mysql-master里面去,添加一些数据

#删除库(谨慎)
DROP DATABASE IF EXISTS school_db;

#重新创建一个新库
CREATE DATABASE school_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE school_db;

#创建一个学生表
CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender ENUM('male', 'female') NOT NULL,
    age INT,
    class VARCHAR(20),
    score DECIMAL(5,2),
    enrollment_date DATE
);

#往学生表里面随意添加一些数据
INSERT INTO students (name, gender, age, class, score, enrollment_date) VALUES
('张三', 'male', 18, '高三(1)班', 85.5, '2022-09-01'),
('李四', 'male', 17, '高二(3)班', 92.0, '2023-09-01'),
('王五', 'female', 19, '高三(2)班', 78.5, '2022-09-01'),
('赵六', 'female', 16, '高一(4)班', 88.0, '2024-09-01'),
('钱七', 'male', 18, '高三(1)班', 95.5, '2022-09-01'),
('孙八', 'female', 17, '高二(2)班', 81.0, '2023-09-01'),
('周九', 'male', 16, '高一(1)班', 76.5, '2024-09-01'),
('吴十', 'female', 18, '高三(3)班', 89.0, '2022-09-01'),
('郑十一', 'male', 17, '高二(4)班', 93.5, '2023-09-01'),
('王十二', 'female', 16, '高一(2)班', 82.0, '2024-09-01');

切到mysql-slave里面去,执行查询数据

SELECT * FROM students;

#出现下面结果
+----+------+--------+------+-------+-------+-----------------+
| id | name | gender | age  | class | score | enrollment_date |
+----+------+--------+------+-------+-------+-----------------+
|  1 |      | male   |   18 | (1)   | 85.50 | 2022-09-01      |
|  2 |      | male   |   17 | (3)   | 92.00 | 2023-09-01      |
|  3 |      | female |   19 | (2)   | 78.50 | 2022-09-01      |
|  4 |      | female |   16 | (4)   | 88.00 | 2024-09-01      |
|  5 |      | male   |   18 | (1)   | 95.50 | 2022-09-01      |
|  6 |      | female |   17 | (2)   | 81.00 | 2023-09-01      |
|  7 |      | male   |   16 | (1)   | 76.50 | 2024-09-01      |
|  8 |      | female |   18 | (3)   | 89.00 | 2022-09-01      |
|  9 |      | male   |   17 | (4)   | 93.50 | 2023-09-01      |
| 10 |      | female |   16 | (2)   | 82.00 | 2024-09-01      |
+----+------+--------+------+-------+-------+-----------------+
10 rows in set (0.00 sec)

完美~~成功。