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中换源也很简单,在软件的设置里面完成即可,配置文件再见。
{
"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)
完美~~成功。