Redis(主从复制)

目录

一 为什么要有主从 Redis

二 主从模式

1. 什么是主从模式?

2. 相关操作

3. 查看主从信息:

4. 断开与主节点的关系:

5. 主从结构:

6. 建立主从结构流程:

7. 全量/增量复制流程:

1. 全量复制

2. 增量复制

3. 实时复制


一 为什么要有主从 Redis

如果采用单机部署 Redis 服务,必然面临以下几种情况:

1. 单机可用的硬件资源有限。

2. 单机程序奔溃,无其他服务器代替,也就是可用性低。

所以引入了多台主机来部署 Redis 服务,比如一个主 Redis ,多个从 Redis 服务,从 Redis 只读,主 Redis 可读可写。引入更多的硬件资源,可用性也更高。 

二 主从模式

1. 什么是主从模式?

顾名思义:部署多台 Redis 服务器,并选择一个为主 Redis 服务器,其他为从 Redis 服务器。

特点:

  • 从节点的数据必须从主节点同步过来
  • 从节点只能读,主节点可读可写
  • 某个从节点挂了,不影响从其他节点读取数据和写数据
  • 主节点挂了,不能写数据,从节点读的数据可能是旧的

引入主从模式在读的场景下能提高硬件资源数量和可用性,比如某个服务挂了,依旧能从其他节点读数据,但主节点挂了就不会更新新的数据了。

在写的情况下,虽然引入的多台主机,但写只在一个主服务器操作,压力并没有分摊,所以写的情况没有提高,但在常见的场景中,读的频率往往比写的频率更高。

2. 相关操作

这里在单台主机模拟多个 redis 服务。

首先让 redis 启动不同的服务:把 redis.conf 配置文件拷贝一份(/etc/redis/redis.conf),在把里面的端口号换一下,然后在底部额外添加 slaveof 主IP地址 端口号。从 Redis 节点前置工作就完成了。

下一步: Redis-server (拷贝后的配置文件) 启动从 Redis 服务。

下面来看看效果:

很显然主 Redis 节点写入数据立马就会同步给从 Redis 节点,但从 Redis 节点写入数据是不允许的。

3. 查看主从信息:
// 客户端执行
info replication

主节点:

# Replication
// 主节点
role:master
// 挂着 2 个从节点
connected_slaves:2// 从节点 1          端口号    状态          同步数据的进度  延时
slave0:ip=127.0.0.1,port=6380,state=online,offset=2436891,lag=0
// 从节点 2
slave1:ip=127.0.0.1,port=6381,state=online,offset=2436891,lag=1// 主节点状态
master_failover_state:no-failover
// 主节点身份标识
master_replid:557ed200b79e6c6ef04630a5665b3d0db36db83c
// 备用主节点身份标识
master_replid2:0000000000000000000000000000000000000000
// 主节点最新数据的进度
master_repl_offset:2436891
// 备用主节点最新数据的进度
second_repl_offset:-1// 部分同步信息
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1369481
repl_backlog_histlen:1067411

从节点:

# Replication// 从节点
role:slave// 主节点 IP
master_host:127.0.0.1
// 主节点端口号
master_port:6379// 主节点状态
master_link_status:up
// 上一次和主节点通信的间隔 (秒)
master_last_io_seconds_ago:6
// 是否在同步数据
master_sync_in_progress:0// 读取主节点的数据但还没处理的数据
slave_read_repl_offset:1097259
// 同步主节点的实际数据
slave_repl_offset:1097259
// 优先级
slave_priority:100
// 只读
slave_read_only:1
// 节点信息是否暴露给客户端
replica_announced:1
// 从节点挂着几个从节点
connected_slaves:0// 以下和主节点一样
master_failover_state:no-failover
master_replid:557ed200b79e6c6ef04630a5665b3d0db36db83c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1097259
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:40895
repl_backlog_histlen:1056365
4. 断开与主节点的关系:
// 客户端执行
slaveof no one

该方法是临时的,重启 Redis 服务还是会读取原来的配置文件相关的信息,所以可用修改配置文件重启 Redis 来持久的断开与主节点的关系。

