Java面试八股之Redis哨兵机制

  1. Redis哨兵机制

Redis Sentinel(哨兵)模式是一种高可用解决方案,用于监控和自动故障转移Redis主从集群。以下是对哨兵模式详细过程的描述:

1. 初始化与配置

部署哨兵节点:在不同的服务器上部署一个或多个Redis Sentinel节点,它们作为独立进程运行,负责监控Redis主从集群的状态。

配置监控:为每个哨兵节点配置要监控的主节点(以及其从节点),包括主节点的IP地址、端口、密码(如有)以及监控间隔等参数。

配置哨兵间通信:哨兵节点之间需要通过发布与订阅机制相互通信,以便共享状态信息、进行协商和达成共识。配置哨兵间的心跳检测间隔、通信频道等参数。

配置故障转移参数:设定故障转移所需的条件,如主观下线(SDOWN)和客观下线(ODOWN)的判定条件(如连续多少次心跳检测失败)、故障转移的最小投票数(quorum)、故障转移超时时间、从节点选择策略等。

2. 哨兵监控与心跳检测

周期性监控:每个哨兵节点定期向主节点和从节点发送INFO和PING命令,获取它们的状态信息(如角色、连接数、复制进度等)和确认节点存活。

主观下线(SDOWN):当哨兵节点连续多次无法与某个节点(通常是主节点)建立连接或收到响应时,它会将该节点标记为“主观下线”。此时,该哨兵认为主节点有问题,但尚未与其他哨兵达成一致意见。

3. 故障通知与协商

发送哨兵间消息:标记为主观下线的哨兵节点会向其他哨兵节点发送消息,告知其对主节点的判断。其他哨兵接收到消息后,也会独立地对主节点进行检测。

客观下线(ODOWN):当足够数量(超过配置的quorum)的哨兵都将主节点标记为SDOWN时,主节点被认定为“客观下线”。这意味着大部分哨兵都观察到了主节点的问题,形成了共识。

4. 主节点故障转移

选举领导者(Leader Sentinel):在确认主节点ODOWN后,哨兵节点间启动选举流程,通过Raft或其他类似共识算法选出一个领导者哨兵负责执行故障转移操作。领导者哨兵可能是最先标记主节点ODOWN的哨兵,也可能是在选举过程中获得多数投票的哨兵。

选择新主节点:领导者哨兵根据配置的从节点选择策略(如优先选择复制偏移量最大的从节点,表示数据最完整)从健康的从节点中选择一个作为新的主节点。

执行故障转移:领导者哨兵向选定的从节点发送SLAVEOF NO ONE命令,使其晋升为主节点。同时,通知其他从节点重新配置复制关系,开始从新主节点复制数据。

更新客户端配置:领导者哨兵更新配置,将原主节点的客户端重定向到新主节点,并通过发布哨兵配置变更消息,让其他哨兵和客户端知晓新的主从关系。

原主节点恢复(可选):当原主节点恢复在线时,哨兵会将其自动配置为新主节点的从节点,等待后续可能的手动或自动故障恢复。

5. 健康监测与自动修复

持续监控:哨兵节点持续监控整个Redis集群的状态,包括新主节点和从节点的健康状况。

故障自动修复:如果新的主从关系出现问题(如新主节点故障),哨兵会再次触发故障转移流程,选举新的主节点,确保集群的高可用性。

6. 客户端接入与通知

客户端连接:客户端(应用程序)可以通过哨兵提供的服务发现接口(如SENTINEL get-master-addr-by-name <master-name>)动态获取当前主节点的地址,实现自动连接到正确的主节点。

事件通知:哨兵支持向客户端发送故障转移等重要事件的通知,客户端可以根据这些通知进行相应的处理,如更新本地缓存、重连等。

综上所述,Redis Sentinel模式通过哨兵节点的监控、协商、故障转移等过程,实现了对Redis主从集群的自动化管理和高可用保障。当主节点出现故障时,哨兵能自动识别并触发故障转移,确保数据服务的连续性,同时降低了运维复杂性和人工干预成本。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

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

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

相关文章

《算法笔记》总结No.7——二分(多例题详解版)

一.二分查找 目前有一个有序数列&#xff0c;举个例子&#xff0c;假设是1~1000&#xff0c;让我们去查找931这个数字&#xff0c;浅显且暴力的做法就是直接从头到尾遍历一遍&#xff0c;直到找到931为止。当n非常大&#xff0c;比如达到100w时&#xff0c;这是一个非常大的量级…

Linux 线程初步解析

1.线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列。在linux中&#xff0c;由于线程和进程都具有id,都需要调度等等相似性&#xff0c;因此都可以用PCB来描述和控制,线程含有PCB&am…

美联储降息应该更早?高盛:有充分理由7月降息,而非9月

KlipC报道&#xff1a;高盛首席经济学家哈祖斯Jan Hatzius表示&#xff0c;美联储“有充分理由”在7月会议上降息&#xff0c;而非等到9月。 在最新发布的报告中&#xff0c;他表明通胀已经取得了足够的进展&#xff0c;回到了美联储2%的长期目标附近&#xff0c;这将使美联储…

[C++ 入门基础 - 命名空间]

在C中&#xff0c;命名空间&#xff08;Namespace&#xff09;是一种用来组织代码并避免命名冲突的机制。命名空间可以包含变量、函数、类等C中的所有实体&#xff0c;使得这些实体的名称在命名空间内部有效&#xff0c;避免了与其他命名空间或全局作用域中相同名称的冲突。 文…

实现将Nginx的每个网站配置单独的访问日志

