27 redis 的 sentinel 集群

前言

redis 的哨兵的相关业务功能的实现 

哨兵的主要作用是 检测 redis 主从集群中的 master 是否挂掉, 单个哨兵节点识别 master 下线为主管下线, 超过 quorum 个 哨兵节点 认为 master 挂掉, 识别为 客观下线

然后做 failover 的相关处理, 重新选举 master 节点 

我们这里 来看一下 这里的整个流程

 

 

定时发送 ping, pub/sub ”Hello” 频道 

sentinel 这边有单独的定时任务处理部分, 它存取数据, 只做 监听集群中的数据节点, 哨兵节点 的相关功能

定时发送 info, ping, 向 “__sentinel__:hello” 发布当前哨兵的相关信息[ip, port, id, epoch]

info 这边主要是向各个节点发送 info 命令, 然后 哨兵节点这边定时更新 数据节点的元数据信息

ping 这边主要是类似于一个集群心跳的功能 

可以给根据 ping_period, PUBLISH_PERIOD 来更新发送的频率 

72edd505fdd14faa9091701a2538061a.png

 

向各个数据节点发送 PING 之后, 会记录 last_ping_time 等等信息 

这里的 PING 就是一个心跳的功能 

17bb2cacba09445f9e808a4bbc080b63.png

 

哨兵节点这边初始化的时候, 和 master 创建连接的时候, 会订阅 “__sentinel__:hello”

各个哨兵节点就是通过 “__sentinel__:hello” 来感知哨兵列表的 

然后具体的 哨兵节点的哨兵列表的维护就是在 sentinelReceiveHelloMessages 中进行处理的 

9f67f12a00ae4518a537db77b86df01d.png

 

 

哨兵节点认为 master 主观下线

就是 上一次ping心跳 到现在的时间超过了 down_after_period

或者 info心跳信息 到现在的时间超过了 down_after_period+20s

f148c30534b541779410a32c53ab6bb1.png

 

调用堆栈信息如下

959ae1878874474aa13161d1da1eb97f.png

 

 

哨兵集群认为 master 客观下线

当认为 master 客观下线的 哨兵节点数量超过了 quorum 个的时候, 哨兵集群认为 master 客观下线 

0038a23572214ec481b9d2f0bec203d2.png

 

调用堆栈信息如下

01d333c5c19a4d74adb5f467d53b07a5.png

 

 

master 挂掉之后的重新选举 和更新

主观下线之后, 选择 哨兵 master 的流程

sentinelFailoverWaitStart 是选取 哨兵 master 的处理

sentinelFailoverSelectSlave 是从数据节点中选择 master 的处理 

sentinelFailoverSendSlaveOfNoOne 是切换 master 的处理 

e816ebb4208a4f2f9dddcfd485d2a7fb.png

 

 

sentinelFailoverWaitStart 选取哨兵 master 

sentinelGetLeader 是选择哨兵 master 的核心逻辑

哨兵master 才会往下面走下面的 从 slave 节点中选择 master 的流程 

6d80ad70aceb49638aa5b467fcf34169.png

 

选取哨兵 master 的相关处理 

先统计其他哨兵的相关投标, 然后 自己再进行投票 选择票数最多的哨兵 或者 自己

然后 投票之后, 再来选择 票数最多的哨兵 

最终筛选 是否满足基础条件, 大于 (哨兵数量/2+1) 并且大于 master选举的数量 

44a4bfe7fe52498b802f99a42f344086.png

 

 

sentinelSelectSlave 选择新的 master 数据节点

处理方式如下, 筛选掉 一部分的节点, 经过筛选的节点为备选列表, 然后还有具体的选择规则 

筛选掉 主观客观下线 的节点 

筛选掉 失联的节点

筛选掉 ping 网络存在问题的节点 

筛选掉 配置 priority 为 0 的节点 

筛选掉 info心跳 超过一定时间的节点

筛选掉和 master 这边失联时间较长的节点, 说明它可能和集群沟通有问题 

f4b324d202d2421bbda023ec08b72e3a.png

 

master 这边选择规则如下 

优先级为 slave_priority, slave_repl_offset, runId 的比较 

其中 slave_repl_offset 指代的是 该 slave 节点和 master 这边同步的偏移, 偏移越大, 和 master 这边丢失的数据越少 

就我们这里的场景, 挂掉了目前的 master 节点 redis_8002, 然后 redis_8001, redis_8003 的 slave_priority, slave_repl_offset 均相同, 然后就是根据 runId 进行选择了 

f5cb567349884ca38a992e97d8b0f0fb.png

 

然后上下文如下, 根据 runId 的规则, 选择了 redis_8003, 然后 redis_8003 成为了新的 master 节点 

4908a1484e294edc93d6ec2e07269648.png

 

 

Master 信息的传播

其他的哨兵节点是通过 PUBLISH “__sentinel__:hello” 这边的业务处理来进行更新 master 的 

804edb3cd28b4038a22aee9fc7e22dd1.png

 

然后从节点这边的 slaveOf 主从关系是 哨兵节点这边向 slave 节点这边发送的信息 

进而通知 其他的 slave 节点, master 更新了, 需要全量 或者 增量重新同步数据了

7d41693c91754175b2ec530ea59ddee4.png

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++刷题】前缀和

【C刷题】前缀和 一、前缀和1、题目链接2、解析3、代码 二、二位前缀和1、题目链接2、解析3、代码 三、寻找数组的中心下标1、题目链接2、解析3、代码 四、除自身以外数组的乘积1、题目链接2、解析3、代码 五、和为K的子数组1、题目链接2、解析3、代码 六、和可被K整除的子数组…

Linux Shell 001-Bash简介

