Redis 哨兵机制
哨兵机制
哨兵机制的介绍
先来看一下Redis Sentinel 相关名词解释:

在之前的主从复制中,存在一个问题,那就是当主节点挂了后,通过人工干预的方式来解决是比较繁琐且不那么靠谱的。
在实际开发中,对于服务器后端开发,监控程序是很重要的。服务器要求高可用性,需要服务器保持7 * 24小时的长期运行,如果出了什么意外,这个意外啥时候出的,出的原因是什么,这些都需要程序员搞清楚,并且如果用人工的方式实时盯着服务器也不太现实,所以此时就需要一个监控程序来监控服务器的运行状态,往往还会搭配一个 “报警” 程序来提醒开发者出现问题了。
哨兵机制是通过独立的进程来实现的, redis-sentinel进程不负责存储数据,只是对其他的redis-server起到监控的效果。
通常哨兵节点也会搞成一个集合(多个哨兵节点构成的)。
手动恢复Redis主从复制的流程
这里再来回顾一下,当Redis主节点挂了后,程序员手动恢复的流程:
1.先看主节点还能不能抢救,好不好抢救,如果能就赶紧抢救好立马重启。
2. 如果主节点挂的原因不好定位,或者问题定位到了,但是短时间内难以解决,此时就需要挑一个从节点,使其成为新的主节点,此时又需要几步:
a:把选中的从节点,通过 slaveof no one的方式,先成为主节点。
b:把其他的从节点,通过slaveof ip port的方式来连接新的主节点。
c:告知客户端(修改客户端的配置文件),让客户端能够连接到新的主节点,从而能够完成修改数据的操作。
之前挂了的主节点修好之后,也不用空闲着,可以把它当作一个新的从节点挂到这组机器中。
此时我们就发现,一旦操作涉及到人工,那么不仅处理起来需要更长的时间,如果处理出错了还会导致问题更加严重。
自动恢复redis主从复制的流程
Redis Sentinel 架构:

如果是从节点挂了,其实还没什么问题。
但如果是主节点挂了,哨兵就要发挥作用了:
1. 此时,一个哨兵节点发现主节点挂了还不够,还需要与其他的哨兵节点共同确认这件事,目的就是为了防止误判。
2.如果这个主节点确实是挂了,那么这些哨兵节点就会选举出一个 “leader” 这样的哨兵节点,由这个 “leader”节点来从现有的从节点中,挑选出一个节点作为新的主节点。
3.挑选出新的主节点后,哨兵节点就会自动控制这个节点执行 slaveof no one命令,并且会控制其他从节点修改 slaveof 到新的主节点上。
4.哨兵节点会自动通知客户端程序,告知新的主节点是谁,这样后续客户端再进行写操作时,就会针对新的主节点进行操作了。
Redis哨兵节点的核心功能:
1.监控redis-server集群
2.会自动进行故障的转移。
3.自动通知客户端新的主节点。
另外,Redis哨兵节点只有一个也是可以的,不过就会存在一些问题:
1.如果哨兵节点只有一个,那么它自身也是容易出现问题的,万一这个哨兵节点挂了,并且后续Redis的节点也挂了,那么就无法进行自动恢复的过程了。
2.出现误判的可能性也比较高:因为网络传输数据是容易出现网络抖动或者延迟或者丢包的,如果只有一个哨兵节点,那么出现上述问题之后影响就比较大了。
所以在分布式系统中一般遵循一个原则:避免 “单点”。
使用docker搭建环境
docker简单介绍
我们这里为了演示3个redis-server,3个哨兵节点,本来应该是在6台机器上的,但是我们这里只有一台云服务器来完成这里的环境搭建。
在实际工作上,把上述节点放在一个服务器上是没有意义的。
由于这些节点比较多,依赖的端口号/配置文件/数据文件都避免冲突,当然如果在不同的主机上配置就比较容易了,在一个主机上的话可以使用docker来解决这个问题。
首先为什么要使用docker?
我们都知道虚拟机这个东西,它是通过 软件,在电脑上模拟出一些另外的硬件环境,就相当于构造了另一个电脑。有虚拟机这样的软件,就可以使用一个计算机来模拟出多个电脑的情况。
但是虚拟机有一个很大的问题:比较吃配置。对于轻量级的云服务器来说压力很大。
docker可以认为是一个轻量级的虚拟机,它起到了虚拟机这样隔离环境的效果,但是又没有吃很多硬件资源,所以即便是配置比较低的云服务器,也能通过docker构造出好几个这样的虚拟环境。
在docker中有一个重要的关键概念 “容器”,可以看作一个轻量级的虚拟机。
docker的安装及一些配置
安装docker:
需要先安装一些必要的依赖:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common lsb-release gnupg
为了验证Docker软件包的签名,需要添加Docker官方的GPG密钥。可以使用以下命令:
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
接下来,需要将Docker的软件源添加到APT仓库中。输入以下命令:
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
添加完Docker软件源后,再次更新软件包索引:
sudo apt-get update
现在,可以安装Docker CE(Docker社区版)了。输入以下命令:
sudo apt-get install docker-ce docker-ce-cli containerd.io
安装完成后,可以通过运行以下命令来验证Docker是否安装成功:
sudo docker run hello-world
# ubuntu
apt install docker-compose# centos
yum install docker-compose
2.停止之前的redis-server
3.使用docker获取到Redis镜像。
这里说下镜像:
docker中镜像和容器就类似于 “可执行程序” 和 “进程”的关系。
镜像可以自己构建,也可以直接拿别人构建好的。docker hub(类似git hub)上包含了很多大佬们已经构建好的镜像。也提供了Redis官方提供的镜像,我们只要直接拉取下来用就行了。
docker pull redis:5.0.9

