redis的主从复制(docker方式快速入门和实战)

news2025/6/9 1:08:26

目录

一、主从复制简介

二、配置主从服务器

2.1使用配置文件的形式来主从复制

2.2使用纯代码的方式来进行主从复制;

2.3脱离主服务器

三、一些注意事项


一、主从复制简介


        主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

        从 Redis 2.6 开始, 从服务器支持只读模式, 并且该模式为从服务器的默认模式。只读模式由 redis.conf 文件中的 slave-read-only 选项控制, 也可以通过 CONFIG SET parameter value (opens new window)命令来开启或关闭这个模式。只读从服务器会拒绝执行任何写命令, 所以不会出现因为操作失误而将数据不小心写入到了从服务器的情况。

        一个主服务器可以有多个从服务器,一个从服务器只能有一个主服务器,并且不支持主主复制。

        不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器, 多个从服务器之间可以构成一个主从链。

      确认了主从关系之后,主服务器可以读也可以写,但是从服务器就只能读了。从服务器一旦确认主服务器,那么在第一次启动时会复制主服务上的所有数据,并且这个从服务器上之前的数据会全部丢失。

参考资料:
Redis 复制 | DB-TUTORIAL

二、配置主从服务器

我本次创建三个redis服务,一个主服务,两个从服务。主服务在Linux上运行,两个从服务使用docker容器来创建;(三个redis的版本都是7.0.10)

2.1使用配置文件的形式来主从复制

注意要修改redis.conf配置文件的几个主要参数

# 修改配置
daemonize no  #后台启动(注意这里要改为no,即非后台启动,因为会和docker run -d 冲突)
 
# 关闭保护模式,开启的话,只有本机才可以访问redis
protected-mode no  
 
# 需要注释掉bind
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
 
# 设置登录密码
requirepass 123456
 
# 开启aof持久化
appendonly yes

使用docker创建两个从服务:

(由于dockerhub中redis官方给的镜像里面没有redis.conf文件,Redis官方发布的官方镜像是按照最小化配置进行的,以保持镜像的轻量级和通用性。为了方便以后更改配置,需要自己手动创建配置文件)

我现在本地的Linux文件中创建了一个redis.conf文件,这个文件是redis官方提供的初始redis配置文件,并在这个初始文件的基础上进行一些小小的改动。

redis官方的配置文件地址:redis/redis.conf at 7.0.10 · redis/redis · GitHub

# 修改配置
daemonize no  #后台启动(注意这里要改为no,即非后台启动,因为会和docker run -d 冲突)
 
# 关闭保护模式,开启的话,只有本机才可以访问redis
protected-mode no  
 
# 需要注释掉bind
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
 
# 设置登录密码
requirepass 123456
 
# 开启aof持久化
appendonly yes

#用来指定主机:slaveof 主机ip 端口
slaveof 192.168.231.110 6379
#主机的密码
masterauth 123456

修改其中相应的配置;(配置主从关系时,只需要在从服务的配置文件中修改就行了,主服务器不变)

使用docker容器创建俩个redis服务,并在创建的容器的时候进行一些挂载:

docker run --name myredis01 \
 -v /usr/dockerMount/myredis01/redis_config/redis.conf:/etc/redis.conf \
 -v /usr/dockerMount/myredis01/redis_data:/data \
 -p 6380:6379 \
 -d redis:7.0.10 redis-server /etc/redis.conf

解释:

 -v /usr/dockerMount/myredis01/redis_config/redis.conf:/etc/redis.conf 容器启动的时候,将本机目录下面的redis.conf映射到容器中去

 -v /usr/dockerMount/myredis01/redis_data:/data 映射数据存储的路径

 -d redis:7.0.10 redis-server /etc/redis.conf  后台启动redis-server,并且指定配置文件启动

创建这个容器之后,我们可以进入到这个redis内部,由于我们已经在myredis01的配置文件中写上了主服务器的地址,那么启动这个服务之后,就会自动拉取redis主服务器中的内容了;

docker exec -it myredis01 redis-cli -a 123456

运行这个命令,可以进入redis的客户端

使用 docker exec -it 命令来执行 Docker 容器内的操作

直接查看我们所拥有的键:

keys *

可以看到我们的从服务能正确拉取到我们主服务中的数据;

查看主机信息:info Replication

查看从机信息:info Replication

能清晰的看到主机和从机的关系;

再新建一个从服务myredis02,同样的创建容器操作:

docker run --name myredis02 \
 -v /usr/dockerMount/myredis01/redis_config/redis.conf:/etc/redis.conf \
 -v /usr/dockerMount/myredis01/redis_data:/data \
 -p 6381:6379 \
 -d redis:7.0.10 redis-server /etc/redis.conf

