基于docker实现主从复制

1:实现主从复制这个过程我是趟过坑的,后面是自己动手搞了几遍都成功了以后才开始决定记录的,(所以有的截图和上下文对不上的,比如说docker容器的名字对应不上,大家就用自己的就好),打算从centos8安装docker开始到最后实现主从复制,所以我从一开始将原有docker卸载开始记录的,如果你有docker了的话,可以跳过卸载docker步骤。
2:建议刷到帖子的小伙伴不着急上手,先浏览完再上手
3:描述有误的地方欢迎大家不吝赐教,找到我v:star2020082220210611

卸载docker

1:删除docker容器

 sudo docker stop $(docker ps -aq)

在这里插入图片描述
注意:这个命令会停止所有容器,包括正在运行的容器和已经停止的容器
2:删除所有容器:

sudo docker rm $(docker ps -aq)

注意:由于我这里只有一个docker,而且已经执行了docker rm 容器id/容器名称这个命令来删除容器了。所以这里就不贴图了

3:删除所有镜像(我这里就一个mysql5.7的镜像,不过删除的这个过程有点花时间,稍微等下哈)

sudo docker rmi $(docker images -q)

在这里插入图片描述
在这里插入图片描述
注意:这个命令会删除所有镜像,包括正在运行的镜像和已经停止的镜像;执行这个命令时,命令行会给出二次确认提示y/n,选择y代表继续执行删除操作。出现上面第二个界面代表删除完毕。

4:卸载docker

sudo yum remove docker-ce docker-ce-cli containerd.io

在这里插入图片描述

5:删除docker数据目录

sudo rm -rf /var/lib/docker

注意:这个命令会删除 Docker 数据目录,包括所有容器、镜像和数据卷。

上面这些操作是因为我想从安装docker开始从头到尾记录,在搭建的过程中躺了几次坑,后面搭建成功后我又删除了几次,反复实验都能实现主从复制,所以记录下。大家不需要删除docker的可以直接从下面的步骤开始,希望能帮到其他小伙伴。

接下来从centos中安装docker镜像开始。

首先centos中安装docker镜像:
1:更新数据源

 sudo yum update

在这里插入图片描述

2:安装docker运行时需要的一些工具和依赖库,因为这些centos8中并不完整,需要进行安装

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

在这里插入图片描述
3:下载docker包

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在这里插入图片描述

4:安装docker社区版:(这个过程也需要等待会儿哈)

sudo yum install -y docker-ce

在这里插入图片描述
在这里插入图片描述
5:设置docker服务并启动

sudo systemctl enable docker

在这里插入图片描述

sudo systemctl start docker

在这里插入图片描述

注意:也可以一起执行:sudo systemctl enable docker &&sudo systemctl start docker

6:查询docker版本

sudo docker --version

在这里插入图片描述
至此docker已经安装完成了,接下来是mysql

拉取mysql镜像,这里以mysql5.7版本为例

1:拉取mysql5.7镜像

docker pull mysql:5.7

在这里插入图片描述
注意:这个过程需要等待哈
2:查看镜像

docker images

在这里插入图片描述
3:随便创建一个mysql容器,这里的主要目的是为了复制mysql配置文件,因为我是想将mysql的配置文件my.cnf挂载出去,方便修改

docker run -d --name master mysql:5.7

在这里插入图片描述

注意:这里是创建一个mysql容器并运行,如果需要查看mysql的配置文件my.cnf需要执行以下命令,不需要的可以跳过
步骤1:创建容器并启动

docker run -d -p 3333:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql:5.7

在这里插入图片描述

解释下含义:

docker run -d -p 3333:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql:5.7
这个 docker 命令用于在 docker 中运行一个 MySQL 容器,以下是命令中各个参数的含义:
docker run:用于在 docker 中运行一个容器的命令。
-d:表示在后台(detached 模式)运行容器,即不在终端上显示容器的输出。
-p 3333:3306:将主机(Host)的 3333 端口映射到容器的 3306 端口。这意味着你可以通过主机的 3333 端口访问容器中的 MySQL 服务。
--name master:指定容器的名称为 "master"。
-e MYSQL_ROOT_PASSWORD=123456:设置 MySQL 根用户的密码为 "123456"。这里使用环境变量来传递密码给容器内的 MySQL 服务。
docker.io/mysql:5.7:表示使用 Docker Hub 上的 mysql 镜像,并指定标签为 5.7。
综合起来,这个命令的作用是在 Docker 中创建一个 MySQL 5.7 版本的容器,
容器名称为 "master",
通过主机的 3333 端口访问 MySQL 服务,并设置根用户密码为 "123456"。
容器在后台运行,不在终端上显示输出。

