配置文件📝

主库配置 (master-my.cnf)

[mysqld]
server-id=1
log-bin=mysql-bin

从库配置 (slave-my.cnf)

[mysqld]
server-id=2

Docker Compose 配置🚀

docker-compose.yml

version: '3.1'

services:
  mysql-master:
    image: mysql:8.0
    container_name: mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: replication_password
      MYSQL_DATABASE: replication_db
    volumes:
      - ./master-my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - "3307:3306"
    networks:
      - mysql-net

  mysql-slave:
    build: .
    container_name: mysql-slave
    environment:
      MYSQL_ROOT_PASSWORD: replication_password
      MYSQL_DATABASE: replication_db
    volumes:
      - ./slave-my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - "3308:3306"
    networks:
      - mysql-net

networks:
  mysql-net:

从库的 Dockerfile📦

Dockerfile

FROM mysql:8.0

# 设置环境变量
ENV MYSQL_ROOT_PASSWORD=replication_password
ENV MYSQL_DATABASE=replication_db
ENV MASTER_HOST=主库的实际IP地址
ENV MASTER_LOG_FILE=主库的二进制日志文件名
ENV MASTER_LOG_POS=主库的二进制日志位置

# 拷贝初始化脚本到镜像中
COPY init-slave.sh /docker-entrypoint-initdb.d/init-slave.sh

# 确保脚本是可执行的
RUN chmod +x /docker-entrypoint-initdb.d/init-slave.sh

EXPOSE 3306

从库初始化脚本💡

init-slave.sh

#!/bin/bash
set -e

# 等待 MySQL 启动完成
until mysql -hlocalhost -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "status"; do
  >&2 echo "MySQL is不可用 - sleeping 😴"
  sleep 1
done

# 配置从服务器
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" <<-EOSQL
  CHANGE MASTER TO MASTER_HOST='${MASTER_HOST}', MASTER_USER='slave', MASTER_PASSWORD='replication_password', MASTER_LOG_FILE='${MASTER_LOG_FILE}', MASTER_LOG_POS=${MASTER_LOG_POS};
  START SLAVE;
EOSQL

步骤

  1. 启动并配置主库

    1. 启动主库

      docker-compose up -d mysql-master
      
    2. 检查主库的状态

      • 在主库容器中,运行以下命令以确保主库正在生成二进制日志:
        docker exec -it mysql-master mysql -uroot -preplication_password -e "SHOW MASTER STATUS\G"
        
      • 记下输出中的 FilePosition 值。
    3. 在主库上创建从库用户

      • 在主库容器中,运行以下命令创建用户并赋予权限:
        docker exec -it mysql-master mysql -uroot -p replication_password -e "CREATE USER 'slave'@'%' IDENTIFIED BY 'replication_password'; GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%'; FLUSH PRIVILEGES;"
        
  2. 配置并启动从库

    1. 更新从库的初始化脚本

      • 根据主库的 FilePosition 值,更新 init-slave.sh 脚本中的 MASTER_LOG_FILEMASTER_LOG_POS
    2. 启动从库

      docker-compose up -d mysql-slave
      
    3. 验证从库的状态

      • 在从库容器中,运行以下命令以检查从库的状态:
        docker exec -it mysql-slave mysql -uroot -p replication_password -e "SHOW SLAVE STATUS\G"
        
      • 确认 Slave_IO_RunningSlave_SQL_Running 都显示为 Yes

验证🔍

  1. 检查主库的状态

    • 在主库容器中,运行以下命令以确保主库正在生成二进制日志:
      docker exec -it mysql-master mysql -uroot -p replication_password -e "SHOW MASTER STATUS\G"
      
    • 记下输出中的 FilePosition 值。
  2. 验证从库的状态

    • 在从库容器中,运行以下命令以检查从库的状态:
      docker exec -it mysql-slave mysql -uroot -p replication_password -e "SHOW SLAVE STATUS\G"
      
    • 确认 Slave_IO_RunningSlave_SQL_Running 都显示为 Yes

以上配置和步骤应能够在 Docker 容器中设置 MySQL 主从复制。请根据具体环境替换必要参数,并按步骤进行验证,以确保主从复制配置成功。