「MySQL」 利用Docker实现MySQL一主多从

安装Docker

查看Docker版本

docker version

查找想要的MySQL版本

https://hub.docker.com/u/library

这里使用的是 **5.7.27**

安装MySQL

docker pull mysql:5.7.27

创建一个自定义网桥mysql_bridge

docker network create --driver bridge mysql_bridge

运行主容器

docker run -itd --network mysql_bridge --name mysql_master1 -p 4306:3306 -e MYSQL_ROOT_PASSWORD=****** mysql:5.7.27

--name 容器名字

-p 指定容器的端口3306映射到主机的端口4306

-e 设置环境变量,这里指定root账号的密码为******

-d 后台运行容器,同时返回容器ID

mysql:5.7.27 指定MySQL的运行版本

检查容器是否启动

docker ps -a

​STATUS为UP表示正在进行中

使用MySQL Workbench连接

创建主容器的复制账号

CREATE USER replica IDENTIFIED BY '******';

GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%' IDENTIFIED BY '******';

SHOW GRANTS FOR 'replica'@'%' ;

修改MySQL配置环境

创建目录

mkdir -p mysql/master1

mkdir -p mysql/slave1

mkdir -p mysql/slave2

拷贝MySQL配置文件

docker cp mysql_master1:/etc/mysql/mysql.conf.d/mysqld.cnf mysql/master1/mysqld.cnf

修改mysqld.cnf文件内容

#使 用 binary logging, mysql-bin是 log文 件 名 的 前 缀

log-bin=mysql-bin

#唯 一 服 务 器 ID,非 0整 数 ,不 能 与 和 其 他 服 务 器 的 server-id重 复

server-id=1

将修改后的mysqld.cnf文件覆盖到docker中MySQL的配置文件中

docker cp mysql/master1/mysqld.cnf mysql_master1:/etc/mysql/mysql.conf.d/mysqld.cnf

重启MySQL容器

docker restart mysql_master1

检查日志

docker logs mysql_master1 -f

运行MySQL从容器(mysql_slave1)

#1

docker run -itd --network mysql_bridge --name mysql_slave1 -p 4307:3306 -e MYSQL_ROOT_PASSWORD=****** mysql:5.7.27

同主容器一样,拷贝一个mysqld.conf文件,并覆盖到从容器中

#2

log-bin=mysql-bin

server-id=21

#3

修改完配置文件,覆盖到从容器,重启从容器

docker cp mysql/slave1/mysqld.cnf mysql_slave1:/etc/mysql/mysql.conf.d/mysqld.cnf

docker restart mysql_slave1

运行MySQL从容器(mysql_slave2)

#1

docker run -itd --network mysql_bridge --name mysql_slave2 -p 4308:3306 -e MYSQL_ROOT_PASSWORD=****** mysql:5.7.27

同主容器一样,拷贝一个mysqld.conf文件,并覆盖到从容器中

#2

log-bin=mysql-bin

server-id=22

#3

修改完配置文件,覆盖到从容器,重启从容器

docker cp mysql/slave1/mysqld.cnf mysql_slave2:/etc/mysql/mysql.conf.d/mysqld.cnf

docker restart mysql_slave2

配置主从复制

使用MySQLWorkbench连接mysql_slave1,执行以下SQL

CHANGE MASTER TO

MASTER_HOST='mysql_master1',

MASTER_PORT=3306,

MASTER_USER='replica',

MASTER_PASSWORD='******';

如果出现从实例复制log位置问题,添加如下SQL语句

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=154,

START SLAVE;

改变复制SQL配置后需要重启从配置

STOP SLAVE;

START SLAVE;

创建数据库,主从复制不会创建数据库,需要在主从实例上手动创建

CREATE DATABASE IF NOT EXISTS test CHARSET utf8mb4;