【redis13】集群前奏:sentinel模式

1.哨兵sentinel引入背景

我们现在来思考一个问题:如何实现服务的高可用。我们首先想到至少要满足两个要求:1.服务端能够实现主从自动切换;2.对于客户端来说,如果发生了主从切换,则能够自动连接到最新的master节点。
我们首先想到一个思路:增加一个领导者角色,能够管理redis节点存活状态,而且具备路由功能。比如master节点超过一定时间没有给监控服务器发送心跳报文,就把master标记为下线,然后将某个slave变成master。应用每一次都是从这个监控服务器骂道master的地址。
那问题来了?如果这个监控服务器本身出问题了怎么办?或者网络不同了,链接不到监控服务器了?
那是不是应该再创建一个监控服务器,来监控监控服务器?这个似乎无解了?因此如果采取哨兵sentinel的模式,我们该如何设计就是很重要的问题了。

这篇博客内容还不错,我们直接拿来用啦!

对于sentinel机制,我们的问题可以细分为以下几个方面:

  1. 什么是Redis的哨兵模式?
  2. 哨兵模式的优点是什么?
  3. 哨兵模式的工作原理是什么?
  4. 如何配置Redis的哨兵模式?
  5. 哨兵模式中的故障转移是如何实现的?

我们先来了解一下哨兵机制实现了以下主要功能,进一步了解这些功能的实现原理。

  1. 监控:哨兵节点定期检查Redis主节点和从节点的健康状态。它们发送命令并等待响应,以确保Redis实例正常运行。如果一个节点没有响应,哨兵节点会将其标记为下线。
  2. 故障检测和转移:当一个哨兵节点检测到主节点下线时,它会将这个信息广播给其他哨兵节点。当大多数哨兵节点都确认主节点下线后,它们会开始选举出一个新的主节点。这个过程称为故障转移,它可以确保Redis集群在主节点故障时仍然能够正常运行。
  3. 自动故障转移:一旦新的主节点选出,哨兵节点会更新Redis从节点的配置,使它们切换到新的主节点。这个过程是自动进行的,无需人工干预。
  4. 配置提供和更新:哨兵节点会监控Redis集群的配置,并在需要时提供给客户端。当主节点发生故障转移时,哨兵节点会更新从节点的配置,使它们正确地连接到新的主节点。
  5. 提供集群信息:哨兵节点可以提供有关Redis集群的信息,如主节点、从节点和哨兵节点的地址和状态。

根据上面的描述,我们可以将哨兵的功能总结为以下几点:

哨兵机制可以提供高可用性和故障转移能力,确保Redis集群在主节点故障时仍然可用。

2. 哨兵机制的原理

2.1 基本过程

哨兵实例之间可以相互发现,要归功于 Redis 提供的 pub/sub 机制,也就是发布/订阅机制。哨兵只要和主库建立起了连接,就可以在主库上发布消息了,比如说发布它自己的连接信息(IP 和端口)。同时,它也可以从主库上订阅消息,获得其他哨兵发布的连接信息。当多个哨兵实例都在主库上做了发布和订阅操作后,它们之间就能知道彼此的 IP 地址和端口。除了哨兵实例,我们自己编写的应用程序也可以通过 Redis 进行消息的发布和订阅。所以,为了区分不同应用的消息,Redis 会以频道的形式,对这些消息进行分门别类的管理。所谓的频道,实际上就是消息的类别。当消息类别相同时,它们就属于同一个频道。反之,就属于不同的频道。只有订阅了同一个频道的应用,才能通过发布的消息进行信息交换。
在主从集群中,主库上有一个名为__sentinel__:hello的频道,不同哨兵就是通过它来相互发现,实现互相通信的。我来举个例子,具体说明一下。在下图中,哨兵 1 把自己的 IP(172.16.19.3)和端口(26579)发布到__sentinel__:hello频道上,哨兵 2 和 3 订阅了该频道。那么此时,哨兵 2 和 3 就可以从这个频道直接获取哨兵 1 的 IP 地址和端口号。然后,哨兵 2、3 可以和哨兵 1 建立网络连接。通过这个方式,哨兵 2 和 3 也可以建立网络连接,这样一来,哨兵集群就形成了。它们相互间可以通过网络连接进行通信,比如说对主库有没有下线这件事儿进行判断和协商。

