《Redis 核心技术与实战》课程学习笔记(六)

news2024/11/16 7:39:25

哨兵集群

哨兵机制的基本流程

  • 在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制。

  • 哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。
    在这里插入图片描述

    • 监控
      • 哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行。
      • 如果从库没有在规定时间内响应哨兵的 PING 命令,哨兵就会把它标记为“下线状态”。
      • 同样,如果主库也没有在规定时间内响应哨兵的 PING 命令,哨兵就会判定主库下线,然后开始自动切换主库的流程。
    • 选主
      • 主库挂了以后,哨兵就需要从很多个从库里,按照一定的规则选择⼀个从库实例,把它作为新的主库。
      • 这⼀步完成后,现在的集群里就有了新主库。
    • 通知
      • 在执行通知任务时,哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。
      • 同时,哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。

主观下线和客观下线

  • 哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。
  • 如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。
    • 如果检测的是从库,那么,哨兵简单地把它标记为“主观下线”就行了,因为从库的下线影响一般不太大,集群的对外服务不会间断。
    • 但是,如果检测的是主库,那么,哨兵还不能简单地把它标记为“主观下线”,开启主从切换。因为很有可能哨兵误判了,其实主库并没有故障。一旦启动了主从切换,后续的选主和通知操作都会带来额外的计算和通信开销。
      • 哨兵机制通常会采用多实例组成的集群模式进行部署,这也被称为哨兵集群。
      • 引入多个哨兵实例一起来判断,就可以避免单个哨兵因为自身网络状况不好,而误判主库下线的情况。
      • 同时,多个哨兵的网络同时不稳定的概率较小,由它们一起做决策,误判率也能降低。
      • 在判断主库是否下线时,不能由一个哨兵说了算,只有大多数的哨兵实例,都判断主库已经“主观下线”了,主库才会被标记为“客观下线”,这个叫法也是表明主库下线成为⼀个客观事实了。这个判断原则就是:少数服从多数。同时,这会进一步触发哨兵开始主从切换流程。

如何选定新主库?

  • 哨兵选择新主库的过程称为“筛选+打分”。
    • 简单来说,我们在多个从库中,先按照一定的筛选条件,把不符合条件的从库去掉。
      • 一般情况下,我们肯定要先保证所选的从库仍然在线运行。
      • 除了要检查从库的当前在线状态,还要判断它之前的网络连接状态。
      • 如果从库总是和主库断连,而且断连次数超出了一定的阈值,我们就有理由相信,这个从库的网络状况并不是太好,就可以把这个从库筛掉了。
    • 然后,我们再按照一定的规则,给剩下的从库逐个打分,将得分最高的从库选为新主库。
      • 我们可以分别按照三个规则依次进行三轮打分,这三个规则分别是从库优先级从库复制进度以及从库 ID号。
      • 只要在某一轮中,有从库得分最高,那么它就是主库了,选主过程到此结束。
      • 第一轮:优先级最高的从库得分高。
        • 可以通过 slave-priority 配置项,给不同的从库设置不同优先级。
      • 第二轮:和旧主库同步程度最接近的从库得分高。
        • 我们想要找的从库,它的 slave_repl_offset 需要最接近 master_repl_offset。
        • 如果在所有从库中,有从库的 slave_repl_offset 最接近 master_repl_offset,那么它的得分就最高,可以作为新主库。
      • 第三轮:ID 号小的从库得分高。
        • 在优先级和复制进度都相同的情况下,ID 号最小的从库得分最高,会被选为新主库。

哨兵集群:哨兵挂了,主从库还能切换吗?

  • 实际上,一旦多个实例组成了哨兵集群,即使有哨兵实例出现故障挂掉了,其他哨兵还能继续协作完成主从库切换的工作,包括判定主库是不是处于下线状态,选择新主库,以及通知从库和客户端。
  • 在配置哨兵的信息时,我们只需要用到sentinel monitor <master-name> <ip> <redis-port> <quorum>,设置主库的 IP 和端口,并没有配置其他哨兵的连接信息。

