配置文件📝
主库配置 (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
步骤
-
启动并配置主库:
-
启动主库:
docker-compose up -d mysql-master
-
检查主库的状态:
- 在主库容器中,运行以下命令以确保主库正在生成二进制日志:
docker exec -it mysql-master mysql -uroot -preplication_password -e "SHOW MASTER STATUS\G"
- 记下输出中的
File
和Position
值。
- 在主库容器中,运行以下命令以确保主库正在生成二进制日志:
-
在主库上创建从库用户:
- 在主库容器中,运行以下命令创建用户并赋予权限:
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;"
- 在主库容器中,运行以下命令创建用户并赋予权限:
-
-
配置并启动从库:
-
更新从库的初始化脚本:
- 根据主库的
File
和Position
值,更新init-slave.sh
脚本中的MASTER_LOG_FILE
和MASTER_LOG_POS
。
- 根据主库的
-
启动从库:
docker-compose up -d mysql-slave
-
验证从库的状态:
- 在从库容器中,运行以下命令以检查从库的状态:
docker exec -it mysql-slave mysql -uroot -p replication_password -e "SHOW SLAVE STATUS\G"
- 确认
Slave_IO_Running
和Slave_SQL_Running
都显示为Yes
。
- 在从库容器中,运行以下命令以检查从库的状态:
-
验证🔍
-
检查主库的状态:
- 在主库容器中,运行以下命令以确保主库正在生成二进制日志:
docker exec -it mysql-master mysql -uroot -p replication_password -e "SHOW MASTER STATUS\G"
- 记下输出中的
File
和Position
值。
- 在主库容器中,运行以下命令以确保主库正在生成二进制日志:
-
验证从库的状态:
- 在从库容器中,运行以下命令以检查从库的状态:
docker exec -it mysql-slave mysql -uroot -p replication_password -e "SHOW SLAVE STATUS\G"
- 确认
Slave_IO_Running
和Slave_SQL_Running
都显示为Yes
。
- 在从库容器中,运行以下命令以检查从库的状态:
以上配置和步骤应能够在 Docker 容器中设置 MySQL 主从复制。请根据具体环境替换必要参数,并按步骤进行验证,以确保主从复制配置成功。