大厂面试官问我:哨兵怎么实现的,Redis 主节点挂了,获取锁时会有什么问题?【后端八股文六:Redis集群八股文合集】

news2024/11/25 6:42:13

   往期内容:

大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】-CSDN博客

大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】-CSDN博客

大厂面试官问我:Redis持久化RDB有没有可能阻塞?阻塞点在哪里?【后端八股文三:Redis持久化八股文合集】-CSDN博客

大厂面试官问我:Redis内存淘汰,LRU维护整个队列吗?【后端八股文四:Redis内存淘汰策略八股文合集】-CSDN博客

 

本文为【Redis集群八股文合集】初版,后续还会进行优化更新,欢迎大家关注点赞评论交流~

大家第一眼看到这个标题,不知道心中是否有答案了?在面试当中,面试官经常对项目亮点进行深挖,来考察你对这个项目亮点的理解以及思考!这个时候,你如果可以回答出面试官的问题,甚至是主动说出自己的思考,那在面试中是大大加分的~

Redis的集群

以前的做法:
比如说我们有个Redis的实例挂了,有用户反馈,然后我们运维的就加班加点就是去更新服务器,就是去启用一个新的Redis实例,重启起来,然后把数据恢复进去

高可用:
自动切换
有一台就是这主的Redis还有几台从的Redis,因为我们主要我们的主的这个 Redis 会不断的就是去发数据,要让这从的节点去同步我们这个主的Redis里面的数据。

当我们的主节点这一个 Redis 它发生了这一个宕机之后,我们的 Redis 集群它里面有一种特殊的实例叫做哨兵实例,我们通过这个哨兵实例就可以就可以将这个主节点替换下来,就判断它下线以后我们再把从节点部署上去,这样的话就可以实现一个相当于实现节点的自动切换,尽管用户会感觉到有一段时间卡顿了,但是不需要运维人员手动实现切换了,那么那么我认为这就是一种高可用,像 MySQL 里面其实它也有这样的高可用的这种场景存在。

redis高可用,mysql高可用,节点间怎么同步的,哨兵模式是什么,mysql支持哨兵模式吗

  1. Redis 高可用:
    Redis 支持主从复制和哨兵模式来实现高可用。在主从复制中,数据会从主节点同步到从节点。哨兵模式是在主从复制的基础上,增加了自动故障转移的功能。哨兵会监控主从节点的状态,当主节点发生故障时,哨兵会自动选举出新的主节点,实现故障的自动恢复。
  2. MySQL 高可用:
    MySQL 常见的高可用方案包括主从复制和使用第三方工具如MGR(MySQL Group Replication)、ProxySQL 等。在主从复制中,数据会从主库同步到从库。MGR 则是一种分布式高可用方案,可以在多个节点之间进行数据同步和自动故障转移。
  3. 节点间同步:
    无论是 Redis 还是 MySQL,节点间的数据同步都是通过主从复制的方式实现的。主节点负责接受写入请求,将数据变更同步到从节点。从节点会定期从主节点拉取数据变更,保持与主节点的数据一致性。
  4. 哨兵模式:
    Redis 哨兵模式是在主从复制的基础上,增加了节点监控和自动故障转移的功能。哨兵会监控主从节点的状态,当主节点发生故障时,哨兵会自动选举出新的主节点,并通知其他从节点切换主节点。
  5. MySQL 是否支持哨兵模式:
    MySQL 本身不支持哨兵模式,但可以通过第三方工具如 Keepalived 实现类似的功能。Keepalived 可以监控 MySQL 主从节点的状态,并在主节点发生故障时自动切换到备用节点。

Redis的主从、哨兵、集群有没有搭建过?怎么搭建部署的

Redis 主从复制:

在主节点和从节点的 Redis 配置文件中,配置 replicaof 或 slaveof 指令,指定主节点的地址和端口。

从节点会自动连接主节点并开始数据复制。可以通过 info replication 命令查看主从复制的状态。

Redis Sentinel 哨兵模式:

首先启动 3 个或更多个 Sentinel 进程,在配置文件中指定监控的主节点信息。

在主节点和从节点的 Redis 配置文件中,配置 sentinel 指令,指定 Sentinel 节点的地址和端口。

Sentinel 会自动监控主节点状态,在主节点故障时自动将从节点晋升为新的主节点。

Redis 集群(切片):

