docker搭建mysql,实现主从复制(一主两从)

2023-12-20 14:26:26

????????安装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来完成。让主库完成 (增、删、改的操作),让从库的轮询访问来完成读的操作。

文章来源:https://blog.csdn.net/chuxin_mm/article/details/135104807
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。