基于 pub/sub 机制的哨兵集群组成

  • 哨兵实例之间可以相互发现,要归功于 Redis 提供的 pub/sub 机制,也就是发布/订阅机制。
    在这里插入图片描述

    • 哨兵只要和主库建立起了连接,就可以在主库上发布消息了,比如说发布它自己的连接信息(IP和端口)。
    • 同时,它也可以从主库上订阅消息,获得其他哨兵发布的连接信息。
    • 当多个哨兵实例都在主库上做了发布和订阅操作后,它们之间就能知道彼此的IP地址和端口。
  • 为了区分不同应用的消息,Redis 会以频道的形式,对这些消息进行分门别类的管理。

    • 所谓的频道,实际上就是消息的类别。
    • 当消息类别相同时,它们就属于同一个频道。
    • 只有订阅了同一个频道的应用,才能通过发布的消息进行信息交换。
  • 在主从集群中,主库上有一个名为 “sentinel:hello” 的频道,不同哨兵就是通过它来相互发现,实现互相通信的。

  • 哨兵除了彼此之间建立起连接形成集群外,还需要和从库建立连接。这是因为,在哨兵的监控任务中,它需要对主从库都进行心跳判断,而且在主从库切换完成后,它还需要通知从库,让它们和新主库进行同步。

    • 哨兵是如何知道从库的 IP 地址和端口的呢?这是由哨兵向主库发送 INFO 命令来完成的。
    • 我们仍然可以依赖 pub/sub 机制,来帮助我们完成哨兵和客户端间的信息同步。

基于 pub/sub 机制的客户端事件通知

在这里插入图片描述

  • 客户端读取哨兵的配置文件后,可以获得哨兵的地址和端口,和哨兵建立网络连接。
  • 然后,我们可以在客户端执行订阅命令,来获取不同的事件消息。

由哪个哨兵执行主从切换?

在这里插入图片描述

  • 任何一个实例只要自身判断主库“主观下线”后,就会给其他实例发送 is-master-down-by-addr 命令。
    • 接着,其他实例会根据自己和主库的连接情况,做出 Y 或 N 的响应,Y 相当于赞成票,N 相当于反对票。
    • 一个哨兵获得了仲裁所需的赞成票数后,就可以标记主库为“客观下线”。
    • 这个所需的赞成票数是通过哨兵配置文件中的 quorum 配置项设定的。
    • 此时,这个哨兵就可以再给其他哨兵发送命令,表明希望由自己来执行主从切换,并让所有其他哨兵进行投票。
    • 这个投票过程称为“Leader选举”。
    • 因为最终执行主从切换的哨兵称为 Leader,投票过程就是确定 Leader。
  • 在投票过程中,任何一个想成为 Leader 的哨兵,要满足两个条件:第一,拿到半数以上的赞成票;第二,拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。

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

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

相关文章

三种SQL实现聚合字段合并(presto、hive、mysql)

需求&#xff1a;按照项目名&#xff0c;以逗号合并参与人 presto select item_name,array_join(array_agg(name),,) as group_name from test.test_04 group by item_name order by item_name hive select item_name,concat_ws(,,collect_set(name)) as group_name from tes…

全志V3S嵌入式驱动开发(四种启动方式)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于v3s的启动方式分析,怎么研究都不为过。对我们整个系列文章比较熟悉的同学来说,这幅图真的是太熟悉了, 整个流程不复杂。它主要是告诉我们,v3s加载的顺序是怎么样的…

【Linux后端服务器开发】进程控制与替换

目录 一、进程控制 1. 进程退出 2. 进程等待 2.1 阻塞等待 2.2 status位图结构 2.3 非阻塞等待 二、进程替换 1. exec*系列函数 2. 进程替换高级语言可执行程序 一、进程控制 1. 进程退出 进程退出会进入僵尸态&#xff0c;把自己的退出结果写入到自己的task_struct…

一种使得大模型输出结构化数据的简易方法

最近在用大模型跑一些数据&#xff0c;于是就不可避免的遇到了如何让大模型输出的格式便于处理这个问题。经过一些研究发现了一套比较有用的方法&#xff0c;在这里总结一下。 背景 任务是这样的&#xff0c;我需要用大模型&#xff08;比如ChatGPT&#xff0c;ChatGLM等等&a…

Springboot启用HTTP响应压缩

官方文档:https://docs.spring.io/spring-boot/docs/2.3.12.RELEASE/reference/htmlsingle/#how-to-enable-http-response-compression

Java面试题大全(2023牛客网最新版)大厂面试题附答案详解

很多 Java 工程师的技术不错&#xff0c;但是一面试就头疼&#xff0c;10 次面试 9 次都是被刷&#xff0c;过的那次还是去了家不知名的小公司。 问题就在于&#xff1a;面试有技巧&#xff0c;而你不会把自己的能力表达给面试官。 应届生&#xff1a;你该如何准备简历&#…

解决mysql的count()函数条件表达式不生效的问题

示例 表数据 统计错误的sql select count(age 10) as count from student查询结果 原因 count(‘任意内容’)都会统计出所有记录数&#xff0c;因为count只有在遇见null时才不计数&#xff0c;即count(null)0 解决 方法1&#xff1a;count()函数中条件表达式加上or n…