一、问题描述 Nginx默认的访问日志是不会区分哪个网站有哪些日志的,全部糅杂在一起;如果需要哪个网站有哪些访问日志记录,还需要将访问日志下载下来后筛选,比较麻烦;希望将每个网站对应的日志能够单独记录到对应的日志文件里面,方便排查和管理。 # 进入Nginx默认的日志文…

为什么Vim是程序员最喜欢的编辑器之一

简介 Vim&#xff0c;全称Vi IMproved&#xff0c;是一种高度可定制、功能强大的文本编辑器。自其诞生以来&#xff0c;它以高效、快速和灵活的特点深受程序员喜爱。无论是处理简单的文本文件还是复杂的代码项目&#xff0c;Vim都能提供卓越的编辑体验。许多资深程序员甚至称其…

c++ primer plus 第16章string 类和标准模板库,6.1.5字符串种类

c primer plus 第16章string 类和标准模板库,6.1.5字符串种类 c primer plus 第16章string 类和标准模板库,6.1.5字符串种类 文章目录 c primer plus 第16章string 类和标准模板库,6.1.5字符串种类6.1.5字符串种类 6.1.5字符串种类 本节将 string 类看作是基于 char 类型的。…

web服务器经过代理后的绝对路径问题,以及 dirname(__FILE__)和__DIR__

web服务器经过代理后的绝对路径问题&#xff0c;以及 dirname&#xff08;__FILE__&#xff09;和__DIR__ 问题描述情况解析资源路径分析访问过程分析 dirname(\_\_FILE\_\_) 与 \_\_DIR\_\_ 同步发布在个人笔记web服务器经过代理后的绝对路径问题&#xff0c;以及 dirname(__F…

Nest.js 实战 (一):使用过滤器优雅地统一处理响应体

前言 在我们实际的业务开发中&#xff0c;我们可以看到后端接口返回格式都有一定的要求&#xff0c;假如我们统一规定接口的统一返回格式为&#xff1a; {data: any; // 业务数据code: number; // 状态码msg: string; // 响应信息timestamp: number; // 时间戳 }那么在 Nest.…

【智能算法改进】改进的麻雀搜索算法及其求解旅行商问题

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.改进点 改进发现者更新位置 为了使 SSA 算法能够避开向原点收敛的弊端, 将算法向最优位置跳跃的操作转换为向最优位置的移动: X i ,…

自己动手写一个滑动验证码组件(后端为Spring Boot项目)

近期参加的项目&#xff0c;主管丢给我一个任务&#xff0c;说要支持滑动验证码。我身为50岁的软件攻城师&#xff0c;当时正背着双手&#xff0c;好像一个受训的保安似的&#xff0c;中规中矩地参加每日站会&#xff0c;心想滑动验证码在今时今日已经是标配了&#xff0c;司空…

一个篇文章告诉你一个APP前端搭建有多简单

用uni-app 1.新建uni-app项目 点击项目 2.创建 最后点击右下方创建 3.添加tarbar 首先你要创建几个页面这里比如说我有两个页面的tarbar首页(home)和我的(userIndex) 在pages目录下右键新建页面即可

从库存超卖问题分析锁和分布式锁的应用(二)

本文从一个经典的库存超卖问题分析说明常见锁的应用&#xff0c;假设库存资源存储在Redis里面。 假设我们的减库存代码如下&#xff1a; Autowired StringRedisTemplate redisTemplate;public void deduct(){String stock redisTemplate.opsForValue().get("stock"…

JavaSE从零开始到精通

1.前置知识 JVM&#xff1a;java virtrual machine, java虚拟机, 专门用于执行java代码的一款软件。JRE&#xff1a;java runtime enviroment, java运行时环境, java官方提供的核心类库. jre中包含了核心类库和jvm。JDK: java development kit, java开发工具包, javac.exe, ja…

LVS+Keepalive高可用

1、keepalive 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址只在主上&#xff0c;vip漂移到备服务器。 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到住服务器 1、配优先级 2、配置vip和真实服务器 3、主…

我想做信号通路分析,但我就是不想学编程

“我想做信号通路分析&#xff0c;但我就是不想学编程。” “我又不是生信狗&#xff0c;学代码会死。” “你们这些做生信的&#xff0c;整天把数据分析搞得神神秘秘&#xff0c;不就是怕被人抢饭碗而已嘛。” “这都没分析出我想要的结果&#xff0c;不靠谱。” “你们做…

【自学安全防御】二、防火墙NAT智能选路综合实验

任务要求&#xff1a; &#xff08;衔接上一个实验所以从第七点开始&#xff0c;但与上一个实验关系不大&#xff09; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总…

使用Docker创建并运行一个create-react-app应用(超简单)

创建并运行一个使用 Create React App (CRA) 创建的应用程序的 Docker 容器涉及几个步骤。以下是一个详细的过程&#xff0c;包括创建一个简单的 React 应用、编写 Dockerfile、构建镜像以及运行容器。 步骤 1: 创建一个新的 React 应用 如果你还没有一个 React 应用&#xf…

Java爬虫安全策略:防止TikTok音频抓取过程中的请求被拦截

摘要 在当今互联网时代&#xff0c;数据采集已成为获取信息的重要手段。然而&#xff0c;随着反爬虫技术的不断进步&#xff0c;爬虫开发者面临着越来越多的挑战。本文将探讨Java爬虫在抓取TikTok音频时的安全策略&#xff0c;包括如何防止请求被拦截&#xff0c;以及如何提高…

RK3568 安卓12 EC20模块NOCONN没有ip的问题(已解决)

从网上东拼西凑找了不少教程&#xff0c;但是里面没有提到rillib.so需要替换&#xff0c;替换掉就可以上网了&#xff0c;系统也有4G图标了。 注意&#xff0c;这个rillib.so是移远提供的。把他们提供的文件放到rk3568_android_sdk/vendor/rockchip/common/phone/lib下&#x…