您好,登录后才能下订单哦!
# MacOS如何使用Docker创建MySQL主从数据库
## 前言
在当今数据驱动的时代,数据库的高可用性和数据冗余变得尤为重要。MySQL作为最流行的开源关系型数据库之一,其主从复制(Master-Slave Replication)功能是实现数据备份、负载均衡和读写分离的关键技术。本文将详细介绍如何在MacOS系统上使用Docker容器技术快速搭建MySQL主从数据库环境。
## 环境准备
### 系统要求
- MacOS 10.15或更高版本
- 已安装Docker Desktop for Mac
- 建议内存4GB以上(Docker默认分配2GB)
- 终端工具(iTerm2或系统自带终端)
### Docker环境检查
在开始前,请确认Docker已正确安装:
```bash
docker --version
# 输出示例: Docker version 20.10.17, build 100c701
docker-compose --version
# 输出示例: docker-compose version 2.6.0
主从复制的工作流程: 1. 主库(Master)将数据变更记录到二进制日志(binlog) 2. 从库(Slave)的I/O线程请求主库的binlog 3. 主库的binlog dump线程发送日志内容 4. 从库将日志写入中继日志(relay log) 5. 从库的SQL线程重放中继日志中的事件
我们将使用Docker的bridge网络模式,确保容器间可以互相通信:
docker network create mysql-replication-net
docker run -d \
--name mysql-master \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=masterpass \
-v $(pwd)/master-data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0 \
--server-id=1 \
--log-bin=mysql-bin \
--binlog-format=ROW \
--gtid-mode=ON \
--enforce-gtid-consistency=ON
参数说明:
- --server-id
: 必须唯一,主库设为1
- --log-bin
: 启用二进制日志
- gtid-mode
: 使用全局事务ID简化复制
进入主库容器:
docker exec -it mysql-master mysql -uroot -pmasterpass
执行SQL命令:
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'replpass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
-- 查看主库状态,记录File和Position值
SHOW MASTER STATUS;
示例输出:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 835 | | | |
+------------------+----------+--------------+------------------+-------------------+
docker run -d \
--name mysql-slave \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=slavepass \
-v $(pwd)/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
注意:
- --server-id
必须与主库不同
- --skip-slave-start
防止自动启动复制
进入从库容器:
docker exec -it mysql-slave mysql -uroot -pslavepass
执行配置命令(使用之前记录的master信息):
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='replpass',
MASTER_AUTO_POSITION=1;
START SLAVE;
-- 查看从库状态
SHOW SLAVE STATUS\G
关键检查项:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Seconds_Behind_Master: 0
创建docker-compose.yml
文件:
version: '3.8'
services:
mysql-master:
image: mysql:8.0
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: masterpass
volumes:
- ./master-data:/var/lib/mysql
ports:
- "3306:3306"
command:
- --server-id=1
- --log-bin=mysql-bin
- --binlog-format=ROW
- --gtid-mode=ON
- --enforce-gtid-consistency=ON
networks:
- mysql-net
mysql-slave:
image: mysql:8.0
container_name: mysql-slave
environment:
MYSQL_ROOT_PASSWORD: slavepass
volumes:
- ./slave-data:/var/lib/mysql
ports:
- "3307:3306"
command:
- --server-id=2
- --log-bin=mysql-bin
- --binlog-format=ROW
- --gtid-mode=ON
- --enforce-gtid-consistency=ON
- --skip-slave-start
depends_on:
- mysql-master
networks:
- mysql-net
networks:
mysql-net:
driver: bridge
启动服务:
docker-compose up -d
docker exec -it mysql-master mysql -uroot -pmasterpass
CREATE DATABASE replication_test;
USE replication_test;
CREATE TABLE users (id INT AUTO_INCREMENT, name VARCHAR(255), PRIMARY KEY(id));
INSERT INTO users(name) VALUES ('Alice'), ('Bob');
docker exec -it mysql-slave mysql -uroot -pslavepass
SELECT * FROM replication_test.users;
应能看到与主库相同的数据。
提高数据一致性,确保至少一个从库接收到数据:
在主库配置:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 3000;
在从库配置:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
提高从库应用速度:
STOP SLAVE;
SET GLOBAL slave_parallel_workers = 4;
START SLAVE;
主库:
SHOW MASTER STATUS;
SHOW PROCESSLIST;
从库:
SHOW SLAVE STATUS\G
SHOW SLAVE HOSTS;
常见问题及解决方案:
复制中断:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
数据不一致:
使用pt-table-checksum
和pt-table-sync
工具
网络中断:
自动重试机制,检查master_retry_count
参数
主库配置:
sync_binlog=1
innodb_flush_log_at_trx_commit=1
从库配置:
read_only=ON
skip-slave-start=ON
log_slave_updates=ON # 如需级联复制
硬件建议:
Q1: 如何添加新的从库? A: 流程类似,确保: - 唯一server-id - 使用主库备份初始化数据 - 正确配置复制参数
Q2: 主从数据不一致怎么办?
A: 可以:
1. 使用pt-table-sync
修复
2. 重建从库(通过主库快照)
Q3: 如何升级MySQL版本? A: 建议流程: 1. 升级从库并验证 2. 切换从库为主库 3. 升级原主库
通过Docker在MacOS上搭建MySQL主从复制环境,我们实现了: - 快速部署和隔离的数据库环境 - 数据冗余和高可用性基础 - 方便的测试和开发环境
这种方案特别适合开发测试场景,如需生产环境使用,建议考虑: - 使用持久化存储卷 - 配置监控告警系统 - 实施定期备份策略
功能 | 命令 |
---|---|
查看容器状态 | docker ps -a |
查看主库binlog | SHOW BINARY LOGS; |
停止复制 | STOP SLAVE; |
重置从库 | RESET SLAVE ALL; |
导出主库数据 | mysqldump --all-databases --master-data > backup.sql |
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。