在每个 Redis 节点的配置文件中,配置 cluster-enabled yes 开启集群模式。

使用 redis-cli --cluster create 命令,指定集群中所有节点的地址和端口,创建集群。

Redis 集群会自动将数据切分到不同的节点上,实现水平扩展和高可用。

Redis有哪几种高可用部署方式

主从、哨兵、分布式集群

redis 如何保证高可用

主从、哨兵、集群

可以扩展的一些点:数据不丢失和服务不中断,AOF,AOF重写,RDB,redis默认的RDB生成时机以及与AOF重写命令的冲突问题,写时复制,主从数据同步,复制积压缓冲区,复制缓冲区,哨兵机制,主从切换,脑裂问题

什么时候用Redis主从集群,什么时候用哨兵集群

Redis 主从集群:

适用于读写分离的场景:

主节点负责写入,从节点负责读取。这样可以提高系统的读写性能。

适用于简单的高可用场景:

当主节点发生故障时,可以手动或自动将从节点升级为新的主节点。

适用于小规模的数据量:

主从复制适合中小型 Redis 集群,当数据量较大时,主从复制的性能会下降。

缺点:

主从复制是异步的,从节点可能与主节点存在数据延迟。

手动故障切换较为繁琐,需要人工介入。

Redis 哨兵集群:

适用于自动故障转移的场景:

当主节点发生故障时,Sentinel 可以自动将从节点晋升为新的主节点。

适用于大规模的数据量:

Sentinel 模式可以支持更大规模的 Redis 集群,性能表现更优。

适用于更复杂的高可用场景:

Sentinel 可以监控整个 Redis 集群的状态,提供更强大的高可用保证。

缺点:

需要部署和配置额外的 Sentinel 节点,增加了系统复杂度。

Sentinel 本身也是单点故障,需要部署多个 Sentinel 节点来提高可用性。

redis集群和哨兵机制有什么区别?

Redis 集群和哨兵机制的区别:

结构不同:

Redis 集群是由多个 Redis 节点组成的分布式系统,节点之间通过 Gossip 协议进行通信。

Redis 哨兵是一个独立的进程,用于监控主从节点的状态,并在主节点故障时自动执行failover。

功能不同:

Redis 集群提供了数据分片和自动故障转移的功能,可以实现水平扩展和高可用。

Redis 哨兵只负责监控和故障转移,不参与数据存储和分片。

复杂度不同:

Redis 集群的搭建和管理相对更加复杂,需要配置各个节点的集群参数。

Redis 哨兵相对更加简单,只需要配置好监控的主从节点即可。

你搭过Redis哨兵和集群吗?Redis集群的数据是怎么存储的?key-value是怎么找到自己的位置?

Redis 集群:

数据存储:Redis 集群使用哈希槽(hash slot)的方式来存储和查找数据。每个 key 都会被映射到 0-16383 之间的一个哈希槽上。

查找过程:客户端在访问 key 时,先通过 crc16 算法计算出该 key 所在的哈希槽,然后路由到负责该槽位的节点上。

优点:集群具有很强的扩展性和高可用性,可以动态添加或删除节点。

Redis 哨兵:

监控和故障转移:哨兵会定期检测主节点和从节点的状态,一旦发现主节点故障,会自动将某个从节点晋升为新的主节点。

客户端连接:客户端在连接时,需要指定哨兵集群的地址,哨兵会返回当前的主节点地址。

优点:哨兵部署相对简单,可以保证主从节点的高可用性。

redis主节点挂掉了,哨兵还没有选出下一个结点,这个时候写的数据会怎么样?

主节点挂掉,哨兵还没选出新的主节点时的数据写入:

在这种情况下,客户端的写入操作将会失败。因为没有确定的主节点,客户端无法确定数据应该写入哪个节点。

直到哨兵完成主从切换,选出新的主节点,客户端才能恢复正常的写入操作。

这段时间内写入的数据会丢失,除非使用了持久化方式或者 AOF 日志。

cluster 在服务器扩容时如何 rehash,哈希槽如何计算

当增加或减少 Redis 集群的节点时,需要对哈希槽进行重新分配,这个过程称为 rehash。

rehash 的具体步骤是:

计算新的哈希槽分配方案

迁移数据到新的槽位

更新客户端路由信息

哈希槽的计算公式是: slot = crc16(key) & 16383

crc16 是一种常用的哈希算法