步骤2:进入容器的shell

docker exec -it master bash

步骤3:查看默认的my.cnf配置文件

ls /etc/my.cnf
cat /etc/my.cnf
或者是
ls /etc/mysql/my.cnf
cat /etc/mysql/my.cnf

在这里插入图片描述
4:创建并启动了docker开始创建文件夹,将mysql的默认配置文件拷贝进来,然后修改配置,在挂载出去,这样方便我们修改mysql的配置文件。

mkdir mysql // home文件下创建mysql文件mkdir /home/mysql/master // mysql文件夹下创建主库文件夹mastermkdir /home/mysql/slave // mysql文件夹下创建从库文件夹slave

在这里插入图片描述
5:复制配置文件到上面创建的主从文件的my.cnf配置文件中
主文件夹:

docker cp master:/etc/my.cnf /home/mysql/master

从文件夹:

docker cp master:/etc/my.cnf /home/mysql/slave

查看是否复制成功
在这里插入图片描述
6:删除上面正在运行的容器

docker ps -a  //查看
docker stop master  //停止 ,test是我上面创建的容器的名字
docker rm master //删除

在这里插入图片描述

7:启动主容器

docker run -d \
--restart=always \
-p 3306:3306 \
-v /home/mysql/master/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
--name master mysql:5.7

以上docke命令中各个参数的含义:

docker run:用于在 Docker 中运行一个容器的命令。
-d:表示在后台(detached 模式)运行容器,即不在终端上显示容器的输出。
-p 3333:3306:将主机(Host)的 3333 端口映射到容器的 3306 端口。这意味着你可以通过主机的 3333 端口访问容器中的 MySQL 服务。
--name master:指定容器的名称为 "master"。
-e MYSQL_ROOT_PASSWORD=123456:设置 MySQL 根用户的密码为 "123456"。这里使用环境变量来传递密码给容器内的 MySQL 服务。
docker.io/mysql:5.7:表示使用 Docker Hub 上的 mysql 镜像,并指定标签为 5.7。

在这里插入图片描述

8:进入主库的配置文件并在文件[mysqld]下新增以下内容,保存后退出。

vim /home/mysql/master/my.cnf

在这里插入图片描述

## 设置server_id, 同一个局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql,information_schema
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

在这里插入图片描述
9:重新启动主库容器

docker restart master

在这里插入图片描述
注意:要保证master库启动成功后再继续下面的步骤,否则就会再登录mysql的时候报错,提示用户名密码不正确,如图所示。可以查看日志,当出现图二红框中所示代表启动成功了,这个时候再继续下面的步骤,去登录mysql的时候就不会报错
在这里插入图片描述

docker logs master   //查看容器名为master的日志

在这里插入图片描述

10:主库中创建数据同步,分为以下几个步骤
步骤1:mysql容器

docker exec -it master bash

步骤2:登录mysql

mysql -uroot -p123456

步骤3:授予 名为"slave" 的用户从主数据库复制数据的权限

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

具体含义:

GRANT REPLICATION SLAVE:授予从数据库复制数据的权限。
ON *.*:将权限应用于所有数据库和所有表。
TO 'slave'@'%':授予 "slave" 用户在任何主机上的访问权限。'%' 表示任意主机。
IDENTIFIED BY '123456':设置用户 "slave" 的密码为 "123456"。

步骤4:授予名为 “slave” 的用户在从数据库复制数据和执行一些客户端操作所需的权限

grant replication slave, replication client on *.* to 'slave'@'%';

具体含义:

grant replication slave:授予从数据库复制数据的权限。
replication client:授予从数据库执行一些客户端操作的权限,例如读取主数据库的二进制日志信息。
on *.*:将权限应用于所有数据库和所有表。
to 'slave'@'%':授予 "slave" 用户在任何主机上的访问权限。'%' 表示任意主机

步骤5:刷新

flush privileges;