通过上面的讲解我们可以总结出来如下几点:

 1. 哨兵集群的组建步骤

  • 步骤1:启动哨兵节点。
  • 步骤2:配置哨兵节点的监控对象。
  • 步骤3:哨兵节点之间的通信和协调。

2.哨兵节点的角色和作用

  • Master节点:负责处理读写请求的主节点。
  • Slave节点:通过复制Master节点的数据实现数据备份和读取。
  • Sentinel节点:监控Redis集群的状态,负责主库下线判定和故障转移。

哨兵是如何知道从库的信息

哨兵向主库发送INFO命令,主库将从库列表发送给从库,哨兵跟从库列表中的从库建立连接,以便监控从库。

2.2. 主库下线的判定

在Redis Sentinel中,主从切换的执行由哨兵集群中的多个哨兵节点共同协作完成。当哨兵集群中的某个哨兵节点检测到主节点下线时,它会向其他哨兵节点发送消息,然后所有哨兵节点共同达成一致,选举出一个新的主节点,并将其他从节点指向新的主节点。选举的过程中,哨兵节点会通过投票和心跳机制来确定新的主节点。选举出的新主节点会广播给所有的客户端,以便它们能够与新的主节点进行通信。所以,主从切换的执行是由所有的哨兵节点共同参与的。 

  1. 哨兵节点通过心跳机制监控主库的状态。
  2. 当哨兵节点判定主库下线时,会广播通知其他哨兵节点。
  3. 哨兵节点通过共识算法,确定主库是否真的下线。

2.3. 哨兵集群选举

  1. 当一个哨兵节点检测到主节点下线时,它会向其他哨兵节点发送消息,通知它们主节点已经下线。
  2. 其他哨兵节点接收到消息后,它们也会检查主节点是否下线。如果它们同意主节点已下线,它们会进入选举过程。
  3. 在选举过程中,哨兵节点会相互通信,通过投票和心跳机制来决定新的主节点。
  4. 每个哨兵节点会为自己选举一个优先级最高的候选节点,然后它们会将自己选举的候选节点发送给其他哨兵节点。
  5. 哨兵节点会根据候选节点的优先级来选出一个新的主节点。如果有多个候选节点具有相同的优先级,那么将根据配置文件中的故障转移超时属性来决定。
  6. 选举出的新主节点将会广播给所有的客户端,以便它们能够与新的主节点进行通信。

需要注意的是,在选举过程中,哨兵节点需要达成多数派的共识才能选出新的主节点。例如,如果哨兵节点的总数为5,那么至少需要3个哨兵节点同意选举结果才能生效。

这个选举过程确保了在主节点下线的情况下,哨兵集群能够自动选举出一个新的主节点,从而保证了Redis的高可用性。

总结一下

  1. 当主库下线后,哨兵节点会开始选举新的主库。
  2. 哨兵节点通过共识算法选出新的主库。
  3. 新主库被选出后,哨兵节点会通知其他节点进行切换。

3. Redis哨兵模式面试题

根据上面的学习,我们来简答一下常见的Redis高可用相关面试题

3.1. 什么是Redis的哨兵模式?

Redis的哨兵模式是一种用于实现高可用性的机制。在哨兵模式中,多个Redis实例组成一个哨兵集群,其中一个实例作为主服务器,其他实例作为从服务器。哨兵监控主服务器的状态,并在主服务器宕机时自动将某个从服务器提升为新的主服务器,以保证系统的持续可用性。

3.2. 哨兵模式的优点是什么?