结果被 16383 取模,得到 0-16383 之间的槽位号

Redis 哨兵模式的脑裂

脑裂是指在主从切换过程中,多个哨兵节点同时认定不同的节点为主节点的情况。

造成脑裂的常见原因包括:

网络分区:哨兵节点之间网络不通

资源竞争:多个哨兵节点同时试图提升自己为主节点

解决方案包括:

增加仲裁节点,通过多数派选举主节点

调整哨兵节点的权重和配置

Redis宕机了你是怎么处理的?

如果是单机 Redis 宕机,可以通过重启 Redis 服务来恢复。

如果是 Redis 集群宕机,需要检查每个节点的状态,并按需重启节点。

如果是主从 Redis 宕机,需要通过哨兵机制自动或手动切换主从节点。

如果数据丢失,可以通过 RDB 或 AOF 文件进行数据恢复。

有没有可能redis因为主从哨兵,两个线程拿到同一个锁的情况,怎么办

这确实可能出现,因为主从节点之间存在一定的延迟,当主节点宕机后,新的主节点可能无法感知之前获取的锁。

解决方案包括:

使用带有过期时间的分布式锁,这样即使出现锁竞争也能自动过期释放。

在获取锁的时候,先检查当前节点是否为主节点,如果不是就放弃获取锁。

redis的高可用(哨兵和分片),主从同步的流程

哨兵模式:

配置好主从节点

启动哨兵进程监控主从节点状态

当主节点故障时,哨兵自动选举新的主节点

客户端通过哨兵获取新的主节点地址

集群模式:

搭建集群,配置各节点信息

集群节点之间通过Gossip协议同步状态

客户端根据哈希槽路由访问数据

集群节点动态扩容或缩容时,自动执行rehash

哨兵模式下,写redis是单台机器提供写的能力还是多台机器提供

在哨兵模式下,写操作是由当前的主节点提供。

当主节点发生故障时,哨兵会自动将某个从节点提升为新的主节点,客户端会自动感知并切换到新的主节点。

多个主库如何实现

在 Redis 中,一般不会存在多个主库的情况,因为这样会导致数据一致性问题。

如果确实有这种需求,可以考虑使用 Redis 集群模式,通过哈希槽的方式将数据分散在多个主节点上。

假设Redis有一个主库,2个从库,主库持有分布式锁,如果主库这个时候因为某些原因宕机了,哨兵选举新的从库为主库,但是因为主库实例故障而导致从库也无法同步到这把锁,这个问题应该怎么解决呢?

(ZooKeeper 实现或者使用分布式锁算法Redlock)

解决方案包括:

使用带有过期时间的分布式锁,这样即使出现锁竞争也能自动过期释放。

在获取锁的时候,先检查当前节点是否为主节点,如果不是就放弃获取锁。

使用Redlock等分布式锁算法,提高锁的可靠性。

Redis的集群和哨兵这两个有什么区别和优缺点吗?

集群模式:

采用分布式存储,数据分散在多个节点上

通过哈希槽的方式实现扩容和负载均衡

集群内部通过 Gossip 协议维护节点状态

客户端直接连接集群节点进行读写

哨兵模式:

采用主从复制架构,有一个主节点和多个从节点

通过独立的哨兵进程监控主从节点状态

当主节点故障时,哨兵会自动将某个从节点晋升为新的主节点

客户端通过哨兵获取最新的主节点地址

Redis主从架构和哨兵的区别

集群模式:

优点:

支持水平扩展,可以线性增加存储和计算能力

具有自动故障转移和负载均衡的能力

缺点:

搭建和维护相对复杂

单个节点容量受限

哨兵模式:

优点:

简单易用,易于部署和维护

可靠性高,能够实现自动主从切换

缺点:

存储能力受限于单个主节点

无法实现水平扩展

Redis相关:引入哨兵集之后,主从故障的转移过程?

主从复制模式下,当主节点故障时:

哨兵监测到主节点故障

哨兵在从节点中选举出新的主节点

哨兵通知客户端新的主节点地址

客户端切换到新的主节点进行读写

整个过程由哨兵自动完成,客户端无需感知主从切换细节。

哨兵怎么实现的,redis 主节点挂了,获取锁时会有什么问题?

Redis哨兵的实现原理:

哨兵是一个独立的Redis进程,它通过与Redis节点建立连接来监控主从节点的状态。

