Java开发大厂面试第22讲:Redis 是如何保证系统高可用的?它的实现方式有哪些?

高可用是通过设计,减少系统不能提供服务的时间,是分布式系统的基础也是保障系统可靠性的重要手段。而 Redis 作为一款普及率最高的内存型中间件,它的高可用技术也非常的成熟。

我们今天分享的面试题是,Redis 是如何保证系统高可用的?它的实现方式有哪些?

Redis通过一系列策略和技术来保证其系统的高可用性。以下是Redis保证高可用的主要实现方式:

  1. 持久化

    • RDB (Redis DataBase):在指定的时间间隔内将内存中的数据集快照写入磁盘,它执行的是全量数据备份,恢复时是将快照文件直接读到内存里。
    • AOF (Append Only File):以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),在Redis启动之初会重新执行文件中记录的写指令来恢复数据。AOF日志是一个只进行追加的日志文件,因此写入性能也非常高,而且文件不容易破损。
  2. 主从复制(Master-Slave)

    • 主从复制是Redis实现高可用的基础,它的原理是将一台Redis服务器的数据,复制到其他的Redis服务器。主节点(Master)处理写请求,并将数据同步给从节点(Slave),从节点处理读请求。当主节点故障时,可以通过选举算法从从节点中选举出新的主节点。
  3. 哨兵(Sentinel)

    • 哨兵是一个独立的进程,用于监控主从集群的运行状态。当主节点故障时,哨兵会执行自动故障转移,将其中一个从节点提升为主节点,从而保证系统的高可用性。同时,哨兵还可以监控Redis的持久化情况,如果持久化出现故障,则通知管理员。
  4. Redis集群(Cluster)

    • Redis集群实现了Redis数据的分片,每个节点只保存一部分数据。集群通过哈希槽(Hash Slot)来分配数据,每个节点都负责一部分哈希槽。当节点故障时,集群会自动将数据重新分配到其他节点上,从而保证数据的高可用性。
  5. 读写分离

    • 在主从复制的基础上,配合读写分离策略,可以进一步提高Redis的并发处理能力。通常主节点负责写请求,而从节点负责读请求。这样可以减轻主节点的负载压力,提高系统的整体性能。
  6. 使用代理工具

    • 如Twemproxy、Codis等代理工具可以实现Redis的负载均衡和故障转移。这些工具将多个Redis实例组成一个集群,客户端通过代理工具来访问Redis集群,代理工具负责将请求分发到合适的Redis实例上。

典型回答

Redis 高可用的手段主要有以下四种:

  • 数据持久化
  • 主从数据同步(主从复制)
  • Redis 哨兵模式(Sentinel)
  • Redis 集群(Cluster)

其中数据持久化保证了系统在发生宕机或者重启之后数据不会丢失,增加了系统的可靠性和减少了系统不可用的时间(省去了手动恢复数据的过程);而主从数据同步可以将数据存储至多台服务器,这样当遇到一台服务器宕机之后,可以很快地切换至另一台服务器以继续提供服务;哨兵模式用于发生故障之后自动切换服务器;而 Redis 集群提供了多主多从的 Redis 分布式集群环境,用于提供性能更好的 Redis 服务,并且它自身拥有故障自动切换的能力。

考点分析

高可用的问题属于 Redis 中比较大的面试题了,因为很多知识点都和这个面试题有关,同时也属于比较难的面试题了。因为涉及了分布式集群,而分布式集群属于 Redis 中比较难懂的一个知识点。和此问题相关的面试题还有以下几个:

  • 数据持久化有几种方式?
  • Redis 主从同步有几种模式?
  • 什么是 Redis 哨兵模式?它解决了什么问题?
  • Redis 集群的优势是什么?

知识扩展

1.数据持久化

持久化功能是 Redis 和 Memcached 的主要区别之一,因为只有 Redis 提供了此功能。

在 Redis 4.0 之前数据持久化方式有两种:AOF 方式和 RDB 方式。

  • RDB(Redis DataBase,快照方式)是将某一个时刻的内存数据,以二进制的方式写入磁盘。
  • AOF(Append Only File,文件追加方式)是指将所有的操作命令,以文本的形式追加到文件中。

