1.下载mysql5.7镜像
docker pull mysql:5.7
下载完成后,可以使用如下命令查看mysql镜像:
docker images
2. 使用下载好的镜像搭建3个MySQL主从
Master:
docker run -p 3301:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
Slave:
docker run -p 3302:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
slave2:
docker run -p 3303:3306 --name mysql-slave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
master对外映射的端口号是3301,slave对外映射的端口号是3302,slave2对外的映射端口号是3303,,大家可以自己随意设置。因为docker容器是相互隔离的,每个容器有其独立的IP地址,所以不同容器使用相同的端口并不会冲突。
3.配置master
3.1编辑my.cnf文件
进入到Master容器内部,使用容器ID或者名称均可:
docker exec -it mysql-master /bin/bash
切换到 /etc/mysql 目录下:
使用vim命令编辑my.cnf文件,会出现bash: vim: command not found,因此我们需要在docker内部安装vim工具
docker内部安装vim:
依次输入如下命令即可安装,时间和网速有关,耐心等待。
apt-get update
apt-get install vim
安装成功后,编辑my.cnf文件:
[mysqld]
server-id=100
log-bin=master-bin
binlog-format=ROW
配置完成后,需要重启mysql服务使其修改的配置文件生效,使用如下命令使mysql进行重启和使容器重新启动
service mysql restart
docker start mysql-master
3.2创建数据库同步账户
使用docker命令重新进入到Master容器内部:
docker exec -it mysql-master /bin/bash
在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。登录到mysql客户端:
mysql -uroot -p123456
创建用户并授权:
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
4.配置slave
4.1编辑my.cnf文件
使用docker命令docker exec -it mysql-slave /bin/bash 进入到slave容器中,进入到etc/mysql路径,使用vim命令编辑my.cnf文件:
[mysqld]
server-id=101
log-bin=mysql-slave-bin
relay_log=mysql-relay-bin
read_only=1
配置完成后也需要重启mysql服务和docker容器:
service mysql restart
docker start mysql-slave
4.2开启Master-Slave主从复制
进入Master库mysql客户端:输入show master status查看Master状态
记住File和Position,后面需要用到。此时一定不要操作Master库,否则将会引起Master状态的变化,File和Position字段也将会进行变化。
进入到Slave库myslq客户端,执行如下命令:
change master to master_host='172.17.0.2', master_user='slave', 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秒。
在Slave 中的mysql终端执行:
start slave;
show slave status \G
用于查看主从同步状态。
Slave_IO_Running 和 Slave_SQL_Running 都是Yes,说明主从复制已经开启。
5.配置slave2
5.1编辑my.cnf文件
进入到/etc/mysql/目录,通过vim命令修改mysql 的配置文件my.cnf,添加如下配置:
[mysqld]
server-id=102
relay-log=mysql-relay-bin
配置完成后也需要重启mysql服务和docker容器:
service mysql restart
docker start mysql-salve2
5.2开启master-slave2主从复制
进入到Slave2库myslq客户端,执行如下命令:
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='master-bin.000001', master_log_pos=617, master_connect_retry=30;
之后步骤就跟配置slave时一样:
在Slave2 中的mysql终端执行:
start slave
show slave status \G
用于查看主从同步状态。