哨兵会定期向主节点和从节点发送 INFO 命令,来获取节点的各种信息,如角色、复制偏移量等。

当哨兵发现主节点不可达时,它会与其他哨兵进程商议,达成一致后选举出新的主节点。

选举新主节点的算法类似Raft算法,需要获得大多数哨兵进程的投票。

选举成功后,哨兵会通知客户端新的主节点地址,客户端切换到新主节点进行访问。

主节点挂掉后获取锁的问题:

在Redis主从复制+哨兵模式下,当主节点挂掉后,会出现一些潜在的问题:

如果主节点在持有分布式锁时发生故障,新选举出的主节点可能无法感知之前的锁状态。

这会导致两个问题:

新主节点可能无法获取之前主节点持有的锁,导致业务逻辑错误。

如果旧主节点的锁还在持有状态,新主节点也无法重新获取该锁,从而造成死锁。

解决方案包括:

使用带有过期时间的分布式锁,这样即使出现锁竞争也能自动过期释放。

在获取锁的时候,先检查当前节点是否为主节点,如果不是就放弃获取锁。

使用Redlock等分布式锁算法,提高锁的可靠性。

Redis的哈希槽

哈希槽的概念:

Redis 集群将所有的键值对分散存储在 16384 个哈希槽(hash slot)中

每个键根据其 key 值通过一个哈希函数映射到一个特定的哈希槽

集群中的每个节点负责管理一部分哈希槽

哈希槽的实现:

当客户端访问 Redis 集群时,客户端首先通过 CRC16 算法计算出 key 的哈希值,然后将哈希值对 16384 取模得到槽号。

客户端将请求路由到负责该槽号的节点上执行。

节点之间通过 Gossip 协议交换自己负责的槽号信息,客户端可以缓存这些信息,直接访问正确的节点。

集群扩容:

当需要扩容时,可以通过增加新节点的方式来扩展集群。

添加新节点后,需要在现有节点和新节点之间迁移部分哈希槽,以达到负载均衡。

迁移哈希槽的过程由集群自动完成,客户端无需感知。

新节点加入后,集群会根据新的拓扑结构重新计算哈希槽分布,并将部分槽位迁移到新节点。

后期新的八股文合集文章会仅粉丝可见,感兴趣的小伙伴可以点个关注~

 更多精彩内容以及一手消息请关注公众号:绝命Coding

公众号私信回复“免费资料”可免费获取简历模板以及技术亮点合集等免费资料

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

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

相关文章

Shell 脚本编程保姆级教程(下)

七、Shell 流程控制 7.1 if #!/bin/bash num1100 if test $[num1] 100 thenecho num1 是 100 fi 7.2 if else #!/bin/bash num1100 num2100 if test $[num1] -eq $[num2] thenecho 两个数相等! elseecho 两个数不相等! fi 7.3 if else-if else #!/…

深度学习 - Transformer 组成详解

整体结构 1. 嵌入层(Embedding Layer) 生活中的例子:字典查找 想象你在读一本书,你不认识某个单词,于是你查阅字典。字典为每个单词提供了一个解释,帮助你理解这个单词的意思。嵌入层就像这个字典&#xf…

代码随想录-二叉搜索树(1)

目录 二叉搜索树的定义 700. 二叉搜索树中的搜索 题目描述: 输入输出示例: 思路和想法: 98. 验证二叉搜索树 题目描述: 输入输出示例: 思路和想法: 530. 二叉搜索树的最小绝对差 题目描述&#x…

IOS Swift 从入门到精通:ios 连接数据库 安装 Firebase 和 Firestore

创建 Firebase 项目 导航到Firebase 控制台并创建一个新项目。为项目指定任意名称。 在这里插入图片描述 下一步,启用 Google Analytics,因为我们稍后会用到它来发送推送通知。 在这里插入图片描述 在下一个屏幕上,选择您的 Google Analytics 帐户(如果已创建)。如果没…

java第三十课 —— 面向对象练习题

面向对象编程练习题 第一题 定义一个 Person 类 {name, age, job},初始化 Person 对象数组,有 3 个 person 对象,并按照 age 从大到小进行排序,提示,使用冒泡排序。 package com.hspedu.homework;import java.util.…

使用slenium对不同元素进行定位实战篇~

单选框Radio定位: 单选框只能点击一个,并且点击之后并不会被取消,而多选框,能够点击多个,并且点击之后可以取消 import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; imp…