RDB 默认的保存文件为 dump.rdb,优点是以二进制存储的,因此占用的空间更小、数据存储更紧凑,并且与 AOF 相比,RDB 具备更快的重启恢复能力。

AOF 默认的保存文件为 appendonly.aof,它的优点是存储频率更高,因此丢失数据的风险就越低,并且 AOF 并不是以二进制存储的,所以它的存储信息更易懂。缺点是占用空间大,重启之后的数据恢复速度比较慢。

可以看出 RDB 和 AOF 各有利弊,RDB 具备更快速的数据重启恢复能力,并且占用更小的磁盘空间,但有数据丢失的风险;而 AOF 文件的可读性更高,但却占用了更大的空间,且重启之后的恢复速度更慢,于是在 Redis 4.0 就推出了混合持久化的功能。

混合持久化的功能指的是 Redis 可以使用 RDB + AOF 两种格式来进行数据持久化,这样就可以做到扬长避短物尽其用了,混合持久化的存储示意图如下图所示:

image (1).png

我们可以使用“config get aof-use-rdb-preamble”的命令来查询 Redis 混合持久化的功能是否开启,执行示例如下:

127.0.0.1:6379> config get aof-use-rdb-preamble
1) "aof-use-rdb-preamble"
2) "yes"

如果执行结果为“no”则表示混合持久化功能关闭,不过我们可以使用“config set aof-use-rdb-preamble yes”的命令打开此功能。
Redis 混合持久化的存储模式是,开始的数据以 RDB 的格式进行存储,因此只会占用少量的空间,并且之后的命令会以 AOF 的方式进行数据追加,这样就可以减低数据丢失的风险,同时可以提高数据恢复的速度。

2.Redis 主从同步

主从同步是 Redis 多机运行中最基础的功能,它是把多个 Redis 节点组成一个 Redis 集群,在这个集群当中有一个主节点用来进行数据的操作,其他从节点用于同步主节点的内容,并且提供给客户端进行数据查询。

Redis 主从同步分为:主从模式和从从模式。主从模式就是一个主节点和多个一级从节点,如下图所示:

image (3).png

从从模式是指一级从节点下面还可以拥有更多的从节点,如下图所示:

image (4).png

主从模式可以提高 Redis 的整体运行速度,因为使用主从模式就可以实现数据的读写分离,把写操作的请求分发到主节点上,把其他的读操作请求分发到从节点上,这样就减轻了 Redis 主节点的运行压力,并且提高了 Redis 的整体运行速度。

不但如此使用主从模式还实现了 Redis 的高可用,当主服务器宕机之后,可以很迅速的把从节点提升为主节点,为 Redis 服务器的宕机恢复节省了宝贵的时间。

并且主从复制还降低了数据丢失的风险,因为数据是完整拷贝在多台服务器上的,当一个服务器磁盘坏掉之后,可以从其他服务器拿到完整的备份数据。

3.Redis 哨兵模式

Redis 主从复制模式有那么多的优点,但是有一个致命的缺点,就是当 Redis 的主节点宕机之后,必须人工介入手动恢复,那么到特殊时间段,比如公司组织全体团建或者半夜突然发生主节点宕机的问题,此时如果等待人工去处理就会很慢,这个时间是我们不允许的,并且我们还需要招聘专职的人来负责数据恢复的事,同时招聘的人还需要懂得相关的技术才能胜任这份工作。既然如此的麻烦,那有没有简单一点的解决方案,这个时候我们就需要用到 Redis 的哨兵模式了。

Redis 哨兵模式就是用来监视 Redis 主从服务器的,当 Redis 的主从服务器发生故障之后,Redis 哨兵提供了自动容灾修复的功能,如下图所示:

image (5).png

Redis 哨兵模块存储在 Redis 的 src/redis-sentinel 目录下,如下图所示:

image (6).png

我们可以使用命令“./src/redis-sentinel sentinel.conf”来启动哨兵功能。

有了哨兵功能之后,就再也不怕 Redis 主从服务器宕机了。哨兵的工作原理是每个哨兵会以每秒钟 1 次的频率,向已知的主服务器和从服务器,发送一个 PING 命令。如果最后一次有效回复 PING 命令的时间,超过了配置的最大下线时间(Down-After-Milliseconds)时,默认是 30s,那么这个实例会被哨兵标记为主观下线。