5. 主从结构:

之前说了如果写情况比较多,主节点压力就会大,这时候可用关闭 AOF 持久化到磁盘的操作,让从节点开启,当主节点挂了则让主节点读取从节点的 AOF 文件保持最新进度的数据。

如果是一主多从,主节点每次修改数据则会同步到多个从节点上,带宽会随着从节点的数量增加,这时候可以让从节点挂着其他的从节点,不必让主节点挂所有的主节点,也就是把带宽分摊到了其他的从节点了,但同步的进度会比主节点直接打到所有从节点慢,毕竟同步会经过每个从节点到达最后的叶子从节点中间多套了几个从节点,所以根据不同的场景来决定选择不同的主从结构来适配。

总结:

  • 延时小,主节点挂着所有的从节点
  • 带宽少,主节点挂部分从节点,从节点挂剩下的从节点。
6. 建立主从结构流程:

1. 首先从节点保存主节点相关的信息(IP地址,端口号)。

2. 随后发起 TCP 三次握手(验证内核发从/接收的能力)。

3. 然后检测主节点是否能正常工作(验证主节点应用层是否正确提供服务)。

4. 输入主节点的密码。

5. 以上是前置工作,完成之后就会把主节点的所有数据全量同步到从节点。

6. 后续主节点数据的变化会增量同步给从节点。

7. 全量/增量复制流程:

前置:从节点会定期自动向主节点发送 psync 命令同步最新的数据。

1. 全量复制

1. 第一步先向主节点发送 psync 命令,必须携带 replicationid(主节点ID) 和 offset(偏移量:数据同步进度),全量复制一般是从节点首次向主节点请求,并不知道主节点的 replicationid,偏移量也不知道,所以先获取主节点相关信息。

2. 主节点返回自己的 replicationid,并携带 全量复制的标识(可能是增量复制)。

3. 获取到主节点信息,并保存在从节点内部。

4. 主节点开始生成 RDB 文件(AOF 也行),并放入缓冲区,之前的 RDB 可能是旧的。

5. 生成后的 RDB 文件发送到从节点。

6. 这里生成和传输的过程可能有新的写数据,这些新的写数据也会同步到缓冲区并发送过去。

7. 从节点接收完成。

8. 从节点把原始数据清空,并导入收到的 RDB 文件和后续的数据。

9. 如果开启 AOF ,则更新 AOF 文件。

上述主节点会生成 RDB 文件发送给从节点,能不能不生成 RDB 文件直接把数据发送过去?

传统的 RDB 会把数据刷到磁盘,Redis 提供了一种无硬盘模式,内存中生成的 RDB 文件不刷回磁盘直接发送到从节点,少了刷盘的次数,也提高了效率。

同理从节点收到 RDB 文件也不需要刷屏,直接写入即可。

2. 增量复制

上述提到的全量复制是发生在最开始建立主从关系的时候发生全量复制的场景,如果由于网络波动,从节点向主节点获取数据,主节点无响应,从节点认为主节点挂了,可能自己提升成主节点,待后续真正的主节点恢复过来,提升后的主节点会变回原来的从节点并向主节点拉取增量数据。

1. 当从节点发现主节点不能反馈自己,比如网络抖动等原因。

2. 主节点在断开的期间不能把数据同步给从节点,这期间可能会收到不同的读情况,主节点就会把新的数据放到积压缓冲区,也就是上面提到的 info repliaction 列出的选项。

3. 当主节点恢复过来,从节点重新和主节点建立联系.

4. 从节点这时可以向主节点 psync 进行拉取数据,首先比对 replicationid 是不是和主节点一致,不一致则全量复制,否则查看 offset 是否只缺少主节点挤压缓冲区的数据,是就增量同步,否则全量同步。

5. 主节点返回 psync 的标识(增量复制:Continue)。

6. 主节点返回挤压缓冲区内的数据个从节点,从节点并缓存,此时双方数据同步进度达到一致性。

3. 实时复制

除上述全量/增量复制会发生在刚构建主从关系和与主节点断开会发生从节点向主节点发送 psync 命令来拉取数据。