基于python和opencv实现边缘检测程序

引言 图像处理是计算机视觉中的一个重要领域,它在许多应用中扮演着关键角色,如自动驾驶、医疗图像分析和人脸识别等。边缘检测是图像处理中的基本任务之一,它用于识别图像中的显著边界。本文将通过一个基于 Python 和 OpenCV 的示例程序&…

intellij idea安装R包ggplot2报错问题求解

1、intellij idea安装R包ggplot2问题 在我上次解决图形显示问题后,发现安装ggplot2包时出现了问题,这在之前高版本中并没有出现问题, install.packages(ggplot2) ERROR: lazy loading failed for package lifecycle * removing C:/Users/V…

Android 10.0 关于定制自适应AdaptiveIconDrawable类型的动态时钟图标的功能实现系列二(拖动到文件夹部分功能实现)

1.前言 在10.0的系统rom定制化开发中,在关于定制动态时钟图标中,原系统是不支持动态时钟图标的功能,所以就需要从新 定制动态时钟图标关于自适应AdaptiveIconDrawable类型的样式,就是可以支持当改变系统图标样式变化时,动态时钟 图标的背景图形也跟着改变,本篇实现在拖…

HBuilder X 小白日记02-布局和网页背景颜色

html&#xff1a; 例子1&#xff1a; 整个&#xff1a; css案例&#xff1a; 1.首先右键&#xff0c;创建css文件 2.在html文件的头部分&#xff0c;引用css&#xff0c;快捷方式&#xff1a;linkTab键 <link rel"stylesheet" href" "> 3.先在css…

操作系统精选题(二)(综合模拟题一)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;操作系统 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 简答题 一、进程由计算和IO操作组…

论文阅读之旋转目标检测ARC:《Adaptive Rotated Convolution for Rotated Object Detection》

论文link&#xff1a;link code&#xff1a;code ARC是一个改进的backbone&#xff0c;相比于ResNet&#xff0c;最后的几层有一些改变。 Introduction ARC自适应地旋转以调整每个输入的条件参数&#xff0c;其中旋转角度由路由函数以数据相关的方式预测。此外&#xff0c;还采…

【Unity】Timeline的倒播和修改速度(无需协程)

unity timeline倒播 一、核心&#xff1a; 通过playableDirector.playableGraph.GetRootPlayable(i).SetSpeed(speed)接口&#xff0c;设置PlayableDirector的速度。 二、playableGraph报空 若playableDirector不勾选Play On Awake&#xff0c;则默认没有PlayableGraph&…

Redis基础教程(三):redis命令

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

oj E : 投资项目的方案

Description 有n种基础的投资项目&#xff0c;每一种的单位收益率为profitn&#xff0c;存在m种投资组合&#xff0c;限制每一种的投资总额不能超过invest_summ 每种投资组合中项目所需的单位投入是不同的&#xff0c;为costmn 求&#xff1a;使得收益率之和最高的每种项目投…

Meven

目录 1.简介2.Maven项目目录结构2.1 约定目录结构的意义2.2 约定大于配置 3. POM.XML介绍3.2 依赖引用3.3 属性管理 4 Maven生命周期4.1 经常遇到的生命周期4.1 全部生命周期 5.依赖范围&#xff08;Scope&#xff09;6. 依赖传递6.1 依赖冲突6.2 解决依赖冲突6.2.1 最近依赖者…

1、线性回归模型

1、主要解决问题类型 1.1 预测分析(Prediction) 线性回归可以用来预测一个变量(通常称为因变量或响应变量)的值,基于一个或多个输入变量(自变量或预测变量)。例如,根据房屋的面积、位置等因素预测房价。 1.2 异常检测(Outlier Detection) 线性回归可以帮助识别数…

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定…

量产工具一一显示系统(一)

目录 前言 一、项目介绍和应用 1.简单易用 2.软件可配置、易扩展 3.纯 C 语言编程 4.类似界面应用 二、项目总体框架 三、显示系统 1.显示系统数据结构抽象 &#xff08;1&#xff09;common.h &#xff08;2&#xff09;disp_manager.h 2.Framebuffer编程 &#x…

Conformal Prediction

1 A Gentle Introduction to Conformal Prediction and Distribution-Free Uncertainty Quantification 2 Language Models with Conformal Factuality Guarantees