MacOS如何使用Docker创建MySQL主从数据库

发布时间:2021-12-28 10:37:59 作者:小新
来源:亿速云 阅读:153
# 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

基础概念解析

MySQL主从复制原理

主从复制的工作流程: 1. 主库(Master)将数据变更记录到二进制日志(binlog) 2. 从库(Slave)的I/O线程请求主库的binlog 3. 主库的binlog dump线程发送日志内容 4. 从库将日志写入中继日志(relay log) 5. 从库的SQL线程重放中继日志中的事件

Docker网络配置

我们将使用Docker的bridge网络模式,确保容器间可以互相通信:

docker network create mysql-replication-net

主数据库配置

1. 启动MySQL主库容器

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简化复制

2. 配置主库复制账号

进入主库容器:

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 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

从数据库配置

1. 启动MySQL从库容器

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防止自动启动复制

2. 配置从库连接主库

进入从库容器:

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简化部署

创建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

测试主从复制

1. 在主库创建测试数据

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');

2. 在从库验证数据

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;

故障处理

常见问题及解决方案:

  1. 复制中断

    STOP SLAVE;
    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    START SLAVE;
    
  2. 数据不一致: 使用pt-table-checksumpt-table-sync工具

  3. 网络中断: 自动重试机制,检查master_retry_count参数

性能优化建议

  1. 主库配置

    sync_binlog=1
    innodb_flush_log_at_trx_commit=1
    
  2. 从库配置

    read_only=ON
    skip-slave-start=ON
    log_slave_updates=ON  # 如需级联复制
    
  3. 硬件建议

    • 主库使用SSD存储
    • 为Docker分配足够内存(建议4GB+)

常见问题解答

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

参考资源

”`

推荐阅读:
  1. macos docker 提示User Interaction is not allowed
  2. docker创建容器后如何使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

docker mysql macos

上一篇:C语言如何使用回溯法解八皇后问题

下一篇:Python如何构建自动在线刷视频

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》