拉取下来后,我们可以看一下
docker images

用docker开始搭建:










哨兵节点的作用演示
当我们手动停止redis-server master时,看一下哨兵节点1的日志:

其中我们看到有sdown和odown:
sdown: 主观下线,本哨兵节点认为该主节点挂了。
odown:客观下线,好几个哨兵节点都认为主节点挂了。(达到法定票数了)
当客观认为主节点下线后,此时就需要先选出一个 “leader”哨兵节点,然后由这个哨兵节点选出一个从节点作为新的主节点。
在这个哨兵节点1的日志文件中我们看到,当它主观认为主节点下线后,立马就给自己投了一票(vote for leader 1614xxxxxxxxx。。。)
先看看这三个哨兵节点的id

可以理解为,1号哨兵节点最先发现了主节点下线,然后在选举leader上立马给自己投了一票,并且也通知了其他的哨兵节点进行了主节点下线是否客观的投票,其他节点确认了主节点下线后,就纷纷将选举leader的票投给了最先给它通知的节点,于是1号哨兵就胜出成为了leader

随后就开始了挑选新的主节点的行动

主从切换的具体流程
也就是哨兵重新选取主节点的流程:
1.主观下线:哨兵节点通过心跳包来判定redis服务器是否正常工作,当心跳包没有如约而至的时候,因为这里并不能排除网络波动的影响,所以就只能单方面认为redis节点挂了。
2.客观下线:多个哨兵节点都认为主节点挂了(认为主节点挂了的哨兵节点数量达到了法定票数),此时哨兵节点们就认为这个主节点是客观下线。
3.让多个哨兵节点选出一个 “leader”哨兵节点,每个节点可投出一票。选出leader节点后,由这个leader节点负责选一个从节点作为新的主节点。
关于这里的选leader,当哨兵1发现主节点是客观下线后,就立即给自己投了一票,并且告诉了哨兵2 3,因为它俩的反应慢了半拍,才发现是客观下线,看到哨兵1给它自己投票了,于是纷纷也把票投给哨兵1。 补充:假设哨兵2 3没有投出票的时候,只要收到拉票请求就会投出去,如果有多个拉票请求,那么就会把票投给最先到达的。
如果总的票数超过了哨兵节点的一半,那么就会选举就完成了。所以把哨兵节点的个数设为奇数个就是为了方便投票。

