基于docker实现主从复制

news2024/11/25 6:55:53

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文件夹下创建主库文件夹master

mkdir /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.coloradmin.cn/o/881913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“数据”对于仓库管理有多重要?!

仓库数据的重要性 做好仓库数据管理对企业的重要性不言而喻。通过有效地管理数据,企业可以更好地了解市场需求和库存情况,快速响应市场变化,提高库存周转率和客户满意度;此外,数据管理还可以帮助企业降低库存成本、减…

提升物流管理效率,快递批量查询高手软件助你一臂之力

物流管理中,准确跟踪和掌握快递的物流信息是非常重要的。而快递批量查询高手软件的出现,大大提高了物流管理的效率,为企业带来了诸多便利。 传统的快递查询方式往往需要手动逐个输入快递单号,费时费力且容易出错。而有了快递批量查…

源于传承,擎领未来,新架构、新工艺下的“换心工程”——金融电子化访中电金信副总经理、研究院院长况文川

当前,商业银行的经营环境正在发生着深刻而复杂的变化,在深化改革主旋律的指引下,数字化转型已成为我国商业银行普遍认同、广泛采用的战略性举措。核心系统作为承载银行业务的关键支柱系统,一直是各银行在金融科技建设中重点关注和…

Linux/centos上如何配置管理NFS服务器?

Linux/centos上如何配置管理NFS服务器? 1 NFS基础了解1.1 NFS概述1.2 NFS工作流程 2 安装和启动NFS服务2.1 安装NFS服务器2.2 启动NFS服务 3 配置NFS服务器和客户端3.1 配置NFS服务器3.2 配置NFS客户端 4 实际示例4.1 基本要求4.2 案例实现 1 NFS基础了解 NFS&…

Android UI自动化测试框架—SoloPi简介

1、UI自动化测试简介 软件测试简介 ​软件测试是伴随着软件开发一同诞生的,随着软件规模大型化,结构复杂化,软件测试也从最初的简单“调试”,发展到当今的自动化测试。 ​ 自动化测试是什么呢?自动化测试是把以人为…

解析固态光耦的独特特点和优势

固态光耦概述及其重要性 固态光耦是一种电子元件,具有独特的光电隔离功能,广泛应用于电气控制、通信和电力系统等领域。本文将深入探讨固态光耦的特点和优势,介绍它在市场中的重要性以及如何提高收录和首页排名。 高速、高精度的信号传输 …

Dolphinscheduler简单应用(二)—— 告警通知

一、本章目标 演示Dolphinscheduler的告警通知功能,将SQL任务组件查询返回结果集指定为邮件通知内容(支持为:表格、附件或表格附件三种模板)。二、 前提条件 已完成Dolphinscheduler部署 K8S集群部署,可参考文章:基于K8S环境部署Dolphinscheduler及简单应用其他部署形式,…

LeetCode236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先 文章目录 [236. 二叉树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/)一、题目二、题解方法一:递归构建祖先数组方法二:一个非常方便的递归 一、题目 给定一个二叉树, 找到该树中…

性能测试|App性能测试需要关注的指标

一、Android客户端性能测试常见指标: 1、内存 2、CPU 3、流量 4、电量 5、启动速度 6、滑动速度、界面切换速度 7、与服务器交互的网络速度 二、预期标准指定原则 1、分析竞争对手的产品,所有指标要强于竞品 2、产品经理给出的预期性能指标数据…

青翼科技自研2路250MSPS DA回放FMC子卡模块

FMC150_V30是一款基于VITA57.1规范的2路125MSPS采样率16位分辨率AD采集、2路250MSPS采样率16位分辨率DA回放FMC子卡模块。该模块遵循VITA57.1规范,可直接与符合VITA57.1规范的FPGA载卡配合使用,板卡ADC器件采用ADI公司的AD9268芯片,板卡DAC器…

DDIM: DENOISING DIFFUSION IMPLICIT MODELS

DDIM: DENOISING DIFFUSION IMPLICIT MODELS 去噪扩散隐式模型DDIM预测噪声生成过程 实验 论文题目:Denoising Diffusion Implicit Models (DDIM) 论文来源:ICLR 2021 论文地址:https://arxiv.org/pdf/2010.02502.pdf 论文代码:ht…

“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定(专家建议稿)》研讨会顺利召开

研讨会主题 8月10日,“之江数据安全治理论坛”暨《浙江省汽车数据处理活动规定(专家建议稿)》研讨会在浙江大学计算机创新技术研究院举办。 本次研讨会的主题聚焦于“智能网联汽车的数据安全与数据合规”,邀请行业主管部门和数据…

iptables与firewall的命令的使用

iptables与firewall的命令的使用 安装firewall指令基本使用iptables简介命令查看 IPTABLES 版本查看当前 IPTABLES 规则添加规则修改规则删除某条规则加入白名单备份与还原定义策略 其他 安装 查看是否已安装: CentOS:rpm -qa | grep iptables 安装&am…

推荐一个好用的程序员工具箱,集成了代码生成,云剪切板以及AI能力

给大家推荐一个程序员必备网站,功能方便、实用,页面精美,下面是部分功能截图: 代码生成 云剪切板 工作日报生成 专利文章生成 毕业论文生成 地址: http://119.29.247.153/#/ai-tools​

计算机组成部分

计算机的五大部件是什么?答案:计算机的五大部件是运算器,控制器,存储器,输入设备和输出设备。 其中运算器和控制器合称中央处理器,是计算机的核心部件; 存储器是用来存储程序指令和数据用的&am…

免费AI作图项目:Fooocus,Github高星推荐,支持win私有化部署

我们都知道,Midjourney是需要付费使用的,而Stable Diffusion需要大量的学习成本,在这种背景下,Fooocus应运而生。 Fooocus 是一款图像生成软件。 Fooocus项目原地址:https://github.com/lllyasviel/Fooocus Stable …

华为手机Outlook手机APP无法登录邮箱,提示[2002]错误代码

近期遇到不少华为手机的Outlook APP无法登录邮箱Office365邮箱的案例,并且提示: 错误 出错了。[2002] 经测试,这应该是华为应用市场下载的Outlook版本有问题。 解决方法: 把Outlook卸载之后从微软官网重新下载官网版本去安装&am…

全网最细,Jmeter接口测试-实现动态关联实战整理,你要的都有...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 业务场景&#xf…

http库 之 OKHttpUtil

源码位置 方便实用&#xff0c;个人感觉不错 依赖 <dependency><groupId>io.github.admin4j</groupId><artifactId>common-http-starter</artifactId><version>0.7.5</version> </dependency>代码实践 /*** 通用http的pos…

SringBoot-响应

响应数据 如何加载响应数据呢 其实在SpringBoot&#xff0c;已经有名为RessponseBody的方法注解为我们提供的响应的方法&#xff0c;他的作用是将方法返回值直接响应&#xff0c;如果返回值类型为实体对象/集合&#xff0c;则会转换为JSON格式响应。 而RestController已经在内…