基于Docker搭建mysql主从复制(一主一从)
使用Docker搭建MySQL主从
使用Dockerfile创建镜像
Dockerfile-master
# 使用官方 MySQL 镜像作为基础镜像
FROM mysql:latest
# 设置环境变量
ENV MYSQL_ROOT_PASSWORD=root
# 将本地文件挂载到容器内
VOLUME D:/path/database_master/log:/var/log/mysql
VOLUME D:/path/database_master/data:/var/lib/mysql
VOLUME D:/path/database_master/conf:/etc/mysql/conf.d
# 指定容器内部的工作目录
WORKDIR /var/lib/mysql
# 暴露 MySQL 服务端口
EXPOSE 3306
Dockerfile-slave
# 使用官方 MySQL 镜像作为基础镜像
FROM mysql:latest
# 设置环境变量
ENV MYSQL_ROOT_PASSWORD=root
# 将本地文件挂载到容器内
VOLUME D:/path/database_slave/log:/var/log/mysql
VOLUME D:/path/database_slave/data:/var/lib/mysql
VOLUME D:/path/database_slave/conf:/etc/mysql/conf.d
# 指定容器内部的工作目录
WORKDIR /var/lib/mysql
# 暴露 MySQL 服务端口
EXPOSE 3307
进入Dockerfile所在目录运行命令:
docker build -t mysql_master_image -f Dockerfile-master .
docker build -t mysql_slave_image -f Dockerfile-slave .
生成镜像后,运行以下命令运行容器:
docker run --name mysql_master -d -p 3306:3306 mysql_master_image
docker run --name mysql_slave -d -p 3307:3306 mysql_slave_image
因为docker容器是相互隔离的,每个容器都有独立的ip,所以不同容器使用相同的端口是不会冲突的。此次搭建是在一台主机上进行的,生产环境中肯定是在不同的主机上搭建。
Master
使用以下命令进入Master容器内部:
docker exec -it mysql_master /bin/bash
进入容器后切换到/etc/mysql目录下,编辑my.cnf文件
[mysqld]
# 同一局域网内注意要唯一
server-id=100
# 开启二进制日志功能,可以随便取(关键)
log-bin=master-bin
# 二级制日志格式,有三种 row,statement,mixed
binlog-format=ROW
# 同步的数据库名称,如果不配置,表示同步所有的库
binlog-do-db=数据库名
配置完成后重启mysql:
service mysql restart
重启会导致容器停止,使用以下命令启动:
docker start mysql_master
创建数据库同步账户
重新进入Master容器,使用以下命令登录mysql:
mysql -uroot -p
创建用户并授权:
CREATE USER 'master'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'master'@'%';
到这里Master基本配置完成
binlog文件
输入SHOW MASTER STATUS;查看Master状态,记住File和Position
Slave
与master一样,进入容器并切换到/etc/mysql目录下编辑my.cnf
[mysqld]
# 设置server_id,注意要唯一
server-id=101
# 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
# relay_log配置中继日志
relay_log=mysql-relay-bin
# 设置为只读,该项如果不设置,表示slave可读可写
read_only=1
配置好后重启mysql与容器。
开始主从复制
登录mysql,输入以下命令:
change master to master_host='172.18.0.3', master_user='master', master_password='123456', master_port=3306, master_log_file='master-bin.000001', master_log_pos=617, master_connect_retry=30;
master_host :Master库的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称 | 容器id查询容器的IP查询
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
输入SHOW SLAVE STATUS\G;查看slave状态。

浙公网安备 33010602011771号