Redis从入门到精通【进阶篇】之高可用主从详解

news2024/11/9 0:10:11

文章目录

  • 0.前言
  • 1.详解
    • 1.1 主从复制概述
    • 1.2 主从复制原理
    • 1.2.1.全量复制
    • 1.2.2.增量复制
    • 1.2.3.详细描述
    • 1.3 更深入理解
    • 1.4 常见面试题
  • 2. 总结
  • 3. Redis从入门到精通系列文章

在这里插入图片描述

0.前言

Redis是一个高性能的键值存储系统,广泛应用于Web应用、缓存、消息队列等领域。在实际应用中,为了保证Redis的高可用性,通常需要使用主从复制来进行数据备份和故障转移。本文将介绍Redis主从复制的概念、原理和实现方式,以及主从复制中的一些问题和解决方案。

1.详解

1.1 主从复制概述

主从复制是指将一个Redis实例(主服务器)的数据复制到其他Redis实例(从服务器)的过程。主服务器将自己的数据变化通过网络发送给从服务器,从服务器接收到数据后进行更新,从而保证从服务器的数据和主服务器的数据保持一致。主从复制可以实现数据备份、故障转移和读写分离等功能。

1.2 主从复制原理

主从复制分为全量复制和增量复制两种方式。全量复制是指从主服务器将整个数据集发送到从服务器,而增量复制则是指只发送主服务器的增量变化数据到从服务器。
image.png

1.2.1.全量复制

全量复制的流程如下:

(1)从服务器向主服务器发送SYNC命令,请求进行复制。

(2)主服务器接收到SYNC命令后,创建一个RDB文件,将当前的数据集保存到RDB文件中,并向从服务器发送RDB文件。

(3)从服务器接收到RDB文件后,将其保存到本地,并加载到内存中。

(4)主服务器将从SYNC命令到复制完成期间的所有写命令记录到内存缓冲区中,并在复制完成后将这些写命令发送给从服务器。

(5)从服务器接收到写命令后,执行这些命令,更新自己的数据集。
image.png

主节点的打印日志如下:
image.png

从节点打印日志如下图所示:
image.png

1.2.2.增量复制

增量复制的流程如下:

(1)从服务器向主服务器发送PSYNC命令,请求进行复制。

(2)主服务器记录从服务器复制的偏移量,并将从这个偏移量开始的所有写命令发送给从服务器。

(3)从服务器接收到写命令后,执行这些命令,更新自己的数据集。
我们搞个图,更直观的理解一下。
Redis增量复制的流程图:
image.png

1.2.3.详细描述

首先,从服务器向主服务器发送PSYNC命令,请求进行复制。PSYNC命令包含两个参数:一个是复制的标识符,用于标识从服务器当前的复制状态;另一个是复制的偏移量,用于指定从哪个位置开始进行复制。在PSYNC命令中,如果标识符为0,表示从服务器是第一次进行复制,主服务器会进行全量复制;如果标识符不为0,表示从服务器已经进行过复制,主服务器会根据标识符和偏移量进行增量复制。

接下来,主服务器记录从服务器复制的偏移量,并将从这个偏移量开始的所有写命令发送给从服务器。主服务器在记录从服务器复制的偏移量时,有两个偏移量需要记录:一个是主服务器最后一次执行的命令的偏移量,另一个是主服务器最后一次执行的命令的复制偏移量。主服务器会将这两个偏移量发送给从服务器,从服务器接收后将其存储在自己的内存中。

从服务器接收到写命令后,执行这些命令,更新自己的数据集。在执行写命令期间,从服务器会不断地将执行的命令的偏移量发送给主服务器,以便主服务器随时记录从服务器的复制进度。此外,如果从服务器在执行写命令时发生了错误,主服务器会根据之前记录的复制进度,重新发送最近的命令,以保证主从数据的一致性。