1、计算机网络核心

序号地址1计算机网络核心2数据库相关3Redis4Linux相关5JVM的内容6GC相关的7Java多线程与并发8Java多线程与并发-原理9Java常用类库与技巧10Java框架-Spring 文章目录 1、OSI开放式互联参考模型2、TCP/IP3、TCP报文头4、TCP的三次握手5、TCP的四次挥手6、为什么会有TIME_WAIT状态…

【unity】燧光MR设备极简教程(使用篇)

燧光MR设备极简教程&#xff08;使用篇&#xff09; 一、硬件的基础使用二、定位信标三、投屏直播1、第三人称视角同步MR2、第一人称视角无线投屏 相关文章&#xff1a;燧光MR设备极简教程&#xff08;开发篇&#xff09; 一、硬件的基础使用 官方使用文档&#xff1a;https:…

【LLM】Prompt tuning大模型微调实战

文章目录 一、Propmt tuning1. peft库中的tuning2. prompt tuning怎么搞 二、Prompt tuning代码实战1. tuning训练2. 模型推理比较3. 其他tuning技术 Reference 一、Propmt tuning 1. peft库中的tuning 之前提到过可以借助peft库&#xff08;Parameter-Efficient Fine-Tuning…

基于MeanShift的图像滤波方法

前言 在视觉领域中&#xff0c;图像滤波是一种常用的技术&#xff0c;用于去除图像中的噪声和平滑图像。其中&#xff0c;MeanShift滤波是一种基于颜色和空间信息的非参数化滤波算法。 MeanShift滤波原理 MeanShift滤波是一种基于密度估计的非参数化滤波技术&#xff0c;它对每…

【Go】Go 语言教程--GO语言数组(十一)

往期回顾&#xff1a; Go 语言教程–介绍&#xff08;一&#xff09;Go 语言教程–语言结构&#xff08;二&#xff09;Go 语言教程–语言结构&#xff08;三&#xff09;Go 语言教程–数据类型&#xff08;四&#xff09;Go 语言教程–语言变量&#xff08;五&#xff09;Go …

希尔排序及其时间复杂度(图文详解)

&#x1f63e; 博客主页: 爱吃bug的猿 &#x1f680;博客专栏: 数据结构,C语言初阶进阶全流程讲解 &#x1f63d;&#x1f63d;&#x1f63d;如果喜欢博主的文章&#xff0c;可以给博主点波赞和关注加速博主更新 文章目录 前言1. 代码思路代码实现法1代码实现法2&#xff08;不…

【KingbaseES】数据库如何查询数据库,模式及表大小

新建数据kingbase及kingbase模式 CREATE DATABASE kingbase OWNER kingbase; CREATE SCHEMA kingbase AUTHORIZATION "kingbase";在数据库kingbase的kingbase模式下新建两张测试表test_size,test_size1并插入数据 CREATE TABLE "kingbase"."test_sz…

课时9:PKI证书基础知识

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:Secureboot从入门到精通-[目录] 👈👈👈目录 1、CA证书的一般用法2、x509证书3、openssl证书命令行4、X509v3证书格式

第十五章 原理篇:YOLOv8

找工作也太难了吧根本找不到工作我哭死。 参考教程&#xff1a; https://mmyolo.readthedocs.io/en/latest/recommended_topics/algorithm_descriptions/yolov8_description.html https://zhuanlan.zhihu.com/p/599761847【这个写的挺不错】 https://zhuanlan.zhihu.com/p/63…

Linux进程监控及控制【命令ps的使用】

ps命令详解 Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照&#xff0c;就是执行ps命令的那个时刻的那些进程&#xff0c;如果想要动态的显示进程信息&#xff0c;就可以使用top命令。 要对进程进行监测…

EcoVadis 2023年最新评分细则

【EcoVadis 2023年最新评分细则】 Ecovadis 的四大主题 EcoVadis 企业社会责任评级方法的目标是通过其方针政策、实施执行和绩效反馈来衡量一家公司的企业社会责任管理系统的质量。 EcoVadis企业社会责任&#xff08;CSR&#xff09;评估方法基于七项基本原则&#xff08;如图&…

Blazor前后端框架Known-V1.2.3

V1.2.3 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

1.SpringBoot编写第一个接口(保姆级)

1.下载SpringBoot框架 下载地址&#xff1a;https://start.spring.io/ 选择对应的springboot 版本&#xff0c;工具&#xff0c;依赖等。 2.用Idea打开项目 下载完后&#xff0c;解压文件后&#xff0c;用Idea打开,进行项目的JDK和Maven的相关配置。 将项目的JDK配置成自己…