Linux Shell 001-Bash简介 本节关键字:Linux、Bash Shell、shell分类 相关指令:bash、sh、cat Shell的介绍 计算机只能认识(识别)机器语言(0和1),如(11000000 这种)。但是,我们的…

手写MapReduce实现WordCount

水善利万物而不争,处众人之所恶,故几于道💦 文章目录 需求分析编写MapReduce实现上述功能Mapper类Reducer类Driver类 查看输出结果 需求 假设有一个文本文件word.txt,我们想要统计这个文本文件中每个单词出现的次数。 文件内容如下…

【内存泄露】记一次内存泄露排查,罪魁祸首是HttpClient

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 很久很久以前,曾经的青葱…

docker构建镜像及项目部署

文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件,完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…

【3D Max】入门

文章目录 概述界面介绍常用功能保存和导入基本建模编辑模型材质和贴图光源和阴影动画制作渲染设置导出和打印来源 概述 3 ds MAX是由 Discreet (后来被 Autodesk (Autodesk)合并)开发的一款基于 PC系统的3 d Max或3 ds MAX三维动画绘制和制作软件,其主要功能有建模…

【精选】vulnhub CTF6 linux udev提权 (青铜门笔记)

一、信息收集 1.主机探测 发现靶机的IP地址是:192.168.103.130 ┌──(root💀kali)-[~] └─# arp-scan -l2.访问web页面 发现有个登录的页面,尝试了弱口令,但是发现没有成功; 所以,我们需要在后面的信…

Go 泛型发展史与基本介绍

Go 泛型发展史与基本介绍 Go 1.18版本增加了对泛型的支持,泛型也是自 Go 语言开源以来所做的最大改变。 文章目录 Go 泛型发展史与基本介绍一、为什么要加入泛型?二、什么是泛型三、泛型的来源四、为什么需要泛型五、Go 泛型设计的简史六、泛型语法6.1 …

Netty RPC 实现(二)

Netty RPC 实现 概念 RPC,即 Remote Procedure Call(远程过程调用),调用远程计算机上的服务,就像调用本地服务一样。RPC 可以很好的解耦系统,如 WebService 就是一种基于 Http 协议的 RPC。这个 RPC 整体…

机器视觉兄弟们,出身寒微,不是耻辱,能屈能伸,方为丈夫

人生过往,当时只道是寻常。 可以说,“社会边角料”这个词,即刺耳,又是那么难听。只是,无数的年轻人和中年人,都喜欢用这个词来自嘲。 特别是出身寒微,没啥资源的80后和90后,他们总是…

C语言的分支和循环语句

各位少年,今天和大家分享的是分支语句循环体语句,C语言是结构体的程序设计语言,这里的结构指的是(顺序结构)(选择结构)(循环结构)C语言是能够实现这三种结构的&#xff0…

docker容器内 获取宿主机ip

可以使用命令 --add-host jargatewayip:192.168.0.47 \ 需要注意,这里不能是 127.0.0.1 ,所以要找到服务器局域网的ip 命令示例 docker run -it \-p 80:80 \-p 443:443 \--name nginx \--network app --hostname nginx \-e TZAsia/Shanghai \--add-host jargatewayip:192.16…

fabs函数与fmax函数

目录 fabs函数 fmax函数 fabs函数 包含头文件&#xff1a;<math.h> C90函数原型&#xff1a;double fabs (double x); C99函数原型&#xff1a; double fabs (double x); float fabsf (float x);long double fabsl (long double x); C98函数原型&#xff1a; doubl…

第11章 GUI Page421~422 步骤六 支持文字

运行效果&#xff1a; 关键代码&#xff1a; 新增头文件&#xff1a; //item_text.hpp #ifndef ITEM_TEXT_HPP_INCLUDED #define ITEM_TEXT_HPP_INCLUDED #include "item_i.hpp"class TextItem : public IItem { public:TextItem(): _startPosition(0, 0), _endPos…

ssm基于BS的库存管理软件设计与实现论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

【操作系统】补充:你看到的所有地址都不是真的

补充&#xff1a;你看到的所有地址都不是真的 写过打印出指针的 C 程序吗&#xff1f;你看到的值&#xff08;一些大数字&#xff0c;通常以十六进制打印&#xff09;是虚拟地址&#xff08;virtual address&#xff09;。有没有想过你的程序代码在哪里找到&#xff1f;你也可以…

【华为鸿蒙系统学习】- 如何利用鸿蒙系统进行App项目开发|自学篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 创建鸿蒙第一个App项目 项目创建 工程目录区 预览区 运行Hello World 基本工程目录 ws:工程…

HarmonyOS 点击物理返回键再按一次退出系统(eTS)

&#xff08;1&#xff09;首先&#xff0c;定义一个变量&#xff0c;用于计算用户两次按下返回键的时间差&#xff1a; //todo 定义全局变量State exitTime: number 0;&#xff08;2&#xff09;然后就是一个捕捉用户按下返回键的事件&#xff1a; //todo 定义全局变量State …

计算球的体积 C语言xdoj89

题目描述&#xff1a;输入球的半径&#xff0c;计算并输出球的体积,假定pi3.14&#xff0c;结果保留两位小数。 输入格式&#xff1a;共一行&#xff0c;输入球体半径&#xff0c;两位小数。 输出格式&#xff1a;共一行&#xff0c;输出球体体积&#xff0c;结果保留两位小数。…

SecureCRT连接vmware虚拟机的centos系统配置

软件版本&#xff1a;VMware10.0.3&#xff0c;centos 7&#xff0c;securecrt 8.7.2 1&#xff0c;虚拟网络编辑器选择桥接模式&#xff0c; 2&#xff0c;如果不小心删除网络&#xff0c;centos关机状态下&#xff0c;选择恢复默认设置。 3&#xff0c;进入linux系统&#…