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

news2024/11/17 3:26:08

高可用是通过设计,减少系统不能提供服务的时间,是分布式系统的基础也是保障系统可靠性的重要手段。而 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.coloradmin.cn/o/1693027.html

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

相关文章

Mac上安装OpenLDAP服务器详细教程(Homebrew安装和自带的ldap)

目录 前言 一、安装 Homebrew(如果尚未安装) 二、使用 Homebrew 安装 OpenLDAP 三、配置 OpenLDAP 步骤一:更新PATH和环境变量 步骤二:配置slapd.conf 步骤三:初始化和启动 OpenLDAP 服务 1.创建数据库目录 2…

你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

目录 一、onMounted的前世今生 1.1、onMounted是什么 1.2、onMounted在vue2中的前身 1.2.1、vue2中的onMounted 1.2.2、Vue2与Vue3的onMounted对比 1.3、vue3中onMounted的用法 1.3.1、基础用法 1.3.2、顺序执行异步操作 1.3.3、并行执行多个异步操作 1.3.4、执行一次…

非等值连接、等值连接、自然连接

目录 一、笛卡尔积 二、三种连接的关系 三、非等值连接 四、等值连接 五、自然连接 一、笛卡尔积 要理解非等值连接、等值连接、自然连接首先要理解笛卡尔积。 学过《离散数学》的应该很熟悉笛卡尔积。 简单来说,就是有两个集合,其中一个集合中的元…

【华三包过】2024年/华三H3C/云计算GB0-713

H3CNE-cloud-云计算-713 想转行 想继续深入 题库覆盖百分百,题库有新版106道新版113道旧版88道 H3C认证云计算工程师(H3C Certified Network Engineer for Cloud,简称H3CNE-Cloud) 认证定位于全面掌握虚拟化技术原理及相关产品/…

部门来了个测试开发,听说是00后,上来一顿操作给我看蒙了...

公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍&#xff01…

Ollama| 搭建本地大模型,最简单的方法!效果直逼GPT

很多人想在本地电脑上搭建一个大模型聊天机器人。总是觉得离自己有点远,尤其是对ai没有了解的童鞋。那么今天我要和你推荐ollama,无论你是否懂开发,哪怕是零基础,只需十分钟,Ollama工具就可以帮助我们在本地电脑上搭建…

【vue-6】监听

一、监听watch 完整示例代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

回见,那果园

记不得何时开始骑行&#xff0c;何时开始爬山&#xff0c;何时偶遇洛师傅&#xff0c;何时进了那半山腰的果园。 似乎很远&#xff0c;又很近。 昨天打电话给果园的师傅&#xff0c;本意问问杏是否熟了&#xff0c;周末骑行过去、进山聊天顺道吃个新鲜。 洛师傅呵呵的笑…

【vue-1】vue入门—创建一个vue应用

最近在闲暇时间想学习一下前端框架vue&#xff0c;主要参考以下两个学习资料。 官网 快速上手 | Vue.js b站学习视频 2.创建一个Vue3应用_哔哩哔哩_bilibili 一、创建一个vue3应用 <!DOCTYPE html> <html lang"en"> <head><meta charset&q…

KubeKey 安装 K8s

官网教程 在 Linux 上以 All-in-One 模式安装 KubeSphere 步骤 1&#xff1a;准备 Linux 机器 若要以 All-in-One 模式进行安装&#xff0c;您仅需参考以下对机器硬件和操作系统的要求准备一台主机。 硬件推荐配置 操作系统最低配置Ubuntu 16.04, 18.04, 20.04, 22.042 核 …

C++入门:从C语言到C++的过渡(3)

目录 1.内联函数 1.1内联函数的定义 1.2特性 2.auto关键字 2.1auto的简介 2.2注意事项 3.范围for 4.nullptr空指针 1.内联函数 在C语言中&#xff0c;无论使用宏常量还是宏函数都容易出错&#xff0c;而且无法调试。而C为了弥补这一缺陷&#xff0c;引入了内联函数的概…

SpringBoot3.x + JDK21 整合 Mybatis-Plus

前言 SpringBoot3.0 开始最低要求 Java 17&#xff0c;虽然目前最新的版本为 JDK22&#xff0c;但是在官网上看到 JDK23 在今年9月又要发布了&#xff0c;感觉这 JDK 也有点太过于给力了 所以我们选择用目前的 LTS 版本 JDK21 就好了&#xff0c;不用追求最新的 springboot 版…

【大数据】MapReduce JAVA API编程实践及适用场景介绍

目录 1.前言 2.mapreduce编程示例 3.MapReduce适用场景 1.前言 本文是作者大数据系列专栏的其中一篇&#xff0c;前文我们依次聊了大数据的概论、分布式文件系统、分布式数据库、以及计算引擎mapreduce核心概念以及工作原理。 书接上文&#xff0c;本文将会继续聊一下mapr…

未来十年,IT行业的无限可能!

未来十年&#xff0c;IT行业的无限可能&#xff01; &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学…

2024 电工杯(B题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024电工杯数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解…

短剧APP开发,短剧行业发展下的财富密码

今年以来&#xff0c;短剧市场展现出了繁荣发展的态势&#xff0c;成为了一个风口赛道。 短剧具有不拖沓、时长短、剧情紧凑等优势&#xff0c;顺应了当代人的生活&#xff0c;是当代人的“电子榨菜”。 短剧的快速发展同时也带动了新业态新模式的发展&#xff0c;短剧APP就是…

【Avalonia入门篇1】Avalonia的安装

目录 一、环境安装 1.1 安装.NET 1.2 安装Avalonia模板 1.3 安装VS编译器 1.4 安装Avalonia扩展 二、创建第一个Avalonia项目 一、环境安装 1.1 安装.NET 按照官网提示下载并安装.NET。如下图所示&#xff1a; 安装完成后&#xff0c;打开power shell&#xff0c;输入下…

Vue的学习 —— <Echarts组件库技术应用>

目录 前言 正文 一、ECharts技术简介 二、Vue3集成Echarts 1、安装Echarts 2、引入方式 三、Echarts基础篇 1、图表容器及大小 2、样式 2.1 颜色主题 3、坐标轴 5、数据集 5.1 在series中设置数据集 5.2 在dataset中设置数据集 四、常用图表实操 1、柱状图 2、…

特殊变量笔记2

案例需求 在demo4.sh中循环打印输出所有输入参数, 体验$*与$的区别 实现步骤 编辑demo4.sh脚本文件 # 增加命令: 实现直接输出所有输入后参数 # 增加命令: 使用循环打印输出所有输入参数演示 编辑demo4.sh文件 直接输出所有输入参数, 与循环方式输出所有输入参数(使用双引…

轻型web服务器搭建 阿里云

1.购买云服务器 2.远程连接云服务器 重置实例密码 重置后要重启服务器 登录云服务器 密码就是刚刚重置的 3.安装宝塔面板 宝塔面板 - 简单好用的Linux/Windows服务器运维管理面板 (bt.cn) 回车则开始安装&#xff0c;过程中会多次让输入y表示确认下一步&#xff0c;过程大概2…