需要注意的是,增量复制的过程中可能会出现延迟,这是因为主服务器需要缓存一定数量的写命令才会一次性发送给从服务器。如果从服务器在一段时间内没有接收到新的写命令,就会认为主服务器已经断开连接或者出现了故障,从而触发故障转移。此外,增量复制也可能出现主从数据不一致的情况,比如主从服务器之间的网络延迟、主从服务器的时钟不同步等问题。为了避免这些问题,我们需要采用一些额外的措施,如定期检查主从数据的一致性、使用时间戳和序列号等方式保证主从服务器的时钟同步等。

在图中,Master表示主服务器,Slave表示从服务器。从服务器向主服务器发送PSYNC命令,请求进行复制。主服务器记录从服务器复制的偏移量,并将从这个偏移量开始的所有写命令发送给从服务器。从服务器接收到写命令后,执行这些命令,更新自己的数据集。在执行写命令期间,从服务器会不断地将执行的命令的偏移量发送给主服务器,以便主服务器随时记录从服务器的复制进度。

1.3 更深入理解

1.当主服务器不进行持久化时复制的安全性

在主从复制中,当主服务器不进行持久化时,复制的安全性会受到影响。因为如果主服务器在发送数据之前崩溃,从服务器可能会丢失一些数据,从而导致数据不一致。因此,在使用主从复制时,最好将主服务器进行持久化。

2.为什么主从全量复制使用RDB而不使用AOF?

主从全量复制使用RDB而不使用AOF的原因是因为RDB文件是一个快照,包含了Redis实例的整个数据集,它可以很快地恢复Redis实例的数据,而AOF文件只记录了Redis实例的增量操作,恢复数据需要重新执行所有操作,速度较慢。

3.为什么还有无磁盘复制模式?

无磁盘复制模式是指从服务器不需要将主服务器的数据保存到本地磁盘上,而是直接将数据保存到内存中,这样可以减少磁盘I/O的开销,提高复制效率。但是,由于从服务器不进行持久化,如果从服务器崩溃或者重启,数据可能会丢失。

4.为什么还会有从库的从库的设计?

从库的从库设计是为了实现更高的可用性和更好的性能。将从服务器作为主服务器的从服务器,可以构建一个多层级的主从架构,从而提高系统的容错能力和性能。

5.读写分离及其中的问题

读写分离是指将读操作和写操作分离到不同的Redis实例上,从而提高系统的性能和容错能力。但是,读写分离会带来一些问题,例如数据不一致、延迟等问题,需要进行一定的处理。
是的,读写分离可以提高Redis系统的性能和容错能力,但是也会带来一些问题和挑战。

1.4 常见面试题

1. 数据不一致

读写分离会将读操作和写操作分别发送到不同的Redis实例上,因此在进行写操作后,从库的数据不一定会立即更新,可能会存在一定的延迟。如果在这段延迟期间进行读操作,就会读取到旧的数据,导致数据不一致的问题。

解决方案
可以采用同步延迟、异步延迟、写完立即读、延迟刷新等策略,例如在写入数据后,通过命令等待从库同步完成后再进行读取操作;或者采用写完立即读的方式,即在写入数据后马上进行读取操作,保证数据的一致性;还可以定期刷新从库的数据,避免数据延迟过大。

2. 延迟问题

由于网络传输、数据同步等原因,从库的数据更新可能会存在一定的延迟,导致在进行读取操作时出现延迟问题,影响系统的性能和用户体验。

解决方案:可以采用主动刷新、被动刷新等策略,例如定期刷新从库的数据、在从库中设置较短的超时时间等,以保证数据的及时性和准确性。

3. 安全性问题

通常情况下从库的安全性其实也要很高,包括数据安全和环境安全。如果从库磁盘损坏也是会影响业务。如果从库被攻击,可能会导致主库的数据泄露,或者被篡改。因此需要采用一些安全措施来保证redis服务的存储安全和环境安全性。

