hello 各位小伙伴大家好,今年 5 月份的时候,松哥和大家聊过如何搭建 MySQL 主从复制:
- 提高性能,MySQL 读写分离环境搭建(一)
- 提高性能,MySQL 读写分离环境搭建(二)
不过很多小伙伴反映在 Linux 中安装 MySQL 比较费劲,弄错了想从头开始都难,因此今天松哥就来和大家分享一下如何通过 Docker 快速搭建 MySQL 主从复制。
关于 Docker
关于 Docker,松哥这里就不再多说了,松哥之前有出过一个 Docker 教程,大家在公众号后台回复 Docker ,就可以获取教程下载地址。
主从规划
首先规划两个 MySQL 实例:
- 192.168.66.131:33061/主机
- 192.168.66.131:33062/从机
当然大家可以准备多个从机,从机的配置步骤是一样的。
在 Docker 中创建两个 MySQL 实例的命令如下:
docker run --name mysql1 -p 33061:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
docker run --name mysql2 -p 33062:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
创建完成后,通过 docker ps
命令可以查看 MySQL 实例的运行情况:
![440af1ff44e23f4820877d8a527100ac.png](https://i-blog.csdnimg.cn/blog_migrate/ae2d38afa39201d2acde1b9a91ad84db.png)
如此,表示 MySQL 实例已经在运行了。使用 Docker 配置 MySQL 主从最方便的莫过于配错了可以非常方便的从头开始。
接下来,我们就开始主从的配置。
配置主机
主机上的配置,主要是两个地方:
- 第一个是配置一个从机登录用户
- 第二个配置开启 binlog。
Docker 中创建的 MySQL 实例,默认只有一个用户,就是 root,这里我们需要进入到 MySQL 命令行,再给它分配一个用户。在宿主机中通过如下命令连接上主机:
mysql -u root -h 192.168.66.131 -P 33061 -p
输入密码后,进入到主机的命令行。然后给从机分配用户(因为我的宿主机上也安装了 MySQL,所以可以直接执行 mysql 命令,如果宿主机没有安装 MySQL,建议通过 docker exec
进入到 MySQL 容器中,然后执行如下命令):
GRANT REPLICATION SLAVE ON *.* to 'rep1'@'%' identified by '123';
这个表示从机一会使用 rep1/123
来登录主机,%
表示这个账户可以从任意地址登录,也可以给一个固定的 IP
,表示这个账户只能从某一个 IP 登录。
![c496f2480862a0200be813e8812784c0.png](https://i-blog.csdnimg.cn/blog_migrate/5640ea81b216d58902f62261d71643e2.png)
接下来开启 binlog。
binlog 的开启,需要修改 MySQL 的配置,因此,我们需要进入到容器内部去执行。
首先进入到容器内部:
docker exec -it mysql1 /bin/bash
然后找到 MySQL 配置文件的位置:
/etc/mysql/mysql.conf.d/mysqld.cnf
这就是 MySQL 的配置文件。我们要在这里进行修改操作。因为 MySQL 容器中,默认没有 VI 编辑器,安装费事,所以我们可以在宿主机中将配置文件写好,然后拷贝到 MySQL 容器中,覆盖原有配置。我们主要在该配置文件中添加如下内容:
log-bin=/var/lib/mysql/binlog
server-id=1
binlog-do-db = cmdb
- 第一行表示配置 binlog 的位置,理论上 binlog 可以放在任意位置,但是该位置,MySQL 一定要有操作权限。
- server-id 表示集群中,每个实例的唯一标识符。
- bindlog-do-db 表示要同步的数据库有哪些。当从机连上主机后,并不是主机中的每一个库都要同步,这里表示配置哪些库需要同步。
![aa3f033168a886cce223b776e9a9606b.png](https://i-blog.csdnimg.cn/blog_migrate/bfc731996251d6a57d027c51c3ab6fcf.png)
配置完成后,保存退出。
接下来执行命令,将宿主机中的 mysqld.cnf 拷贝到容器中:
docker cp ./mysqld.cnf mysql1:/etc/mysql/mysql.conf.d/
拷贝完成后,重启容器。
docker restart mysql1
容器重启完成后,进入到主机的命令行中,查看配置是否成功:
![33e858e9a246c4a7efab99ea37f3e043.png](https://i-blog.csdnimg.cn/blog_migrate/c086e0b742601368a00a39ad2780b78e.png)
File 和 Position 需要记着,这两个标记了二进制日志的起点位置,在从机的配置中将使用到这两个参数。
至此,主机的配置就算完成了。
配置从机
从机的配置比较简单,不用开启 binlog,也不用配置要同步的库,只需要在配置文件中,添加一个 server-id 即可。
这是从机的 mysqld.cnf 配置:
![75ad82cd18ef23b95f07bf3c0ccc9e40.png](https://i-blog.csdnimg.cn/blog_migrate/37148056f1bfcb79d69add22b245fa92.png)
配置完成后,一样拷贝到容器中。拷贝方式和主机一样:
docker cp ./mysqld.cnf mysql2:/etc/mysql/mysql.conf.d/
配置完成后,重启从机容器:
docker restart mysql2
重启完成后,进入到 mysql2 的命令行,执行如下命令,开启数据同步:
change master to master_host='192.168.66.131',master_port=33061,master_user='rep1',master_password='123',master_log_file='binlog.000001',master_log_pos=154;
![dcd78656970eb6c6748ed77ddf004e70.png](https://i-blog.csdnimg.cn/blog_migrate/c97c6cf4c3238ff37cdb0410043fc746.png)
配置完成后,开启从机进程。在从机命令行执行如下命令:
start slave;
![c2640c823689a3784b0ec5634b120b8c.png](https://i-blog.csdnimg.cn/blog_migrate/ebd9926312b028a086d102501b8acb25.png)
接下来,执行 show slave status\G;查看从机状态:
![45fcb44df8b6a13c36f2ce86eb68f31d.png](https://i-blog.csdnimg.cn/blog_migrate/dbdeb817f0676d6081f64ea7022081e4.png)
这里重点查看 Slave_IO_Running 和 Slave_SQL_Running ,这两个的值必须为 Yes。如果有一个的值不为 Yes,表示配置失败,一般情况下,配置失败,下面会有失败提示。
至此,我们的 MySQL 主从就算是配置成功了。
检验
配置成功之后,我们可以通过 Navicat 或者 SQLyog 等工具连接上我们的两个 MySQL 实例,然后在主机中创建一个名为 db1 的库,你会发现从机中也会自动同步这个库。
OK,本文就说这么多,有问题欢迎大家留言讨论。
![706e064da43cfc9e6993e59ef2c184fa.gif](https://i-blog.csdnimg.cn/blog_migrate/e53f8e3f648c8136531f80dd3578c89f.gif)
![90589d886004343b5f819339634a45c7.gif](https://i-blog.csdnimg.cn/blog_migrate/3ec8f2286bc3411ddd53e76a9641aeb0.gif)
1、1024,20个入行故事,浮世中见证着程序员的奋斗
2、晚十点半之前下班是耻辱?老板干嘛老爱和员工谈创业精神?
3、微人事 star 数超 10k 啦!聊聊如何打造一个 star 数超 10k 的开源项目
4、Spring Boot 结合 WebSocket 实现在线聊天
5、前后端分离开发中动态菜单的两种实现方案
6、Spring Security 前后端分离登录,非法请求直接返回 JSON
7、使用 Nginx 部署前后端分离项目,解决跨域问题
8、喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了
9、40 篇原创干货,带你进入 Spring Boot 殿堂!
喜欢就点个"在看"呗^_^