自动故障转移:当主服务器宕机时,哨兵可以自动选举一个新的主服务器,从而保证系统的高可用性。
实时监控:哨兵可以实时监控Redis实例的状态,并在发现异常时及时采取措施,如自动切换主服务器。
灵活性:哨兵模式可以根据实际需求配置哨兵集群的大小,以适应不同规模的系统。

3.3. 哨兵模式的工作原理是什么?

哨兵集群中的哨兵不断地监控Redis实例的状态。
每个哨兵通过发送PING命令来检测Redis实例的存活状态。
如果一个哨兵发现主服务器宕机,它会通过选举算法选出一个新的主服务器,并将这一信息广播给其他哨兵。
其他哨兵收到广播后,也会更新自己的配置,以适应新的主服务器。
客户端可以通过连接任意一个哨兵来获取当前的主服务器地址,并与主服务器建立连接。

3.4. 如何配置Redis的哨兵模式?

在每个Redis实例的配置文件中设置sentinel参数,指定哨兵模式的相关配置。
启动每个Redis实例,并指定相应的配置文件。
在哨兵集群中的任意一个哨兵上运行redis-sentinel命令,启动哨兵进程。
哨兵进程会自动发现其他哨兵和Redis实例,并开始监控它们的状态。

4. 5. 哨兵模式中的故障转移是如何实现的?

当一个哨兵发现主服务器宕机时,它会向其他哨兵发送选举请求。
哨兵集群中的所有哨兵会进行选举,选出一个新的主服务器。
选举规则通常是根据优先级、最近一次复制偏移量等因素进行评估。
选举完成后,新的主服务器地址会被广播给其他哨兵和客户端。
客户端可以通过连接任意一个哨兵来获取新的主服务器地址,并与其建立连接。

内容参考:

redis哨兵模式高可用

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

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

相关文章

S/MIME电子邮件证书申请指南

近年来,邮件安全问题日益突出,电子邮件成为诈骗、勒索软件攻击的重灾区。恶意邮件的占比屡创新高,邮件泄密事件更是比比皆是。在如此严峻的网络安全形势下,使用S/MIME电子邮件证书进行邮件收发是当今最佳的邮件安全解决方案之一。…

【PICO】【Unity】【VR】如何对打包后的PICO项目有效Debug

【背景】 PICO项目打包后再运行就看不到Console了。当然,会有各类专业的Debug工具。 有一类Debug的工具是Preview形式下展示Debug信息,但是发现Preview成功不见得打包也成功。 打包后也会有一些Debug工具,不过这里我给出自己的简单解决办法。 【解决方案】 Unity Console…

Java毕业设计-基于jsp+servlet的大学生学业规划咨询服务平台管理系统-第84期

获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于jspservlet的大学生学业规划咨询服务平台管理系统:前端 jsp、jquery、ajax,后端 servlet、jdbc,角色分为管理员、学生&#xff1b…

Linux——进程等待

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、为什么要进程等待二、进程等待的方法1、wait方法2、waitpid方法 三、获取子进程status 一…

pxe高效批量网络装机 以及安装教程

系统装机的三种引导模式 1.pe 2光驱 3.网卡 打开本机桌面 可以看见背景图片 查看配置文件内容 文件时引导选项的功能 pxe原理: 先根据dhcp找到IP地址、和引导程序的地址,还提供客户机tftp地址,因为tftp是小文件,容量小&#…

【占用网络】FlashOcc:基于2D卷积的占用预测模型

前言 FlashOcc是一个它只需2D卷积就能实现“占用预测模型”,具有快速、节约内存、易部署的特点,偏工程方向的工作。 它首先采用2D卷积提取图形信息,生成BEV特征。然后通过通道到高度变换,将BEV特征提升到3D空间特征。 对于常规…

攻防世界——Shuffle

32bit打开 main函数F5 下班

SpringBoot+Email发送邮件

引言 邮件通知是现代应用中常见的一种通信方式,特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能,使得实现邮件通知变得轻而易举。本文将研究如何在Spring Boot中使用JavaMailSender实现邮件发送&#xf…

Unity中URP下的SimpleLit的 Lambert漫反射计算

