【Redis入门到精通十】Redis哨兵

news2024/10/10 12:50:13

目录

哨兵(Sentinel)

1.哨兵的由来

2.哨兵的基本概念

3.基于docker安装配置Redis哨兵

4.哨兵选取主节点的原理

1.主观下线

2.客观下线

3.选举出哨兵的leader

4.leader挑选出合适的slave成为新的master


哨兵(Sentinel)

        Redis Sentinel 是 Redis 的高可用实现方案,在实际的⽣产环境中,对提高整个系统的⾼可⽤是⾮常有帮助的,本篇文章⾸先整体梳理主从复制模式下故障处理可能产生的问题,⽽后引出高可用的概念,最后重点分析 Redis Sentinel 的基本架构、优势,以及是如何实现⾼可⽤的。

1.哨兵的由来

主从复制模式通过将主节点的数据改变同步给从节点,这样从节点可以起到两个作用:

一.作为主节点的一个备份,一旦主节点出了故障,从节点可以顶替主节点,并且保证数据一致性。二.从节点可以分担主节点的读压力,实现读写分离。

主从复制遇到的难题

  1. 主节点发生故障时,进行主备切换的过程十分复杂,需要完全依赖人工参与,导致故障无法及时恢复正常。
  2. 主节点可以将读的压力分担,但是写的压力无法分担,收到单机限制。

 其中第⼀个问题是⾼可⽤问题,即 Redis 哨兵主要解决的问题。第⼆个问题是属于存储分布式的问题,留给 Redis 集群去解决,本篇文章我们集中讨论第⼀个问题。

哨兵自动恢复主节点故障

        当主节点出现故障时,Redis Sentinel 能⾃动完成故障发现和故障转移,并通知应⽤⽅,从⽽实现真正的⾼可⽤。Redis Sentinel 是⼀个分布式架构,其中包含若⼲个 Sentinel 节点和 Redis 数据节点,每个Sentinel 节点会对数据节点和其余 Sentinel 节点进⾏监控,当它发现节点不可达时,会对节点做下线表示。如果下线的是主节点,它还会和其他的 Sentinel 节点进⾏ “协商”,当⼤多数 Sentinel 节点对主节点不可达这个结论达成共识之后,它们会在内部 “选举” 出⼀个领导节点来完成⾃动故障转移的⼯作,同时将这个变化实时通知给 Redis 应⽤⽅。整个过程是完全⾃动的,不需要⼈⼯介⼊。

整体的架构如图所示:

 

2.哨兵的基本概念

        Redis Sentinel 相⽐于主从复制模式是多了若⼲(建议保持奇数)Sentinel 节点⽤于实现监控数据节点,哨兵节点会定期监控所有节点(包含数据节点和其他哨兵节点)。针对主节点故障的情况,故障转移流程⼤致如下:
  1. 主节点故障,从节点同步连接中断,主从复制停⽌。
  2. 哨兵节点通过定期监控发现主节点出现故障。哨兵节点与其他哨兵节点进⾏协商,达成多数认同主节点故障的共识。这步主要是防止该情况:出故障的不是主节点,⽽是发现故障的哨兵节点,该情况经常发⽣于哨兵节点的⽹络被孤⽴的场景下。
  3. 哨兵节点之间使用 Raft 算法选举出⼀个领导角色,由该节点负责后续的故障转移⼯作。
  4. 哨兵领导者开始执行故障转移:从节点中选择⼀个作为新主节点;让其他从节点同步新主节点;通知应⽤层转移到新主节点。

 通过上面的介绍,可以看出 Redis Sentinel 具有以下几个功能:

  • 监控: Sentinel 节点会定期检测 Redis 数据节点、其余哨兵节点是否可达。
  • 故障转移: 实现从节点晋升(promotion)为主节点并维护后续正确的主从关系。
  • 通知: Sentinel 节点会将故障转移的结果通知给应用方。

3.基于docker安装配置Redis哨兵