正常情况下主从已经联通了后续,主节点收到数据就会发送到从节点进行同步。

如何检测主从是否一直处于联通状态?

 心跳包机制:

主节点会定期向从节点发送 ping ,从节点也会向主节点发送 ping,来标识连通性,如果超过超时的阈值则会断开。

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

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

相关文章

算法与数据结构实战技巧:从复杂度分析到数学优化

算法与数据结构实战技巧:从复杂度分析到数学优化 引言:为什么算法能力决定你的代码“天花板” 作为程序员,你是否曾遇到这样的困惑:同样是处理数据,别人的代码能轻松扛住10万并发请求,而你的系统在1万数据量…

vue3中 ref() 和 reactive() 的区别

在 Vue 3 中,ref() 和 reactive() 是两种核心的响应式 API,用于创建和管理响应式数据。它们各有适用场景,理解它们的区别和用法对开发至关重要。以下是详细对比和示例:1. ref() 的用法1.1 基本概念ref() 用于创建一个响应式引用&a…

告别加班!这款Axure移动端元件库,让你原型效率提升300%

一、 产品概述 这是一套专为 Axure RP 9/10/11 设计的高质量、高保真移动端(APP)组件库。它旨在帮助产品经理、UI/UX 设计师和交互设计师快速、高效地绘制出美观且交互丰富的移动端原型,极大提升设计效率和原型保真度。 二、 核心内容与特点…

深入理解synchronized:从使用到原理的进阶指南

目录 一、核心机制深度解析 1. 对象头(Object Header)与Mark Word的奥秘 2. Monitor:同步的实质 二、锁升级的全过程与底层操作 1. 无锁 -> 偏向锁 2. 偏向锁 -> 轻量级锁 3. 轻量级锁 -> 重量级锁 三、高级话题与实战调优 …

4.1 - 拖链电缆(柔性电缆)与固定电缆

本文介绍固定电缆和拖链专用线缆的对比、以及使用注意事项。尤其是在伺服的电缆选型上,一定要注意。总结成两点:1). 在移动场合,一定要选用拖链电缆,不要用普通电缆去代替,否则很快就会损坏,甚至造成安全隐…

S32K3平台eMIOS 应用说明

S32K3 系列 eMIOS 介绍 1.1 资源介绍 该设备具有 3 个 eMIOS 模块,每个模块的配置如表 1.1 所示。1.2 功能介绍 eMIOS 提供了用于生成或测量时间事件的功能。它使用 UCs,您可以为不同的芯片应 用中的不同功能进行编程。此外,eMIOS 体系结构允…

Next.js中服务器端渲染 (SSR) 详解:动态内容与 SEO 的完美结合

Next.js中服务器端渲染 (SSR) 详解:动态内容与 SEO 的完美结合 作者:码力无边在上一篇文章中,我们深入探讨了静态站点生成 (SSG) 的强大之处,它通过在构建时预先生成页面,为用户提供了极致的访问速度。但现实世界是动态…

c# winform 使用DevExpress制作表格

环境配置创建c# winform 新项目 test_devexpress添加引用把DevExpress.XtraGrid.v17.1.dll拖到工具箱在界面中&#xff0c;加入2个 GridControl设计器代码&#xff1a;namespace test_devexpress {partial class Form1{/// <summary>/// 必需的设计器变量。/// </summ…

数据库之间如何同步

数据库之间如何同步&#xff1a;三种高效方法详解 数据同步无小事&#xff0c;选对方法事半功倍 在现代数据驱动的环境中&#xff0c;​​数据库之间如何同步​​是确保业务连续性和数据一致性的核心技术。本文将深入介绍三种主流的数据库同步方法&#xff0c;帮助您根据实际需…

《我的世界》中实现强化学习(RL)算法

在《我的世界》中实现强化学习&#xff08;RL&#xff09;是一个巨大的挑战&#xff0c;而奖励函数&#xff08;Reward Function&#xff09;的设计是其中最核心、最困难的部分&#xff0c;直接决定了算法能否成功学习。 下面我将为你提供一个系统的设计框架、策略和注意事项。…

智能光场:深度学习重构计算光学成像新范式!