文章目录 前言一、Lambert漫反射计算11、MixRealtimeAndBakedGI 函数有三个重载2、3号 调用了 2号3、1号调用了 SubtractDirectMainLightFromLightmap函数4、我们重点来看 Lambert漫反射的实现部分5、其余部分 二、Lambert漫反射计算21、LightingLambert 前言 在之前的文章中&…

Python小项目:还在为备份烦恼?这个tkinter项目帮你解决!

文章目录 1 引言2 Tkinter概览3 设计备份软件的界面4 文件夹选择逻辑5 备份方案介绍5.1 完全备份5.2 增量备份5.3 镜像备份 完整代码: import tkinter as tk from tkinter import filedialog, messagebox import os import shutil import filecmpdef choose_source(…

SpringBoot 3.1.7 集成Sentinel

一、背景 我的项目需要引入限流,降级,熔断框架,由于 Spring Cloud 2022.0.4 已经不再支持 Hystrix,Spring Cloud 提供了替代方案,如 Resilience4j,可以使用它来替换 Hystrix。但是网上搜了一下国内Resilie…

burp靶场--文件上传

burp靶场–文件上传 https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload 1.文件上传 1、原理:文件上传漏洞是指Web服务器允许用户将文件上传到其文件系统,而不充分验证文件的名称、类型、…

《WebKit 技术内幕》之七(2): 渲染基础

2 网页层次和RenderLayer树 2.1 层次和RenderLayer对象 前面章节介绍了网页的层次结构,也就是说网页是可以分层的,这有两点原因,一是为了方便网页开发者开发网页并设置网页的层次,二是为了WebKit处理上的便利,也就是…

Circles of Waiting洛谷黑题题解

Circles of Waiting 题面翻译 在平面直角坐标系上,有一个神奇的点,一开始在 ( 0 , 0 ) (0, 0) (0,0) 。每秒钟这个点都会随机移动:如果它在 ( x , y ) (x, y) (x,y) ,下一秒它在 ( x − 1 , y ) (x - 1, y) (x−1,y) 的概率是…

在WIN从零开始在QMUE上添加一块自己的开发板(二)

文章目录 一、前言往期回顾 二、CPU虚拟化(一)相关源码(二)举个例子(三)测试 三、内存虚拟化(一)相关源码(二)举个例子测试 参考资料 一、前言 笔者这篇博客…

力扣日记1.21-【回溯算法篇】77. 组合

力扣日记:【回溯算法篇】77. 组合 日期:2023.1.21 参考:代码随想录、力扣 终于结束二叉树了!听说回溯篇也是个大头,不知道这一篇得持续多久了…… 77. 组合 题目描述 难度:中等 给定两个整数 n 和 k&#…

LSTM时间序列预测

本文借鉴了数学建模清风老师的课件与思路,可以点击查看链接查看清风老师视频讲解:【1】演示:基于LSTM深度学习网络预测时间序列(MATLAB工具箱)_哔哩哔哩_bilibili % Forecast of time series based on LSTM deep learn…

敏捷测试和DevOpes自动化测试的区别

敏捷测试和DevOps自动化测试在以下方面存在区别👇 1️⃣目标 🎈敏捷测试的主要目标是提供快速的反馈和持续的改进,以便在开发过程中尽早发现和解决问题,从而提高软件的质量和可靠性。 🌈DevOps自动化测试的目标是提高软…

Java学习笔记(七)——操作数组工具类Arrays

文章目录 ArraysArrays.toString()Arrays.binarySearch()Arrays.copyOf()Arrays.copyOfRange()Arrays.fill()Arrays.sort()升序排序降序排序 Arrays 操作数组的工具类。 Arrays.toString() import java.util.Arrays;public class test40 {public static void main(String[] a…

【Docker篇】详细讲解容器相关命令

🎊专栏【Docker】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 🎄欢迎并且感谢大家指出小吉的问题🥰 文章目录 🛸容器🌹相关命令🍔案例⭐创建并运…