保姆级教程:Redis 主从复制原理及集群搭建

news2025/1/22 17:53:28

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

文章目录

  • 一 什么是 Redis 主从复制❓
  • 二 Redis 主从集群搭建👊
  • 三 数据同步原理🙏
    • 3.1 全量同步✨
    • 3.2 增量同步 ✨

一 什么是 Redis 主从复制❓

简而言之就是一个节点负责写数据(主节点),其他节点负责读数据(从节点),采用负载均衡的集群方式,实现读写分离,更好的解决并发问题。

二 Redis 主从集群搭建👊

因为单节点 Redis 的并发能力是有上限的,要进一步提高 Redis 的并发能力,就需要搭建主从集群,实现读写分离。本篇实例架构图如下图所示:
在这里插入图片描述
一个主节点,两个从节点,我们现在 tmp 文件下创建三个文件夹,分别是 6001、6002、6003,文件名也就是我们 redis 服务的端口号,可自行随意定义。

➜  ~ mkdir tmp
➜  ~ cd tmp
➜  tmp mkdir 6001 6002 6003

如果你本地已经安装了 Redis,需要拷贝 Redis 的配置文件到上述三个文件夹下,我本地的 Redis 的配置文件在/usr/local/etc/redis.conf,当然也可以一键拷贝,

echo 6001 6002 6003 | xargs -t -n 1 cp /usr/local/etc/redis.conf

拷贝完成之后,需要分别修改配置文件中的以下内容:

(1)修改端口号

找到配置文件中port 6379 ,分别修改为port 6001,port 6002,port 6003

当然也可以一键修改

sed -i -e 's/6379/6001/g' 6001/redis.conf 
sed -i -e 's/6379/6002/g' 6002/redis.conf 
sed -i -e 's/6379/6003/g' 6003/redis.conf 

(2)修改工作目录

找到配置文件中的dir .目录,修改为dir /temp/6001

(3)声明 IP 地址

我们在每个配置文件中第一行写入 replica-announce-ip "127.0.0.1" ,其中127.0.0.1,你可以换成你本地 IP 地址,本行表示配置分布式系统或网络中的某个节点或副本的 IP 地址。

接下来,我们要开启主从配置

主从配置可使用replicaof或者slaveof命令,

replicaof <主机> <端口>
replicaof 127.0.0.1 6379
# 或者
slaveof <主机> <端口>
slaveof 127.0.0.1 6379

主从关系有两种模式,临时模式和永久模式

  • 永久模式

    在 redis.conf 中添加配置:slaveof

  • 临时模式

    使用 redis-cli 客户端连接到 redis 服务,执行 slaveof 或者 replicaof 命令(重启后生效)

slaveof<masterip> <masterport>

在本篇文章中我们采用临时模式

第一步:启动 Redis server 服务
开启三个命令窗口,分别执行以下命令

redis-server 6001/redis.conf
redis-server 6002/redis.conf
redis-server 6003/redis.conf

我们选择 6001 端口节点作为 master 节点,开启命令行窗口,连接 redis 服务,

#命令行窗口1
➜  ~ redis-cli -p 6002
127.0.0.1:6002>replicaof 127.0.0.1 6001
# 表示6001节点作为6002的master节点
#命令行窗口2
➜  ~ redis-cli -p 6003
127.0.0.1:6003>replicaof 127.0.0.1 6001
# 表示6001节点作为6003的master节点

# 建立主从关系后,可以进入6001客户端进行查看
#命令行窗口3
➜  ~ redis-cli -p 6001
127.0.0.1:6001>info replication

详细结果如下图,展示了当前节点为master节点,绑定了两个从节点,两个从节点均在线状态
在这里插入图片描述
此时我们在 master 节点中进行写数据

# 在主节点写入
127.0.0.1:6001>set num 123456
OK

#在从节点获取值
127.0.0.1:6002> get num
"123456"

127.0.0.1:6003>get num
"123456"

# 如果在从节点写入,则会报错
127.0.0.1:6002> set name zeng
(error) READONLY You can't write against a read only replica.

至此,Redis 主从集群就搭建完毕了。接下来我们来聊聊主从间数据是如何同步的

三 数据同步原理🙏

3.1 全量同步✨

主从第一次同步称为全量同步,那么 master 节点是如何判断从节点(slave)是第一次来同步数据的呢,这块有两个比较重要的概念:

  • Replication ld:简称 replid,是数据集的标记,id 一致则说明是同一数据集。每一个 master 都有唯一的 replid,slave 则会继承 master 节点的 replid

  • offset:偏移量,随着记录在 repl_baklog 中的数据增多而逐渐增大,slave 完成同步时也会记录当前同步的 offset。如果 slave 的 offset 小于 master 的 ofset,说明 slave 数据落后于 master,需要更新。