1.掌握深度学习算法的原理和应用&#xff0c;剖析计算成像主流研究范围及关联的统一计算范式&#xff0c;能够运用深度学习技术对光学成像系统进行创新设计和优化。2.掌握利用深度学习从成像设备优化设计、典型计算成像任务以及后端的计算机视觉任务的认知框架&#xff0c;并掌…

深入理解 MyBatis-Plus 的 QueryWrapper:动态 SQL 构建的利器

关键词&#xff1a;MyBatis-Plus、QueryWrapper、动态 SQL、Java、ORM 一、引言 在 Java 后端开发中&#xff0c;MyBatis-Plus&#xff08;简称 MP&#xff09;作为 MyBatis 的增强工具&#xff0c;极大地简化了 CRUD 操作。而其中最核心的功能之一&#xff0c;就是动态 SQL 的…

WMIC用法

WMIC用法基本语法结构1. 全局开关&#xff08;可选&#xff0c;控制整体行为&#xff09;2. 别名&#xff08;Alias&#xff09;3. 动词&#xff08;Verb&#xff09;4. 参数&#xff08;可选&#xff09;常用示例帮助命令WMIC&#xff08;Windows Management Instrumentation …

Spring Boot--yml配置信息书写和获取

案例&#xff1a;Spring Boot整合Mybatis步骤一&#xff1a;导入依赖步骤二&#xff1a;添加数据库需要的数据源配置步骤三&#xff1a;编写实体类步骤四&#xff1a;创建mapper类&#xff0c;操作数据库步骤五&#xff1a;创建Service接口和接口实现类步骤六&#xff1a;创建C…

创作纪念日·512天

嘿嘿&#xff0c;不知不觉间&#xff0c;已经到了512天创作纪念日了。 回忆 遥想我在《我的创作纪念日》一篇中写道&#xff0c;想要改名为 十二 &#xff0c;作为对过去生活的怀念&#xff0c;没想到这个名字被抢了&#xff0c;好可惜。 想到25年4月13日写纪念日博客时的自己…

在 Berachain 上,如何通过 BERA 实现一鱼多吃?

Berachain 的 PoL&#xff08;Proof of Liquidity&#xff09;机制是其最具辨识度的创新之一。通过将 DeFi 的激励逻辑深度嵌入共识层&#xff0c;不仅为底层网络注入了充足的流动性&#xff0c;保障了安全性&#xff0c;同时也有效推动了生态应用的增长&#xff0c;更为用户创…

LangGraph和aiagent

1. LangGraph&#xff1a;用图思维重构Agent工作流LangGraph是LangChain团队开源的图式Agent编排框架&#xff0c;它基于"有向图"模型&#xff0c;将Agent的运行流程抽象为"节点 状态流转"。其核心设计理念是用有向状态图&#xff08;Directed State Grap…

《从iptables到ipvs:云原生网络转发的性能拐点突破》

这套基于Spring Cloud Alibaba搭建的架构,部署于阿里云ACK集群的10个4核8G节点上,默认配置6个Pod副本,搭配HPA弹性扩缩容机制与Ingress网关流量分发,理论上具备应对3倍日常流量的承载能力。然而实际运行中,每日早9点、午2点、晚8点三次流量峰值来临时,订单服务会在120秒内…

大数据存储域——Kafka设计原理

摘要本文主要介绍了Kafka的架构原理、消息订阅模式以及在金融风控等领域的应用。Kafka作为数据中转站&#xff0c;可同步不同系统数据&#xff0c;支持事件驱动架构&#xff0c;广泛应用于金融支付与风控场景。其架构包括Producer、Broker、Topic、Partition、Replication、Mes…

[特殊字符] GitHub 热门开源项目速览(2025/09/09)

今天为大家整理了近期 GitHub 上热度较高的开源项目&#xff0c;涵盖 AI Agent、加密计算、操作系统、机器人、PDF 工具 等多个方向。让我们一起看看都有哪些值得关注的项目吧&#xff01; &#x1f539; AI Agents & 开发者工具 parlant &#xff08;⭐ 10.9k | ⬆️ 117…