再进入到这个容器的内部,能看到也同样拉取了我们主服务器中的数据;

至此,我们使用redis.conf配置文件的方式来配置主从复制就完成了,也就是配置一个redis.conf配置文件,并挂载到容器内部。

注意使用配置文件的方式,即使从服务掉线,那么再次连接时,也会重新读取主服务的数据;

2.2使用纯代码的方式来进行主从复制;

在新建一个redis容器,不进行任何的挂载:

docker run --name myredis03 -p 6382:6379 -d redis:7.0.10 

这个容器是新建的,它现在应该能读也能写。

slaveof 192.168.231.110 6379 

config set masterauth 123456

运行这两个命令就可以使这个redis服务器变为从服务器了。(这种方式可能会有一些延迟)但是,这种通过命令行的方式进行的主从关系是很脆弱的,一旦从服务器就行重启,那么这段主从关系就会消失。适合短暂的进行数据库数据的同步。

2.3脱离主服务器

 slaveof no one

这个命令可以使从服务器脱离主从关系的绑定。使从服务器重新变为能读能写的redis服务。但是这个命令有一点鸡肋。它不是永久的。

 服务器停止复制后不会清空数据库,而是会保留之前复制产生的数据。

如果你的主从关系绑定在从服务器的redis.conf配置文件中,那么即使你在从服务器中运行了这个脱离命令,暂时的拥有了读写功能,但是从服务器一重启那么就会重新绑定主从关系。

如果主从关系是靠命令来进行绑定的,那么重启从服务器后自动就会脱离主从关系了。所以这个命令还是有一点鸡肋的。

三、一些注意事项

master主服务器会每个10秒去发一次心跳包,以此来检测从服务器是否还存活。

即使主服务器断线,那么从服务器也会等待主服务器重启,而不能选择新的主服务器。(但是可以使用redis的哨兵监控来指定新的主服务器。)

从节点会努力追赶主节点,最终从节点的状态会和主节点的状态将保持一致。如果网络断开了,主从节点的数据将会出现大量不一致,一旦网络恢复,从节点会采用多种策略努力追赶上落后的数据,继续尽力保持和主节点一致。

redis如何实现的数据同步?

1、slave启动成功连接到master后,会给master发送数据同步消息(发送sync命令)
2、master接收到slave发来的数据同步消息后,把主服务器的数据进行持久化到rdb文件,同时会收集接收到的用于修改数据的命令,master将传rdb文件发送给你slave,完成一次完全同步
3、全量复制:而slave服务在接收到master发来的rdb文件后,将其存盘并加载到内存
4、增量复制:master继续将收集到的修改命令依次传给slave完成同步,
但是只要重新连接master,一次完全同步(全量复制)将会被自动执行
 

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

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

相关文章

【opencv】示例-pca.cpp PCA图像重建演示

// 加载必要的头文件 #include <iostream> // 用于标准输入输出流 #include <fstream> // 用于文件的输入输出 #include <sstream> // 用于字符串的输入输出流操作#include <opencv2/core.hpp> // OpenCV核心功能的头文件 #include "o…

Upload-labs(Pass-17--Pass-21)

Pass-17 二次渲染图片马/条件竞争 二次渲染就是在我们上传的图片后&#xff0c;网站会对图片进行二次处理&#xff0c;比如对图片的尺寸、格式、以及网站对图片进行定义的一些要求等进行处理&#xff0c;并且服务器会对里面的内容进行二次替换更新&#xff0c;在处理完后&…

【深度学习】图像超分辨

案例 7&#xff1a;图像超分辨 相关知识点&#xff1a;生成对抗网络、图像处理&#xff08;PIL&#xff09;和可视化&#xff08;matplotlib&#xff09; 1 任务目标 1.1 任务和数据简介 ​ 本次案例将使用生成对抗网络来实现 4 倍图像超分辨任务&#xff0c;输入一张低分辨…

搭建基于Hexo的个人博客,以及git相关命令

全文写完之后的总结 测试命令 hexo clean hexo g hexo s 上传到服务器命令 hexo clean hexo g hexo d 上传到服务器&#xff08;如果上一个命令用不了&#xff09;&#xff0c;也要先hexo clean,hexo g git init git add . git commit -m "first commit" git p…

.NET i18n 多语言支持与国际化

环境 WIN10 VS2022 .NET8 1.&#x1f44b;创建项目 2.&#x1f440;创建Resources Controllers HomeController.en.resx HomeController.fr.resx HomeController.zh.resx 3.&#x1f331;Program.cs添加国际化支持 // 添加国际化支持 builder.Services.AddLocalization(…

【OTA】STM32新能源汽车OTA技术ymodem协议PC串口升级过程