解决方案
可以采用SSL加密、访问控制、数据加密等策略,例如使用SSL协议来保证数据传输的安全,或者在从库上设置密码、限制访问IP等来保证系统的安全性。

4. 故障切换问题

当主库出现故障时,需要将从库切换为新的主库,以确保系统的正常运行。但是,在进行切换时可能会存在数据不一致、丢失数据等问题。

解决方案
可以采用哨兵模式或者集群模式来实现故障切换(这个我们后续章节详细讲解),例如哨兵模式可以使用多个监控节点来监测主库的状态,并在主库出现故障时自动切换到从库;集群模式可以使用多个节点来实现数据的分布式存储,从而提高系统的可靠性和容错能力。

5. 延迟与不一致问题

在进行读写分离时,由于数据同步的延迟,可能会存在从库中数据不一致的问题,影响系统的性能和用户体验。

解决方案
这个只能是相对的解决方案,延迟是无法避免,这是由设计决定的。可以采用数据同步机制来避免延迟和数据不一致问题,例如使用增量复制机制来加快数据同步速度;或者在从库中使用缓存机制来减少读取延迟等,以提高系统的性能和可靠性。

2. 总结

读写分离需要注意解决故障切换、数据过期、延迟和不一致等问题,以保证系统的稳定性和可靠性。
在实际应用中,Redis主从复制是保证高可用性的重要手段之一。了解Redis主从复制的原理和实现方式,可以帮助我们更好地搭建和维护Redis集群,提高系统的稳定性和可靠性。

3. Redis从入门到精通系列文章

《Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解》
《Redis从入门到精通【高阶篇】之底层数据结构快表QuickList详解》
《Redis从入门到精通【高阶篇】之底层数据结构简单动态字符串(SDS)详解》
《Redis从入门到精通【高阶篇】之底层数据结构压缩列表(ZipList)详解》
《Redis从入门到精通【进阶篇】之数据类型Stream详解和使用示例》

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

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

相关文章

C++【STL】之priority_queue学习

优先级队列 优先级队列priority_queue也是STL库中容器适配器的一种,常用于进行数据优先级的处理,说到这儿是不是发现有些熟悉,没错它和我们之前讲解的堆本质上就是一个东西,底层都是数组存储的完全二叉树,它在STL库中…

零基础速成simulink代码生成——DBC文件CAN报文+stateflow 5

零基础速成simulink代码生成——DBC文件CAN报文+stateflow 5 上一篇文章中,已经实现将dbc文件进行代码生成,这边我们要实现一个功能,添加多几个can报文分时发送,结合statflow简单实现这个功能。 添加报文 我们还是选用相同的can报文添加 选中所有的模块,ctrl+c。 ctrl+…

InvPT++:用于视觉场景理解的倒金字塔多任务Transformer

文章目录 InvPT: Inverted Pyramid Multi-Task Transformer for Visual Scene Understanding摘要本文方法整体结构InvPT EncoderTask-Specific Preliminary DecodersStructure of InvPT DecodeUP-Transformer BlockCross-Scale Self-Attention: Fusion Attention and Selective…

团体程序设计天梯赛-练习集L1篇⑦

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

ChatGPT | LangChain的文本切割方法对比

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! ChatGPT面向对话格式的文本理解很好,但如果要把网络上的文章让ChatGPT直接分析则会有格式的问题。文本清洗是个大课题,讲起来需要很多篇幅,优化起来前路漫…

学习C++的意义

文章目录 前言意义软件方法论的发展面向对象的程序设计宽泛的意义 C到C的升级ubuntu安装g编译器总结 前言 C是一种强大而广泛应用的编程语言,具有广泛的用途和应用领域。无论你是计算机科学专业的学生、自学编程的爱好者,还是想要进一步提升编程技能的专…

在linux系统中如何设置定时任务

前言: 在linux日常运维过程中我们常常需要在指定时间段自动停止或启动某个服务我们不可能人为的手动去执行,这时候我们就可以给对应的任务设置一个定时。后面我就可以将周期性的、规则的工作交给定时任务去完成。 **一次性任务:**顾名思义就是…