4. 当leader选举完后,此时就需要挑选一个从节点作为新的主节点了。这个挑选也是会先按一定的顺序标准的:
a:先看从节点的优先级:在每个redis数据节点,在配置文件中会有一个slave-priority的选项,这优先级高的节点就会胜出。
b:offset最大的胜出:如果每个节点的优先级都相同,那么就看offset,因为offset越大,说明它与原来主节点同步的进度越好,数据与主节点越接近。
c:run id最大的胜出:如果上述两个都是一样的,那么就看谁的run id最大,就选谁当主节点。
因为run id是每个redis节点启动后随机生成的数字,所以到这里其实就是随缘了。
在选择好新的主节点后,leader就会控制这个节点执行 slaveof no one来成为master,然后再控制其他的节点执行slaveof 让其他的节点以这个新的master作为主节点。
哨兵机制小总结:
这里大部分情况下三个就够用了,并且哨兵节点可以用一些低配机器来部署,但是不能把哨兵节点们都部署在一台机器上,如果这样就有点掩耳盗铃了。
而redis集群就是解决存储容量问题的有效方案。
补充:关于docker拉取镜像响应超时
依次执行:
vi /etc/docker/daemon.json #在配置文件中进行以下
{"registry-mirrors": ["https://docker.m.daocloud.io","https://dockerhub.timeweb.cloud","https://huecker.io"]
}
在文件修改好之后,再依次执行:
sudo systemctl daemon-reloadsudo systemctl restart docker
相关文章:
Redis 哨兵机制
哨兵机制 哨兵机制的介绍 哨兵 (Sentinel) 先来看一下Redis Sentinel 相关名词解释: 在之前的主从复制中,存在一个问题,那就是当主节点挂了后,通过人工干预的方式来解决是比较繁琐且不那么靠谱的。 在实际开发中,对…...
linux-磁盘io情况、性能排查
命令安装 iostat属于sysstat软件包。可以直接安装。 yum install sysstat操作命令解析 iostat %user:CPU处在用户模式下的时间百分比。%nice:CPU处在带NICE值的用户模式下的时间百分比。%system:CPU处在系统模式下的时间百分比。%iowait&a…...
NC 单据模板自定义项 设置参照,比如部门参照、自定义参照等
NC 单据模板自定义项 设置参照(自定义参照) 一、如图下图,NC 单据模板自定义项 设置自定义参照: 1、选择需要设置参照的自定义字段,选择高级属性页签,在类型设置中,数据类型选择参照信息&#…...
table-cascade 使用
stable-cascade 使用教程 English 中文 1.安装最新版本的 Comyfui 2.将 https://huggingface.co/stabilityai/stable-cascade/tree/main 下面的 stage_b 和 stage_c 模型放到 ComfyUI/models/unet 下面 3.将 https://huggingface.co/stabilityai/stable-cascade/tree/main …...
Android SELinux——策略文件配置结构(八)
在 Android 系统中,SELinux 主要是通过一系列配置文件来进行管理和配置的。这些配置文件涵盖了策略定义、标签映射、签名信息等多个方面。 一、SeLinux文件体系 之前提到 Android 架构中大致包含 AOSP、厂商、Vendor 等部分。在 Android 8 以上的系统中,AOSP 和厂商、供应商…...
【数据结构与算法】队列——数据世界中的“有序使者”
大家好,我是小卡皮巴拉 文章目录 目录 引言 一.队列的基本概念 1.1 队列的定义 1.2 队列的特性 1.3 队列的基本操作 二.队列的实现方式 2.1 基于链表的队列 2.2 基于数组的队列 三.基于链表的队列实现 定义链表队列的结构 初始化 入队列——向队列中插…...
yolov11 部署 TensorRT,预处理和后处理用 C++ cuda 加速,速度快到飞起
之前搞过不少部署,也玩过tensorRT部署模型(但都是模型推理用gpu,后处理还是用cpu进行),有网友问能出一篇tensorRT用gpu对模型后处理进行加速的。由于之前用的都是非cuda支持的边缘芯片,没有写过cuda代码&am…...
国际期货收费行情源CTP推送式/期货配资软件开发对接行情源的技术性说明
在现代金融市场中,期货交易因其高风险和高回报特性而备受关注。为了满足期货交易者的需求,开发高效、稳定和安全的期货交易软件变得尤为重要。本文将对国际期货收费行情源CTP推送式及期货配资软件的开发对接行情源的技术细节进行详细说明。 一、CTP&…...
上拉电阻和下拉电阻在电路中的作用(一)
上拉电阻和下拉电阻在电路中的作用(一) 1.什么是上下拉电阻2.上下拉电阻的作用:2.1.维持输入引脚处于稳定状态。2.2.配合三极管和MOS进行电平转换电路设计2.3.OC、OD电路(Open Collector集电极开路、Open Drain漏电极开路…...
怎么轻松把图片存入二维码?图片生成二维码的简单3步技巧
进入数字化时代,图片是目前应用广泛的一种信息传递方式,可以通过看图来获取需要的内容,那么图片如何更快捷的在更多人之间传递呢?通过将图片生成二维码后分享,可以实现图片的快速传递,制作成本也比较低&…...
perl双引号内字符串的反斜线转义
perl双引号内字符串的反斜线转义 如题,下面表格列举了perl双引号内字符串的反斜线转义: 组合意义\n换行\r回车\t水平制表符\f换页符\b退格\a系统响铃\eEsc(ASCII编码的转义字符)\007八进制表示的ASCII值(此例中007表…...
【编程语言】Kotlin快速入门 - 伴生对象与懒加载
静态与顶层方法 静态方法(伴生对象) Java中有静态方法的概念,但是在Kotlin中这个静态方法被弱化了,还记得我们使用object创建一个单例类吗,创建的单例类我们当时可以使用像静态方法一样的调用方式取调用,…...
三、数据聚合和函数
在数据聚合和函数方面,数据库提供了许多功能强大的函数,可以帮助你处理和分析数据。以下是一些常用的函数及其功能的详细说明: COUNT函数: COUNT函数用于计算指定列中的行数。它可以用于统计表中满足特定条件的行数,也…...
Golang | Leetcode Golang题解之第500题键盘行
题目: 题解: func findWords(words []string) (ans []string) {const rowIdx "12210111011122000010020202" next:for _, word : range words {idx : rowIdx[unicode.ToLower(rune(word[0]))-a]for _, ch : range word[1:] {if rowIdx[unico…...
如何实现金蝶商品数据集成到电商系统的SKU
如何实现金蝶商品数据集成到电商SKU系统 金蝶商品数据集成到电商SKU的技术实现 在现代企业的数据管理中,系统间的数据对接与集成是提升业务效率和准确性的关键环节。本文将分享一个实际案例:如何通过轻易云数据集成平台,将金蝶云星辰V2中的商…...
100种算法【Python版】第4篇——回溯法
念念不忘,必有回响 1 回溯法原理2 示例说明2.1 生成子集2.1.1 回溯法思路2.1.2 Python3代码2.2 N皇后问题2.2.1 回溯法思路2.2.2 Python3代码3 回溯法应用3.1 组合3.1.1 回溯法思路3.1.2 Python3代码3.2 数独 Solver3.2.1 回溯法思路3.2.2 Python3代码3.3 多重背包问题3.3.1 P…...
R语言机器学习算法实战系列(九)决策树分类算法 (Decision Trees Classifier)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述数据切割调节参数构建模型模型的决策树预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性保存模…...
听泉鉴宝在三个月前已布局商标注册!
近日“听泉鉴宝”以幽默的风格和节目效果迅速涨粉至2500多万,连线出现“馆藏文物”和“盗墓现场”等内容,听泉鉴宝早在几个月前已布局商标注册。 据普推知产商标老杨在商标局网站检索发现,“听泉鉴宝”的主人丁某所持股的江苏灵匠申请了三十…...
vscode设置特定扩展名文件的打开编码格式
用vscode 编辑c语言或者Verilog代码, 由于其它开发工具的文件编码格式无法修改,默认只能是gb2312, 与我们国内奉行的统一 utf8 不一致. 所以只能是更改特殊文件的打开方式. 配置方式如下. 关键配置如下: {"git.openRepositoryInParentFolders": "never",…...
Linux——动态卷的管理
确保已经设置了对应的动态卷的驱动(provisioner 制备器)基于动态驱动创建对应的存储类创建PVC (PVC 将会自动根据大小、访问模式等创建PV)Pod的spec 中通过volumes 和 volumemounts 来完成pvc 的绑定和pvc对应pv的挂载删除pod 不…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