如果一个主服务器被标记为主观下线,那么正在监视这个主服务器的所有哨兵节点,要以每秒 1 次的频率确认主服务器是否进入了主观下线的状态。如果有足够数量(quorum 配置值)的哨兵证实该主服务器为主观下线,那么这个主服务器被标记为客观下线。此时所有的哨兵会按照规则(协商)自动选出新的主节点服务器,并自动完成主服务器的自动切换功能,而整个过程都是无须人工干预的。

4.Redis 集群

Redis 集群也就是 Redis Cluster,它是 Redis 3.0 版本推出的 Redis 集群方案,将数据分布在不同的主服务器上,以此来降低系统对单主节点的依赖,并且可以大大提高 Redis 服务的读写性能。Redis 集群除了拥有主从模式 + 哨兵模式的所有功能之外,还提供了多个主从节点的集群功能,实现了真正意义上的分布式集群服务,如下图所示:

image (7).png

Redis 集群可以实现数据分片服务,也就是说在 Redis 集群中有 16384 个槽位用来存储所有的数据,当我们有 N 个主节点时,可以把 16384 个槽位平均分配到 N 台主服务器上。当有键值存储时,Redis 会使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位,再把此键值存储在对应的服务器上,读取操作也是同样的道理,这样我们就实现了数据分片的功能。

小结

今天我们分享了保障 Redis 高可用的 4 种手段:数据持久化保证了数据不丢失;Redis 主从让 Redis 从单机变成了多机。它有两种模式:主从模式和从从模式,但当主节点出现问题时,需要人工手动恢复系统;Redis 哨兵模式用来监控 Redis 主从模式,并提供了自动容灾恢复的功能。最后是 Redis 集群,除了可以提供主从和哨兵的功能之外,还提供了多个主从节点的集群功能,这样就可以把数据均匀的存储各个主机主节点上,实现了系统的横向扩展,大大提高了 Redis 的并发处理能力。


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

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

相关文章

GPT-4o之多模态