步骤6:查看主从同步状态记录该状态下的master_log_file和master_log_pos,这两个参数值需要记住,后面会用到

show master status;

在这里插入图片描述
然后ctrl+d退出即可。
注意:上面的步骤也可以在navicat中操作 。
1:新建mysql链接登录数据库
2:执行命令(按顺序执行哈)

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456'; 
grant replication slave, replication client on *.* to 'slave'@'%';
flush privileges;
show master status;

11:启动从容器

docker run -d \
--restart=always \
-p 3307:3306 \
-v /home/mysql/slave/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
--name slave mysql:5.7

在这里插入图片描述
12:修改从库配置文件,并在[mysqld]下新增以下内容:

vim /home/mysql/slave/my.cnf

在文件[mysqld]中新增以下内容:


## 设置server_id, 同一个局域网内需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql,information_schema
## 开启二进制日志功能,以备slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置只读(具有super权限的用户除外)
read_only=1

在这里插入图片描述
13:重新启动从容器

docker restart slave

在这里插入图片描述
14:从库中创建数据同步用户,分为以下几个步骤
步骤1:进入mysql容器

docker exec -it slave bash

在这里插入图片描述

步骤2:登录mysql

mysql -uroot -p123456

在这里插入图片描述

步骤3:配置 MySQL 主从复制中从数据库的连接和同步信息,它告诉从数据库如何连接到主数据库以获取数据的复制更新。

CHANGE MASTER TO master_host = '192.168.0.25',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mall-mysql-bin.000001',
master_log_pos = 807,
master_connect_retry = 30;

上面这段 SQL 各个参数的含义:

master_host = '192.168.0.25':这是主数据库的 IP 地址或主机名。从数据库将连接到该主数据库来获取复制数据。master_user = 'slave':这是连接主数据库所使用的用户名。通常创建一个用于复制的专用用户。master_password = '123456':连接主数据库所使用的密码,与上述用户名对应。master_port = 3306:主数据库的端口号,通常为 MySQL 默认的端口号 3306。master_log_file = 'mall-mysql-bin.000001':这是主数据库二进制日志中的日志文件名,它包含复制数据的更新记录。master_log_pos = 807:这是主数据库二进制日志文件中的位置,指示从数据库在何处开始读取二进制日志以进行复制。master_connect_retry = 30:在连接主数据库失败时,从数据库会尝试重新连接的时间间隔(以秒为单位)。总体而言,这些配置参数告诉从数据库应该连接到哪个主数据库,使用哪个用户和密码来获取复制数据,并从主数据库的指定二进制日志位置开始同步数据。这是主从复制配置的一部分,使得从数据库可以与主数据库保持数据同步。在执行 CHANGE MASTER TO 后,从数据库可以开始运行复制进程,从主数据库同步数据更新。

在这里插入图片描述
13:查看状态,此时Slave_IO_Running、Slave_SQL_Running都为No

show slave status \G;

在这里插入图片描述

14:开启主从同步

start slave;

在这里插入图片描述

15:再次查看主从同步状态, 此时Slave_IO_Running、Slave_SQL_Running都为 Yes

show slave status \G;

在这里插入图片描述
注:上面的步骤也可以在navicat中进行,步骤如下:
步骤1:新建mysql链接登录数据库
步骤2:配置 MySQL 主从复制中从数据库的连接和同步信息

CHANGE MASTER TO master_host = '192.168.0.25',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mall-mysql-bin.000001', //与主库中一致
master_log_pos = 1444, // 与主库中一致
master_connect_retry = 30;

步骤3:查看主从同步状态# 此时Slave_IO_Running、Slave_SQL_Running都为 No

show slave status;

步骤4:开启主从同步

start slave;

步骤5:再次查看主从同步状态# 此时Slave_IO_Running、Slave_SQL_Running都为 Yes

show slave status;

16:从库的Slave_IO_Running、Slave_SQL_Running都为Yes时代表主从配置成功了,接下来就可以去nacivat中创建链接,连接成功后创建数据库,插入数据,就可以验证主从是否同步啦,也可以在命令行中进行,我以nacivat中为例,创建库,表,插入数据,看是否同步
验证1:库是否同步
主库新建一个数据库:test
在这里插入图片描述
从库刷新一下再看:
在这里插入图片描述
结论:从数据库中也存在了一个test库
验证2:表是否同步
主库中创建一张表
在这里插入图片描述在这里插入图片描述