因此 slave 做数据同步,必须向 master 声明自己的 replication id 和 offset, master 才可以判断到底需要同步哪些数据。
在这里插入图片描述
全量同步流程可以概括为以下流程:

(1)slave 节点请求增量同步

(2)master 节点判断 replid,发现不一致,则拒绝增量同步

(3)master 将完整内存数据生成 RDB,发送 RDB 到 slave

(4)slave 清空本地数据,加载 master 的 RDB

(5) master 将 RDB 期间的命令记录在 repl_baklog,并持续将 log 中的命令发送给 slave

(6)slave 执行接收到的命令,保持与 master 之间的同步。

在这里插入图片描述
(上图中左图是从节点 slave,右图是 master 节点)

3.2 增量同步 ✨

主从第一次同步称为全量同步,但如果 slave 重启后同步,则执行增量同步。流程如下:

在这里插入图片描述

slave 提交自己的 offset 到 master,master 获取 repl_baklog 中从 offset 之后到命令给 slave。

思考🤔:slave 节点宕机恢复后可以找 master 节点同步数据,那么 master 节点宕机该怎么办呢?那么 Redis 哨兵就要闪耀登场了,请参考 Redis 哨兵相关文章。

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

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

相关文章

LabVIEW在高校电力电子实验中的应用

概述&#xff1a;本文介绍了如何利用LabVIEW优化高校电力电子实验&#xff0c;通过图形化编程实现参数调节、实时数据监控与存储&#xff0c;并与Simulink联动&#xff0c;提高实验效率和数据处理能力。 需求背景高校实验室在进行电机拖动和电力电子实验时&#xff0c;通常使用…

文献解读-肿瘤测序-第五期|《局部晚期或转移性儿童及青少年分化型甲状腺癌的基因特征与临床特征及131I疗效的关系》

关键词&#xff1a;应用遗传流行病学&#xff1b;群体测序&#xff1b;肿瘤测序&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;The relationship between genetic characteristics and clinical characteristics and the efficacy of 131I therapy in c…

opencv笔记(13)—— 停车场车位识别

一、所需数据介绍 car1.h5 是训练后保存的模型 class_directionary 是0&#xff0c;1的分类 二、图像数据预处理 对输入图片进行过滤&#xff1a; def select_rgb_white_yellow(self,image): #过滤掉背景lower np.uint8([120, 120, 120])upper np.uint8([255, 255, 255])#…

【YOLO系列】YOLOv10论文超详细解读(翻译 +学习笔记)

前言 研究AI的同学们面对的一个普遍痛点是&#xff0c;刚开始深入研究一项新技术&#xff0c;没等明白透彻&#xff0c;就又迎来了新的更新版本——就像我还在忙着逐行分析2月份发布的YOLOv9代码&#xff0c;5月底清华的大佬们就推出了全新的v10。。。 在繁忙之余&#xff0…

opencv进阶 ——(九)图像处理之人脸修复祛马赛克算法CodeFormer

算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型&#xff0c;由南洋理工大学和商汤科技联合研究中心联合开发&#xff0c;它能够接收模糊或马赛克图像作为输入&#xff0c;并生成更清晰的原始图像。算法源码地址&#xff1a;https://github.com/sczhou/CodeFormer…

深度学习论文: DINOv2: Learning Robust Visual Features without Supervision

深度学习论文: DINOv2: Learning Robust Visual Features without Supervision DINOv2: Learning Robust Visual Features without Supervision PDF: https://arxiv.org/abs/2304.07193 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://githu…

Transformer系列:注意力机制的优化,MQA和GQA原理简述

前言 多查询注意力(MQA)、分组查询注意力(GQA)是Transformer中多头注意力(MHA)的变种&#xff0c;它们大幅提高了解码器的推理效率&#xff0c;在LLaMA-2&#xff0c;ChatGLM2等大模型中有广泛使用&#xff0c;本篇介绍MQA、GQA的原理并分析其源码实现。 使用MQA&#xff0c;G…

Spring Boot前后端简单集成MinIo开发

Spring Boot前后端简单集成MinIo开发 源码地址重要配置和代码MinIO配置核心代码 最终效果 源码地址 minioStudy 重要配置和代码 MinIO配置 pom文件引入依赖 <!-- minio --> <dependency><groupId>io.minio</groupId><artifactId>minio</ar…

GaussDB的数种形态

