1.首先拉取Mysql的镜像,这里我使用的是5.7版本
docker pull mysql:5.7
然后启动两个容器用于搭建主从MySQL。
2.启动Master和Slave
- Master
docker run -p 3307:3306 --name mysql_master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- Slave
docker run -p 3308:3306 --name mysql_slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
注意启动的时候不要映射相同的Host端口,否则会冲突报错。
3.配置Master数据库
- 进入master容器内部:
docker exec -it mysql_master /bin/bash
- 更新apt,并安装vim
apt-get update && apt-get install -y vim
- 修改MySQL的配置文件
配置文件需要正确否则后面重启的时候回失败,建议使用volume挂载配置文件,否则一旦错误需要重启建立容器。
vim /etc/mysql/my.cnf
增加的内容为:
[mysqld]
## 同一局域网内要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
- 重启MySQL服务
service mysql restart
重启mysql服务时会使得docker容器停止,我们还需要docker start mysql_master
启动容器。
- 再进入master容器创建用户并且授予权限
CREATE USER 'jyw'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'jyw'@'%';
这里在容器中的mysql中执行,进入mysql的方法为:
mysql -u root -p #最后输入密码123456
4.配置Slave数据库
- 和前面一样修改配置文件并且重启mysql、start容器。
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
5.链接Master和Slave
#在Master进入mysql,执行
show master status;
这里需要记住File字段的值,Position的值也可以记也可以不记。后面解释这些字段。
- 在slave的mysql中执行
change master to master_host='172.17.0.2', master_user='jyw', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=0, master_connect_retry=30;
这里的master_log_file就是前面master中查看状态时的File字段的值
master_log_pos就是master中查看状态时的Position字段的值,赋值为0时会自动赋值
start slave;
- 查看是否成功
# mysql中执行
show slave status \G
字段 | 含义 |
---|---|
Slave_IO_State | 线程正在试图连接到主服务器,正在等待来自主服务器的时间或正在连接到主服务器等 |
Master_User | 被用于连接主服务器的当前用户 |
Master_Port | 当前的主服务器接口 |
Connect_Retry | –master-connect-retry选项的当前值 |
Master_Log_File | I/O线程当前正在读取的主服务器二进制日志文件的名称 |
Read_Master_Log_Pos | 在当前的主服务器二进制日志中,I/O线程已经读取的位置 |
Relay_Log_File | SQL线程当前正在读取和执行的中继日志文件的名称 |
Relay_Log_Pos | 在当前的中继日志中,SQL线程已读取和执行的位置 |
Relay_Master_Log_File | 由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称 |
Slave_IO_Running | I/O线程是否被启动并成功地连接到主服务器上 |
Slave_SQL_Running | SQL线程是否被启动 |
Replicate_Do_DB | 使用–replicate-do-db和–replicate-ignore-db选项指定的数据库清单 |
Replicate_Ignore_DB | 使用–replicate-do-db和–replicate-ignore-db选项指定的数据库清单 |
Last_Errno,Last_Error | 被多数最近被执行的查询返回的错误数量和错误消息。错误数量为0并且消息为空字符串意味着“没有错误” |
两个YES就是成功了,我们去Navicat里面验证一下:
验证
在master中创建一个数据库,结果在slave中也有完全一致的数据库。