前言 想必,很多小伙伴都知道GPT-4o已经发布了,一手基于多模态的问答显示,看起来挺厉害的(也就是看起来, )。然后,我就顺手看了看什么是多模态。 简介 多模态(Multimodal&#xff…

什么是组态?什么是工业控制中的组态软件?

随着工业4.0和智能制造的发展,工控软件的应用越来越广泛,它们在提高生产效率、降低能耗和减少人力成本等方面发挥着越来越重要的作用。 什么是工控软件? 工控软件是指用于工业控制系统的软件,主要应用于各种生产过程控制、自动化…

标准库算法

欢迎访问我的博客首页。 标准库算法 1. 查找对象的算法2. 其它只读算法3. 二分搜索算法4. 写容器元素的算法5. 划分与排序算法6. 通用重排操作7. 排列算法8. 有序序 列的 集合算法9. 最 小值和 最大值10. 数值算法11. 参考 Pred 表示返回值为布尔类型的可调用对象。 1. 查找对…

Python序列的概念与使用-课后作业[python123题库]

序列的概念与使用-课后作业 一、单项选择题 1、关于Python组合数据类型,以下描述错误的是:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬…

Flutter 中的 DecoratedBox 小部件:全面指南

Flutter 中的 DecoratedBox 小部件:全面指南 在Flutter中,DecoratedBox是一个功能丰富的小部件,它为子组件提供了多种装饰效果,如背景色、边框和阴影。通过DecoratedBox,你可以轻松地为任何小部件添加装饰&#xff0c…

PLSQL连接Linux Oracle21c

PLSQL连接Linux Oracle21c 一、安装PLsql 下载官网 https://www.allroundautomations.com/registered-plsqldev/ 二、Oracle Instant Client下载 使用plsql连接oracle的时候是需要本地先安装oracle客户端,英文名就是Oracle Instant Client。 官方下载地址&…

初出茅庐的小李博客之用MQTT.fx软件进行消息发布与订阅【 基于EMQX Cloud】

MQTT.fx软件使用简单介绍 MQTT.fx 的软件界面如下图所示,最上方为 MQTT Broker 连接地址栏,及其连接配置。其下方功能 Tabs 含有 Publish 发布栏、Subscribe 订阅栏、Scripts 脚本栏、Broker Status 状态消息栏、Log 日志信息控制栏。 连接之前要明确几…

【Linux系列】软链接使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

深入编程逻辑:从分支到循环的奥秘

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、编程逻辑的基石:分支与循环 分支逻辑详解 代码案例:判断整数是…

函数的拓展

7.1.1 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 function log(x.y){ y y || Worldl console.log(x,y); }log(hello) //hello World log(hello,Chine) //hello Chine log(hello,) //hello World上面的代码检查函数…

UE5 双手握剑的实现(逆向运动学IK)

UE5 双手握剑的实现 IK 前言 什么是IK? UE官方给我们提供了很多对于IK处理的节点,比如ABRIK、Two Bone IK、Full Body IK 、CCD IK等,但是看到这,很多人就好奇了,什么是IK? 首先我们来看看虚幻小白人的骨…

[图解]产品经理创新之阿布思考法

0 00:00:00,000 --> 00:00:01,900 那刚才我们讲到了 1 00:00:02,730 --> 00:00:03,746 业务序列图 2 00:00:03,746 --> 00:00:04,560 然后怎么 3 00:00:05,530 --> 00:00:06,963 画现状,怎么改进 4 00:00:06,963 --> 00:00:09,012 然后改进的模式…

【Spring Security + OAuth2】授权

Spring Security OAuth2 第一章 Spring Security 快速入门 第二章 Spring Security 自定义配置 第三章 Spring Security 前后端分离配置 第四章 Spring Security 身份认证 第五章 Spring Security 授权 第六章 OAuth2 文章目录 Spring Security OAuth21、基于request的授权1…

一条命令安装Metasploit Framework

做安全渗透的人都或多或少的使用kali-Linux系统中msfconsole命令启动工具,然而也经常会有人遇到这样那样的问题无法启动 今天我们就用一条命令来重新安装这个工具 curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/met…

AI学习AI知识路线

数学基础 一、数据分析 二、概率论 三、线性代数及矩阵 l 数学基础 1)常数e2)导数3)梯度 4)Taylor5)gini系数6)信息熵与组合数 1)概率论基础2)古典模型3)常见概率分布 4)大数定理和中心极限定理5)协方差(矩阵)和相关系数 6)最大似然估计和最大后验估计 1)线性空间及线性变…

Windows内核--内存区对象(Section Object)(5.2)

内存区对象 Section Object表示可以共享的内存段。进程可以使用Section与其他进程共享其部分内存地址空间. Section还可为进程提供将文件映射到其内存地址空间的机制。 Linux有mmap与之类似。 参考: Section Objects and Views 内存区对象是虚拟描述符表VAD节点的一种 VAD树节点…

LabVIEW如何确保自动化设备的稳定性和可靠性?

为了确保LabVIEW在自动化设备中的稳定性和可靠性,可以采取以下关键措施: 1. 代码架构与设计 模块化设计:将程序分解为独立的模块或子VI,每个模块负责特定功能,便于测试和维护。状态机架构:使用状态机架构…

zookeeper选主之LeaderLatch

概述 利用zookeeper来进行选主,可以使用apache curator framework,它给我们封装了两种选主工具,它们分别是LeaderSelector和LeaderLatch。它们各自的应用场景不一样,LeaderSelector应用于那些需要频繁变主的情况,而Le…

Redis机制-Redis互斥锁、分布式锁

目录 一 互斥锁 二 分布式锁 Redis实现分布式锁 redisson实现分布式锁 可重入性: 主从一致性(性能差): 一 互斥锁 假设我们现在有一个业务要实现秒杀优惠券的功能,如果是一个正常的流程,线程之间应该…

数据结构中链表的题目

题目: 设计一个算法,要求将链表中所有节点的链接方向“原地”逆转,即要求仅利用原表的存储空间。 对于这个问题,首先要分析的是:链表中的头和尾节点如何插入?其次就是:如何链接? 搞懂…