基于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状态。

posted @ 2023-12-10 19:14  CrryG_GPC  阅读(75)  评论(0)    收藏  举报