从库刷新下再看:
在这里插入图片描述
结论:从库中也存在了user表
验证3:数据是否同步

在这里插入图片描述
从库刷新下再看:
在这里插入图片描述
结论:从库中也存在了user表中的数据
到此,就算完结啦,描述有误的地方欢迎大家指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/72298.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 141.环形链表

文章目录 💡题目分析💡解题思路🔔接口源码💡深度思考❓思考1❓思考2 题目链接👉 LeetCode 141.环形链表👈 💡题目分析 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中…

antd5源码调试环境启动(MacOS)

将源码下载至本地 这里antd5 版本是5.8.3 $ git clone gitgithub.com:ant-design/ant-design.git $ cd ant-design $ npm install $ npm start前提:安装python3、node版本18.14.0(这是本人当前下载的版本) python3安装教程可参考:https://…

激光雷达 01 线数

一、线数 对于 360 旋转式和一维转镜式架构的激光雷达来说,有几组激光收发模块,垂直方向上就有几条线,被称为线数。这种情况下,线数就等同于激光雷达内部激光器的数量[参考]。 通俗来讲,线数越高,激光器的…

Linux学习之iptables的nat表

iptables -t nat 命令 规则链 规则是格式命令。 PREROUTING一般用于内网,用于目的地址转换。 POSTROUTING一般用于外网,用于源地址转换。 iptables -t nat -A PREROUTING -i eth0 -d 114.115.116.117 -p tcp --dport 80 -j DNAT --to-destination 10.0.0…

编程语言学习笔记-架构师和工程师的区别,PHP架构师之路

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…

国产化系统中遇到的视频花屏、卡顿以及延迟问题的记录与总结

目录 1、国产化系统概述 1.1、国产化操作系统与国产化CPU 1.2、国产化服务器操作系统 1.3、当前国产化系统的主流配置 2、视频解码花屏与卡顿问题 2.1、视频解码花屏 2.2、视频解码卡顿 2.3、关于I帧和P帧的说明 3、国产显卡处理速度慢导致图像卡顿问题 3.1、视频延…

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀

今日目标 能够编写SpringMVC入门案例 了解SpringMVC原理 1. SpringMVC介绍 1.1 SpringMVC概述 思考:SpringMVC框架有什么优点? SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 优点 使用简单,开发便捷(相比于Servlet) 天…

机器学习算法之-逻辑回归(1)

什么是回归 回归树,随机森林的回归,无一例外他们都是区别于分类算法们,用来处理和预测连续型标签的算法。然而逻辑回归,是一种名为“回归”的线性分类器,其本质是由线性回归变化而来的,一种广泛使用于分类问…

56.linux 进程管理命令和用户管理命令

目录 一、进程管理命令 1.ps 2.pstree 3.kill 4.pkill 5.&后台运行程序 6.jobs 7.fg bg 8.top 二、用户管理命令 1.系统存储用户信息的文件 2.添加新用户 3.修改用户密码 4.删除用户 一、进程管理命令 1.ps 用于查看当前系统中运行的进程信息。它可以…

怎么开通Tik Tok海外娱乐公会呢?

TikTok作为全球知名的社交媒体平台,吸引了数亿用户的关注和参与。许多公司和个人渴望通过开通TikTok直播公会进入这一领域,以展示自己的创造力和吸引更多粉丝。然而,成为TikTok直播公会并非易事,需要满足一定的门槛和申请找cmxyci…

分类预测 | MATLAB实现CNN-BiGRU-Attention多输入分类预测

分类预测 | MATLAB实现CNN-BiGRU-Attention多输入单输出分类预测 目录 分类预测 | MATLAB实现CNN-BiGRU-Attention多输入单输出分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现CNN-BiGRU-Attention多特征分类预测,卷积双向门控循环…

【Redis】Redis内存过期策略和内存淘汰策略

【Redis】Redis内存过期策略和内存淘汰策略 文章目录 【Redis】Redis内存过期策略和内存淘汰策略1. 过期策略1.1 惰性删除1.2 周期删除1.2.1 SLOW模式1.2.2 FAST模式 2. 淘汰策略 1. 过期策略 Redis本身是一个典型的key-value内存存储数据库,因此所有的key、value都…