【OTA】STM32新能源汽车OTA技术ymodem协议PC串口升级过程 文章目录 前言一、实验工具1.串口USB线——烧录APP2生成的BIN文件2.STLINK——烧录BOOT代码和APP1代码3.烧录工具——将BIN文件烧录到单片机中4.FLYMCU——清除芯片FLASH 二、硬件绘制1.原理图2.PCB 三、软件配置1.BOOT…

【GD32】MQ-3酒精检测传感器

2.31 MQ-3酒精检测传感器 MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn0)。当传感器所处环境中存在酒精蒸气时&#xff0c;传感器的电导率随空气中酒精蒸气浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。…

设计模式代码实战-装饰者模式

1、问题描述 小明喜欢品尝不同口味的咖啡&#xff0c;他发现每种咖啡都可以加入不同的调料&#xff0c;比如牛奶、糖和巧克力。他决定使用装饰者模式制作自己喜欢的咖啡。 请设计一个简单的咖啡制作系统&#xff0c;使用装饰者模式为咖啡添加不同的调料。系统支持两种咖啡类型…

【Vue + keep-alive】路由缓存

一. 需求 列表页&#xff0c;n 条数据项可打开 n 个标签页&#xff0c;同时1条数据项的查看和编辑共用一个标签页。如下所示&#xff1a; 参考 // 主页面 // 解决因 路由缓存&#xff0c;导致 编辑后跳转到该页面 不能实时更新数据 onActivated(() > {getList() })二. 实现…

ISP图像处理pipeline简介1

ISP 是什么&#xff1f; ISP (Image Signal Processor)&#xff0c;图像信号处理器&#xff0c;是用于摄影和视频处理的一种专用芯片。它是用来干什么的呢&#xff1f;简单说就是用来将图像传感器&#xff08;CCD, CMOS&#xff09;信号转化成可视的信号的功能&#xff0c;这里…

基于Docker构建CI/CD工具链(八)用nginx收集测试报告

当前&#xff0c;我们已经介绍了如何使用 Apifox 和 JMeter 进行测试&#xff0c;尽管控制台已经输出了测试结果&#xff0c;但在实际工作中&#xff0c;我们通常需要更详细的测试报告。 测试报告在测试过程中已经生成&#xff0c;只需将其托管起来以便查阅。如果你有现成的 C…

【opencv】示例-minarea.cpp 如何寻找一组随机生成的点的最小外接矩形、三角形和圆...

// 包含OpenCV库的高GUI模块和图像处理模块的头文件 #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp"// 包含标准输入输出流的头文件 #include <iostream>// 使用命名空间cv和std&#xff0c;这样我们就可以直接使用OpenCV和标准库的…

【Sql Server】锁表如何解锁,模拟会话事务方式锁定一个表然后进行解锁

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建表模拟…

11 Php学习:函数

PHP 内建函数Array 函数 PHP Array 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。 创建 PHP 函数 当您需要在 PHP 中封装一段可重复使用的代码块时&#xff0c;可以使用函数。下面详细解释如何创建 PHP 函数并举例说明。 创建 PHP 函数的语法 PHP 函数的基…

ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

anaconda创建了虚拟python环境,且安装了pytorch,但是pycharm中import torch运行时报错

报错如下&#xff1a; C:\Users\tashi\.conda\envs\test1\python.exe D:\project\python\transformer\main.py C:\Users\tashi\.conda\envs\test1\lib\site-packages\numpy\__init__.py:127: UserWarning: mkl-service package failed to import, therefore Intel(R) MKL init…

常用接口测试工具/免费api

一 接口编辑文档 常用的接口文档编写apipost 二 免费接口测试 api 1. thecat 含有&#xff1a; The Cat API - Cat as a Service The Cat API 2. public-apis 进入页面往下拉 三 常用接口测试工具 postman 四 常用接口性能测试工具 Jmeter&#xff0c;loadrunner

Java 基于微信小程序的校园失物招领小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

错题记录-华为海思

华为 海思数字芯片 参考 &#xff1a;FPGA开发/数字IC笔试系列(5) 华为海思IC笔试解析 FPGA开发/数字IC笔试系列(6) 华为海思IC笔试解析 SystemVerilog Function与Task的区别 $readmemh与$readmemb这两个系统任务是用来从指定文件中读取数据到寄存器数组或者RAM、ROM中。除了…

【opencv】示例-peopledetect.cpp HOG(方向梯度直方图)描述子和SVM(支持向量机)进行行人检测...

// 包含OpenCV项目所需的objdetect模块头文件 #include <opencv2/objdetect.hpp> // 包含OpenCV项目所需的highgui模块头文件&#xff0c;用于图像的显示和简单操作 #include <opencv2/highgui.hpp> // 包含OpenCV项目所需的imgproc模块头文件&#xff0c;用于图像…