Redis 中的哨兵选举算法是如何实现的?

“Redis 中的哨兵选举算法是如何实现的?”
昨天,一个工作 7 年的粉丝,去某外包公司面试,被问到这个问题不知道该怎么回答。
今天正好有空,给大家分享一下这个问题的回答思路。
对了,这个问题在我之前整理的 50 万字的大厂面试指南 里面,有标准的回答,大家可以去文章最后领取。

一、问题解析

Redis 里面的 Master-Slave 集群,是不具备故障恢复能力的。也就是 Master 节点挂了以后,需要从集群中的其他 Slave 节点选举新的 Master 继续提供服务。(如图)因此在 Redis 里面引入了 Sentinel 哨兵机制,通过哨兵来监控集群的状态,实现 Master 选举。哨兵是一个单独的进程,所以为了保证哨兵的可靠性,我们也会对哨兵做部署集群。

假设哨兵节点有 3 个(如图),那这个时候这三个节点分别去监听 Redis 的三个主从节点,这里就存在一个问题:
一旦 Redis 主从集群的某个节点出现故障,而故障节点被其中一个 Sentinel 哨兵节点检测到,但是另外两个节点还没检测到,那三个哨兵节点如何在意见上达成意见上的一致呢?

同时,哨兵节点怎么判断哪一个 Slave 节点应该成为 Master 呢?
这就是这个问题的底层逻辑,也是候选人在面对这个问题的时候需要思考和回答的方向,下面来看一下高手的回答。

二、问题总结

当 Redis 集群中的 Master 节点出现故障,哨兵节点检测到以后,会从 Redis 集群中的其他 Slave 节点选举出一个作为新的 Master。
具体的判断依据有两个部分:
第一部分: 筛选
第二部分: 综合评估
在筛选阶段,会过滤掉不健康的节点,比如(下线或者断线),或者没有回复 Sentinel哨兵心跳响应的 Slave 节点。同时,还会评估实例过往的网络连接情况,如果在一定时间内,Slave 和 Master 经常性断链,而且超出了一定的阈值,也不会考虑。经过筛选后,留下的都是健康的节点了。
接下来就对健康节点进行综合评估,具体有三个维度,按照顺序来判断。
3. 根据 Slave 优先级来判断,通过 slave-priority 配置项(redis.conf),可以给不同的从库设置不同优先级,优先级高的优先成为 master。
4. 选择数据偏移量差距最小的,即 slave_repl_offset 与 master_repl_offset 进度差距,其实就是比较 slave 与 原 master 复制进度差距,避免丢失过多数据的问题。
5. slave runID,在优先级和复制进度都相同的情况下,选用 runID 最好的,runID越小说明创建时间越早,优先选为 master。
经过以上步骤,就可以选举出新的 Master 节点了。
另外,如果哨兵存在集群的情况下,如果其中一个哨兵节点认为 Redis 集群主线故障,另外两个哨兵还没感知到的情况下。在进行 Master 选举之前,Sentinel 哨兵集群需要通过共识算法来达成一致,这里用到了 Raft 协议。
以上就是我的理解。

 三、粉丝福利

最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我
公众号:“ 
灰灰聊架构 ”, 回复暗号:“ 321 ”即可获取

 

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

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

相关文章

2024年【上海市安全员C3证】考试报名及上海市安全员C3证考试资料

题库来源:安全生产模拟考试一点通公众号小程序 上海市安全员C3证考试报名根据新上海市安全员C3证考试大纲要求,安全生产模拟考试一点通将上海市安全员C3证模拟考试试题进行汇编,组成一套上海市安全员C3证全真模拟考试试题,学员可…

Redis:原理速成+项目实战——Redis实战14(BitMap实现用户签到功能)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战13(GEO实现附近商铺、滚动分页查询) 📚订阅…

【计算机组成原理】指令流水线的三种冒险情况(Hazards)

冒险 在计算机架构中,流水线冒险是指在指令流水线的执行过程中由于数据相关性或控制相关性而导致的一种性能问题。指令流水线是将指令执行过程划分为多个阶段,这样可以同时处理多条指令,从而提高指令执行的效率。然而,流水线执行…

进程的创建与回收学习笔记

目录 一、进程内容: 二、进程常用命令 三、创建子进程 四、子进程进阶 五、进程的退出 六、进程的回收 一、进程内容: 程序: 存放在磁盘上的指令和数据的有序集合(文件) 静态的 进程: 执行一个程序所…

增广路算法 DFS求解 最大网络流问题

最大网络流问题 最大网络流问题是这样的,有一个有向图,假定有一个源点,有一个汇点,源点有流量出来,汇点有流量进入,有向图上的边的权重为该条边可通过的最大流量(方向为边的方向),问从源点到汇…

Linux系统SSH远程管理服务

目录 一、SSH协议是什么? 1、SSH协议的定义: 2、SSH协议的优点 3、SSH的客户端与服务端 4、SSH的原理 4.1公钥首次连接原理 4.2ssh远程登录 4.3使用简单的SSH远程登录 二、OpenSSH服务器 1、OpenSSH简介 2、配置Openssh服务端 3、SSH服务的最…

每日一题——LeetCode1128.等价多米诺骨牌对的数量

先尝试暴力解法&#xff1a; var numEquivDominoPairs function(dominoes) {var count0for(let i0;i<dominoes.length-1;i){for(let ji1;j<dominoes.length;j){if((dominoes[i][0]dominoes[j][0] && dominoes[i][1]dominoes[j][1]) || (dominoes[i][0]dominoes…

数据库系统概念 第七版 中文答案 第2章 关系模型介绍

第2章 关系模型介绍 2.1 考虑图 2.17 中的员工数据库。这些关系上适当的主码是什么&#xff1f; Answer: 相应的主键如下所示: 2.2 考虑从 instructor 的 dept_name 属性到 department 关系的外键约束。请给出对这些关系的插入和删除的示例&#xff0c;使得它们破坏该外码约…

Java接入Apache Spark(入门环境搭建、常见问题)

Java接入Apache Spark&#xff08;环境搭建、常见问题&#xff09; 背景介绍 Apache Spark 是一个快速的&#xff0c;通用的集群计算系统。它对 Java&#xff0c;Scala&#xff0c;Python 和 R 提供了的高层 API&#xff0c;并有一个经优化的支持通用执行图计算的引擎。它还支…

Docker容器进入的4种方式(推荐最后一种)

在使用Docker创建了容器之后&#xff0c;大家比较关心的就是如何进入该容器了&#xff0c;其实进入Docker容器有好几多种方式&#xff0c;这里我们就讲一下常用的几种进入Docker容器的方法。 进入Docker容器比较常见的几种做法如下&#xff1a; 使用docker attach使用SSH使用…

RK3568驱动指南|第十二篇 GPIO子系统-第134章 三级节点操作函数实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

CSS 下载进度条

<template><view class=btn>下载中</view></template><script></script><style>/* 设置整个页面的样式 */body {width: 100vw; /* 页面宽度为视口宽度 */background: #000000; /* 背景颜色为白色 */display: flex; /* 使用 flex…