GaussDB作为一种新兴的关系型数据库产品&#xff0c;似乎有点让人摸不着头脑。有朋友问我GaussDB单机版怎么样&#xff0c;有人说GaussDB是分布式数据库&#xff0c;还有人说它是云数据库&#xff0c;还有人会把GaussDB和华为的数据仓库GaussDB DWS混为一谈。确实&#xff0c;公…

AD域渗透链和工具推荐

xmind下载地址&#xff1a; 链接: https://pan.baidu.com/s/1_BsmqLvN6aBnan0AIk5iBA 提取码: j97j

笔记 | 软件工程02:软件工程概述

1 软件工程产生背景 1.1 历史发展 1960s的个体作坊式软件开发带来的问题 1.2 软件开发需要解决的问题 代码规模增长带来的影响&#xff1a; 1.3 软件开发面临的挑战 指挥信息系统中的软件&#xff1a;规模大、质量要求高 装备中嵌入式软件系统&#xff1a;规模大、质量要求…

【MySQL数据库】索引与事务

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【MySQL】探秘&#xff1a;数据库世界的瑞士军刀 目录 &#x1f5f3;️一.索引 &#x1f4ee;1.工作原理 &#x1f4ec;2.类型 &#x1f4ed;3.作用 &#x1f4ea;4.优缺点 &#x1f4eb;5.使用…

一维时间序列突变检测方法(小波等,MATLAB R2021B)

信号的突变点检测问题是指在生产实践中&#xff0c;反映各种系统工作状态的信号&#xff0c;可能因为受到不同类型的噪声或外界干扰而发生了信号突变&#xff0c;导致严重失真的信号出现&#xff0c;因此必须探测突变出现的起点和终点。研究目的在于设计出检测方案&#xff0c;…

python-字符替换

[题目描述] 给出一个字符串 s 和 q 次操作&#xff0c;每次操作将 s 中的某一个字符a全部替换成字符b&#xff0c;输出 q 次操作后的字符串输入 输入共 q2 行 第一行一个字符串 s 第二行一个正整数 q&#xff0c;表示操作次数 之后 q 行每行“a b”表示把 s 中所有的a替换成b输…

docker 存储 网络 命令

文章目录 1 docker存储1.1 目录挂载2.1卷映射2.1.1卷映射和目录挂载的区别2.1.2卷映射的使用 2 docker网络2.1查看docker的默认网络2.2查看容器的IP2.3容器互通2.4自定义网络2.4.1 创建自定义网络2.4.2创建容器的时候加入到自定义的网络2.4.3使用域名进行容器之间的访问2.4.4re…

小米路由器如何设置去广告功能,如何设置小米路由器的自定义Hosts(小米路由器如何去除小米广告、去除小米电视盒子开屏广告、视频广告)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现方案 📒📝 操作步骤📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 小米设备的广告一直是用户头疼的问题,无论是开屏广告、应用内广告还是系统广告,都影响了用户体验。本文将详细介绍如何通过小米路由器实现去除广告…

低代码设计中的组织结构的作用与模式

一、组织结构的作用 在低代码设计中&#xff0c;组织结构是系统运作的基石&#xff0c;它定义了系统中的关键元素&#xff0c;包括人员、部门、角色&#xff0c;以及一人多部门、一人多部门多角色的复杂关系。这种定义不仅为系统提供了清晰的运行框架&#xff0c;还确保了系统…

学生问的一道CSS3媒体查询,实现响应式设计的题

目录 题目要求&#xff1a; 解题思路&#xff1a; 解题&#xff1a; 1&#xff09;大屏、3个DIV水平排列 2&#xff09;中屏、前2个DIV水平占一半&#xff0c;第三个另起一行&#xff0c;宽度占满 3&#xff09;小屏&#xff0c;3个DIV铺满&#xff0c;垂直排列 题目要求&…

深入理解计算机系统 家庭作业5.13

A:关键路径在xmm0那条路,书中几条关键路径全部是xmm0,有xmm1时,xmm1也是 B:3 C:1 D:按书中的定义: 关键路径才是下界!按书上的方法根据 图5-12 算出关键路径的CPE即可. 非关键路径把它视为黑盒子.因为是乱序和超标量的,没办法搞清楚处理器具体怎么处理这些指令.

17、Spring系列-SpringMVC-请求源码流程

前言 Spring官网的MVC模块介绍&#xff1a; Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就已包含在Spring框架中。正式名称“ Spring Web MVC”来自其源模块的名称&#xff08;spring-webmvc&#xff09;&#xff0c;但它通常被称为“ Spring MVC…