docker搭建mysql,实现主从复制(一主两从)
????????安装docker的步骤、使用命令就不写了,本文章是基于会使用docker、linux基本命令的基础上来写的。
开始步骤:
1. 拉取 mysql 镜像?
docker pull mysql
2. 启动容器并运行mysql
-- 启动一个mysql将数据挂载到本地目录:/Users/wangqinmin/docker/mysql/master_slave/master_data
docker run --name mysql_master_33066 -v /Users/wangqinmin/docker/mysql/master_slave/master_data:/var/lib/mysql -p 33066:3306 -e MYSQL_ROOT_PASSWORD=wangqinmin -d mysql:8.0.32
-- 启动一个mysql将数据挂载到本地目录:/Users/wangqinmin/docker/mysql/master_slave/slave_data1
docker run --name mysql_slave_33067 -v /Users/wangqinmin/docker/mysql/master_slave/slave_data1:/var/lib/mysql -p 33067:3306 -e MYSQL_ROOT_PASSWORD=wangqinmin -d mysql:8.0.32
-- 启动一个mysql将数据挂载到本地目录:/Users/wangqinmin/docker/mysql/master_slave/slave_data2
docker run --name mysql_slave_33068 -v /Users/wangqinmin/docker/mysql/master_slave/slave_data2:/var/lib/mysql -p 33068:3306 -e MYSQL_ROOT_PASSWORD=wangqinmin -d mysql:8.0.32
3. 从上面的挂载目录命名就可以看出,我准备将 33066 作为主数据库,33067和33068做为从数据库
4. 主从复制就是在数据库上做配置的设置(重点在这里,但是很简单,就6条命令)
? ? ?1. 进入33066主库 docker容器中
docker exec -it mysql_master_33066 /bin/bash
? ? ? a. 首先 mysql -uroot -p 进入mysql ,或者用 Navicat 工具连接
? ? ? b. 执行以下两条命令:
-- 创建名字为:copy_file_wangqinmin ,密码为:wangqinmin ,访问ip为任意ip的用户
CREATE USER 'copy_file_wangqinmin'@'%' IDENTIFIED BY 'wangqinmin';
-- 为名字是 copy_file_wangqinmin 的用户,只设置 REPLICATION SLAVE (复制数据的权限)
GRANT REPLICATION SLAVE ON *.* TO 'copy_file_wangqinmin'@'%';
? ? ? ? c.?在主库上执行以下命令,并记下 "File" 和 "Position" 的值:?
SHOW MASTER STATUS;
我这里获取到的数据为:
因为我的mysql都在docker内部安装,所以容器的本地ip是127.0.0.1,但是本机外部的本地ip也是127.0.0.1,所以需要查询出主库的docker外部映射ip地址,命令是:
最后的? mysql_master_33066 是我的容器名
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql_master_33066
结果为:?172.17.0.4 ,所以我下面的ip用?172.17.0.4
? ? ?2. 进入33067从库 docker容器中
docker exec -it mysql_slave_33067 /bin/bash
进入mysql中 或者 用 Navicat 工具连接后,分别执行以下3条命令:
-- 停止从库的复制进程。这是为了确保在修改主从配置时,不会有正在运行的复制进程。
STOP SLAVE;
-- 指定从库要去主库的哪个位置开始复制数据。
CHANGE MASTER TO
MASTER_HOST='172.17.0.4',
MASTER_PORT=33066,
MASTER_USER='copy_file_wangqinmin',
MASTER_PASSWORD='wangqinmin',
MASTER_LOG_FILE='binlog.000002',
MASTER_LOG_POS=721;
-- 启动从库的复制进程,开始从主库复制数据。
START SLAVE;
? ? ?3. 进入33068从库 docker容器中
docker exec -it mysql_slave_33068 /bin/bash
进入mysql中 或者 用 Navicat 工具连接后,分别执行以下3条命令:?
-- 停止从库的复制进程。这是为了确保在修改主从配置时,不会有正在运行的复制进程。
STOP SLAVE;
-- 指定从库要去主库的哪个位置开始复制数据。
CHANGE MASTER TO
MASTER_HOST='172.17.0.4',
MASTER_PORT=33066,
MASTER_USER='copy_file_wangqinmin',
MASTER_PASSWORD='wangqinmin',
MASTER_LOG_FILE='binlog.000002',
MASTER_LOG_POS=721;
-- 启动从库的复制进程,开始从主库复制数据。
START SLAVE;
解释:
MASTER_HOST='127.0.0.1'
: 指定主库的 IP 地址。MASTER_PORT=33066
: 指定主库的端口号。MASTER_USER='copy_file_wangqinmin'
: 指定用于连接主库的用户。MASTER_PASSWORD='wangqinmin'
: 指定主库用户的登录密码。MASTER_LOG_FILE='binlog.
000002'
: 指定主库的二进制日志文件。MASTER_LOG_POS=721
: 指定从主库的从哪个二进制日志位置开始复制数据。
最后一步:查看从库的状态,确定从库是否已经连接到主库,是否能够复制文件和sql:
?在从库上执行以下命令:
SHOW SLAVE STATUS;
确保 "Slave_IO_Running" 和 "Slave_SQL_Running" 均为 "Yes"
如果一直没有连接上,可以尝试重启 从库。如果还不行,就看看是不是ip或者是参数填写错误。
5. 要完成读写分离的话,我使用 sharding jdbc来完成。让主库完成 (增、删、改的操作),让从库的轮询访问来完成读的操作。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!