1.首先要安装docker和docker-compose (基于unbantu的docker安装全教程)

 2.停止之前的Redis服务器(service redis-server stop

3.使用docker获取到redis的镜像(获取错误需要配置docker镜像加速器详看第一条的安装教程)

如下图所示即获取成功:

 4.使用docker-compose进行容器编排

        因为此处要设置的Redis集群至少需要六个Redis服务器,每个Redis服务器都需要一个单独的容器进行启动,也就是需要六个docker容器,使用docker对这六个容器一一进行配置,启动非常麻烦,所以我们选择通过一个配置文件,把具体要创建哪些容器,每个容器运行的各种参数都描述清楚,使用docker-compose运行这个配置文件以此达成批量生成docker容器的操作。

 创建两个yml格式的配置文件,分别把Redis服务器的配置信息和Redis哨兵的配置信息填入其中,1.1首先启动Redis的主从节点,使用docker-compose时的配置文件名称必须为docke-compose,如下所示:

1.2使用docker-compose up -d 命令启动Redis所在容器。

1.3 查看运行日志使用命令 docker-compose logs

 1.4连接主节点,验证是否启动成功

2.1编写redis-sentinel启动所需的配置文件 ,创建 /root/redis-sentinel/docker-compose.yml , 同时 cd 到 yml 所在⽬录中。

确保 redis 主从节点启动之后才启动 redis-sentinel. 如果先启动 redis-sentinel 的话, 可能触发额外的选举过程, 对我们之后观察redis哨兵选举redis主节点的过程造成影响。

 

2.2在当前目录下创建哨兵的配置文件,创建 sentinel1.conf sentinel2.conf sentinel3.conf 三份⽂件的内容是完全相同的(因为哨兵在运行过程中会自动重写配置文件,如果使用一份文件,会出现修改混乱。)。

 其中sentinel monitor命令参数如下:

sentinel monitor 主节点名 主节点ip 主节点端⼝ 法定票数

法定票数即哨兵之间通过通信,当足够票数的哨兵都一致认为主节点瘫痪时,哨兵才会开始工作,选举新的主节点,避免哨兵因为网络波动而出现误判的情况。 

其中sentinel down-after-milliseconds 即哨兵监控的节点名称和最长停摆时间。

  • 主节点和哨兵之间通过⼼跳包来进⾏沟通. 如果⼼跳包在指定的时间内还没回来, 就视为是节点出现故障

 2.3使用docker-compose up -d命令启动所有容器

2.4使用docker-compose logs 命令查看运行日志 

3.1手动下线主节点 docker stop redis-master

3.2 观察哨兵日志

可以看到哨兵发现了主节点 sdown, 进⼀步的由于主节点宕机得票达到 3/2 , 达到法定得票, 于是master 被判定为 odown.
  • 主观下线 (Subjectively Down, SDown): 哨兵感知到主节点没⼼跳了. 判定为主观下线.
  • 客观下线 (Objectively Down, ODown): 多个哨兵达成⼀致意⻅, 才能认为 master 确实下线了.

 接下来, 哨兵们挑选出了⼀个新的 master. 在上图中, 是 172.18.04:6379 这个节点。

3.3重启原master节点,可以发现原节点被当成了从节点。

4.哨兵选取主节点的原理

从上述操作过程也可以看出来哨兵在选取主节点的过程大致可以分为四步:

1.主观下线
当 redis-master 宕机, 此时 redis-master 和三个哨兵之间的⼼跳包就没有了.
此时, 站在三个哨兵的⻆度来看, redis-master 出现严重故障. 因此三个哨兵均会把 redis-master 判定为主观下线 (SDown)
2.客观下线
此时, 哨兵 sentenal1, sentenal2, sentenal3 均会对主节点故障这件事情进⾏投票. 当故障得票数>= 配置的法定票数之后, 此时意味着 redis-master 故障这个事情被做实了. 此时触发客观下线(ODown)。
sentinel monitor redis-master 172.22.0.4 6379 2
这个地⽅配置的 2 , 即为法定票数
3.选举出哨兵的leader

选举leader的过程设计Raft算法,具体过程可分为下面四个步骤:

  1. 每个哨兵节点都给其他所有哨兵节点, 发起⼀个 "拉票请求". (S1 -> S2, S1 -> S3, S2 -> S1, S2 -> S3, S3 -> S1, S3 -> S2)。
  2. 收到拉票请求的节点, 会回复⼀个 "投票响应". 响应的结果有两种可能, 投 or 不投.
  3. ⼀轮投票完成之后, 发现得票超过半数的节点, ⾃动成为 leader。
  4. leader 节点负责挑选⼀个 slave 成为新的 master. 当其他的 sentenal 发现新的 master 出现了, 就说明选举结束了.
4.leader挑选出合适的slave成为新的master
挑选规则:
  1. ⽐较优先级. 优先级⾼(数值⼩的)的上位. 优先级是配置⽂件中的配置项( slave-priority 或者 replica-priority ).
  2. ⽐较 replication offset 谁复制的数据多, ⾼的上位.
  3. ⽐较 run id , 谁的 id 小, 谁上位。

❤️😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍

🍔我是小皮侠,谢谢大家都能看到这里!!

🦚主页已更新Java基础内容,数据结构基础,数据库,算法,Redis相关内容。

🚕未来会更新Java项目,SpringBoot,docker,mq,微服务以及各种Java路线会用到的技术。

🎃求点赞!求收藏!求评论!求关注!

🤷‍♀️谢谢大家!!!!!!!!

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

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

相关文章

2-117 基于matlab的共振峰估计

基于matlab的共振峰估计,共振峰参数包括共振峰频率和频带的宽度(带宽)。共振峰信息主要包含在语音频谱的包络中,其关键是估计自然语音频谱包络,通过倒谱法、LPC内插法、LPC求根法实现共振峰估计。程序已调通&#xff0…

Spark_累加器

分布式共享只写变量 实现原理:  累加器用来把Executor端变量信息聚合到Driver端,在Driver程序中定义的变量,在Executor端的每个Task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回Driver端进行mer…

计算机视觉的应用36-人工智能时代计算机视觉技术在电力系统中的应用

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用36-人工智能时代计算机视觉技术在电力系统中的应用。本文综述了人工智能时代计算机视觉技术在电力系统中的应用。文章首先介绍了项目背景,随后详细阐述了计算机视觉技术的模型、技术原理…

轻松实现本地部署:任何人都能安装顶尖开源模型 LLaMA3!

引言 LLaMA3 在 2024年4月18 日正式发布了,作为开发人员怎么能不蹭一下热度,体验一下可以在个人电脑端部署的大语言模型呢?文末领取安装包和安装文档! LLaMA3 LaMA3 是一个自回归语言模型,使用了优化的 Transformer …

Java后端面试题(day16)

目录 java常见的引用类型java中深拷贝和浅拷贝如何设计一个秒杀系统?谈一下对高并发的理解,平时怎么处理高并发问题?Comparable和Comparator区别?解决hash冲突有哪些方法?Synchronized锁的升级过程 java常见的引用类型 java的引用类型一般分…

【数据结构与算法】简单聊聊图数据的存储

文章目录 1. 邻接矩阵(Adjacency Matrix)2. 邻接表(Adjacency List)3. 邻接多重表4. 十字链表5. 图数据库(Graph Database) 存储图数据的方法主要有几种,每种方法都有其特定的应用场景和优缺点。…

【工具】前端js数字金额转中文大写金额

【工具】前端js数字金额转中文大写金额 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>金额转…

快递批量查询物流追踪只揽收无物流信息的单号

在电子商务和物流领域&#xff0c;快递单号的追踪是确保货物顺利送达的关键环节。然而&#xff0c;在实际操作中&#xff0c;经常会遇到一些只显示揽收信息而没有后续物流更新的单号&#xff0c;这给商家和买家都带来了不小的困扰。本文将介绍如何通过快递批量查询物流的方法&a…

jdk多版本来回切换不生效

本人电脑安装了两个jdk1.8跟17 但是安装完17后发现怎么切换版本都是17&#xff0c;如图 解决思路也很简单&#xff0c;就是找到path 将%JAVA_HOME%/bin提到最前头&#xff0c;就解决了 但是需要注意的是jdk11以上就没有jre了

YOLO11改进|注意力机制篇| 引入SpatialGroupEnhance注意力机制

目录 一、【 SpatialGroupEnhance】注意力机制1.1【 SpatialGroupEnhance】注意力介绍1.2【SpatialGroupEnhance】核心代码 二、添加【SpatialGroupEnhance】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【 SpatialGroupEnh…

leetcode:反转字符串II

题目链接 string reverse(string s1) {string s2;string::reverse_iterator rit s1.rbegin();while (rit ! s1.rend()){s2 *rit;rit;}return s2; } class Solution { public:string reverseStr(string s, int k) {string s1;int i 0;//标记字符串下标int j 0;int length …

程序员在AI时代扮演着多重角色:不仅是AI技术的创造者,也是使用者,更是AIGC的贡献者

程序员在AI时代扮演着多重角色&#xff1a;不仅是AI技术的创造者&#xff0c;也是使用者&#xff0c;更是AIGC的贡献者 引言 大家好&#xff0c;我是猫头虎&#xff0c;在当下的AI时代&#xff0c;程序员不仅是AI技术的推动者&#xff0c;更在这个生态中扮演着多重角色&#…

ARM base instruction -- sdiv

有符号除法运算 Signed Divide divides a signed integer register value by another signed integer register value, and writes the result to the destination register. The condition flags are not affected. 将一个有符号整数寄存器值除以另一个有符号整数寄存器值&am…

YOLOv11训练自己数据集_笔记1

一、前言 官网yolov11-main yolov11代码地址 分析YOLO11的关键改进点 YOLO11 相比之前版本&#xff0c;带来了五大关键改进&#xff1a; 增强特征提取&#xff1a;通过改进Backbone和Neck架构&#xff0c;新增了C3k2和C2PSA等组件&#xff0c;提升了目标检测的精度。 优化效率…

python使用装饰器来统计函数被调用次数、格式化dict以及Python-smtplib邮件发送的IP name possibly forged问题解决

一、python调试&#xff1a;使用装饰器来统计函数被调用次数及格式化dict 喜欢调试的时候显示数据并显示一些其它的信息&#xff0c;比如区分是哪次调用的调试信息&#xff0c;比如友好的显示dict等相对复杂的数据类型&#xff0c;所以这里涉及到两个方面。一是统计函数被调用次…

Centos再生龙系统迁移

Centos再生龙系统迁移 1.准备工作1.1rufus镜像刻录软件1.2再生龙镜像1.3硬盘和U盘2.准备u盘启动工具2.1刻录再生龙镜像3.备份系统3.1选择U盘启动3.2选择分辨率3.3选择中文3.4选择默认键盘配置3.5使用再升龙3.6选择第一个,device-image硬盘/分区存到/来自镜像文件3.7选择local_…

运维问题0004:MM模块-操作MIGO过账报错“对象OFN_YR 2840 WE2840 的编码范围没有找到”

1、问题分析 当在SAP系统MM模块的MIGO过账时出现“对象OFN_YR 2840 WE2840的编码范围没有找到”错误&#xff0c;这通常是因为系统配置中缺少对应的编码范围。先来分析一下报错消息号信息&#xff1a;OFN_YR是后台自动凭证编号范围配置的事务代码;2840是工厂名称 ;WE2840是指接…

地理空间数据共享资源,爱好者进

地理空间数据共享资源&#xff0c;爱好者进 1、1986–2021年中国30m逐年耕地数据集 由于农田的空间和时间模式对食品安全和环境可持续性的供应至关重要&#xff0c;因此长期和准确的农田监测非常重要。研究团队开发了一种新颖、经济的年度农田映射框架&#xff0c;该框架集成…

【C++】适配器stack/queue/priority_queue使用和实现

目录 容器适配器 什么是容器适配器 ​编辑stack stack的了解和使用 使用举例 题目加深 模拟实现 功能实现 测试文件 ​编辑queue queue的了解和使用 使用举例 题目加深 模拟实现 功能实现 测试文件 priority_queue priority_queue的了解和使用 使用举…

基于SpringBoot项目评审系统【附源码】

基于SpringBoot项目评审系统 效果如下&#xff1a; 系统首页界面 学生登录界面 项目信息页面 项目申报页面 专家注册界面 管理员登录界面 管理员功能界面 项目评审界面 评审结果界面 研究背景 在当今快速发展的信息时代&#xff0c;项目评审作为项目管理的关键环节&#xff…