SAP CAP篇七:为CAP添加Fiori Launchpad入口 (Sandbox环境)

本文目录 本系列之前的文章在现有代码基础上继续增强增强app文件夹文件 package.json文件夹appconfig文件fioriSandboxConfig.json文件 fiori.html更新Srv中的UiIndexContentProviderFactory 再次检查代码运行效果代码库 (Gitcode) 本系列之前的文章 本系列之前的文章&#xf…

javaWeb之cookiesession

1 回顾 1.1 response对象 一次响应封装对象,由服务器创建。使用response对象将服务器需要的数据发送给浏览器。 将数据存放response对象中,tomcat从response对象获得数据,根据数据组织http响应,最后将http响应内容发送给浏览器&…

CTF-Show密码学:ZIP文件密码破解【暴力破解】

萌新 隐写23 题目内容: 文件的主人喜欢用生日做密码,而且还是个90后。 一、已知条件 在这个题目中,我们有以下已知条件: 文件的主人喜欢用生日做密码 - 这个条件告诉我们,密码可能是一个八位的纯数字密码&#xff0c…

windows服务器——部署PKI与证书服务

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 学习导图 一.PKI 概念 1.PKI体系能够实现的功能 二.公钥加密技术 1.公钥加…

股票量化系统QTYX选股框架实战案例集|大盘跳水,上涨趋势票抗跌-230621

前言 “实战案例个股画像”系列是和大家分享我基于QTYX的选股框架,在实战中选股的应用案例,和大家一起见证QTYX选股框架逐步完善的过程,帮助大家更好地理解QTYX选股框架精髓。 关于QTYX的使用攻略可以查看链接:QTYX使用攻略 首先要…

C++ 面向对象(2)——继承

C 继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的数据成员和…

【Python】异常处理 ① ( 异常概念 | 异常处理 | 异常捕获 )

文章目录 一、Python 异常简介1、异常概念2、Python 异常示例 二、Python 异常处理1、异常处理简介2、代码实例 - 出现异常代码3、代码实例 - 出现异常并进行捕获处理 一、Python 异常简介 1、异常概念 Python 异常 是在程序运行过程中发生的错误或问题的表示 ; 出现异常可能会…

【软件设计师暴击考点】面向对象考点暴击系列

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件…

记录好项目D12

记录好项目 你好呀,这里是我专门记录一下从某些地方收集起来的项目,对项目修改,进行添砖加瓦,变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个房屋租赁系统 一、系统介绍 包括管理员、房东、租客三种角色&#…

【小沐学数据库】MongoDB下载、安装和入门(Python)

文章目录 1、简介2、下载和安装2.1 平台支持2.2 MongoDB Community Server2.3 MongoDB Shell2.4 MongoDB Compass2.5 pymongo库 3、概念3.1 数据库3.2 文档(Document)3.3 集合(Collection)3.4 元数据3.5 数据类型 4、Python代码测试4.1 连接数据库4.2 指…

kafka基础

文章目录 1、什么是消息队列?2、基础架构3、Kafka为什么快4、零拷贝5、Rebalance机制6、kafka如何避免重复消费7、避免消息丢失8、Kafka怎么实现消息的顺序消费9、什么是ISR10、Kafka文件存储机制 1、什么是消息队列? kafka是一个消息队列的中间件&…

ProGuard混淆及R8优化

前言:使用java编写的源代码编译后生成了对于的class文件,市面上很多软件都可以对class文件进行反编译,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。…

切底掌握Android中的Kotlin DSL

前言 在这篇文章中,我们将学习如何在您的 Android 项目中编写 Kotlin DSL。 这个文章会很长,所以花点时间,让我们一起来写你的 DSL。我们将讨论以下主题, 什么是简单英语中的 DSL?您使用任何 DSL 吗?为什…