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 不…...

第三季度中国游戏市场收入创历史新高;京东物流与淘宝天猫达成合作;YouTube 上线“用相机拍摄”标签....|网易数智日报
第三季度中国游戏市场收入917.66亿,创历史新高 中国音数协游戏工委今日发布了最新的 2024 年第三季度中国游戏产业季度报告。 数据显示,2024 年第三季度中国游戏市场收入 917.66 亿元,环比增长 22.96%,同比增长 8.95%。 中国音…...

智慧城管综合管理系统源码,微服务架构,基于springboot、vue+element+uniapp技术开发,支持二次开发
智慧城管源码,智慧城管执法办案系统源码 智慧城管综合执法办案平台是智慧城市框架下,依托物联网、云计算、多网融合等现代化技术,运用数字基础资源、多维信息感知、协同工作处置、智能化辅助决策分析等手段,形成具备高度感知、互联…...

2024Flutter面试题
1.Dart是值传递还是引用传递? dart是值传递。 每次调用函数,传递过去的都是对象的内存地址,而不是这个对象的赋值。 2.简述Dart语音特性 在Dart中,一切都是对象,所有的对象都是继承自Object Dart是强类型语言&#…...

MySQL-23.多表查询-内连接
一.内连接 -- 多表查询 select * from tb_emp,tb_dept where tb_emp.dept_id tb_dept.id;-- 内连接 -- A.查询员工的姓名,及所属的部门名称(隐式内连接实现) select tb_emp.name as 员工姓名,tb_dept.name as 部门名称 from tb_emp,tb_dep…...

实用的 Python 小脚本
一、引言 在日常办公和电脑使用中,我们经常会遇到一些重复性的任务或需要快速获取特定信息的情况。Python 作为一种强大而灵活的编程语言,可以用来编写各种小脚本,以自动化这些任务并提高工作效率。本文将介绍一些 Python 常用的小脚本&…...

哪种掏耳朵方式好?正确的掏耳工具!
人体的耳屎会随着活动量加大而增加,如果长期不清理,耳屎堆积在耳道深处很有可能会堵塞鼓膜甚至影响听力。但如果需要清理耳屎的话,哪种掏耳朵方式好呢?可视挖耳勺可以帮助我们在全程可视的情况下,精准有效地完成采耳&a…...

如何让别人喜欢你的代码
良好的编码习惯是编程人员的基本素养,有利于后期人员的维护和查看。 毕竟大家都喜欢美女和靓仔 目录 js函数注释规范 案例 其他 推荐链接 js函数注释规范 常用符号 说明 用法 param 参数 param {type} name return 返回值 return {type} 案例 /***…...

【Flutter】Dart:库
在 Dart 中,库(Library)是组织和重用代码的基本方式。通过库,我们可以将代码分割成模块化的部分,方便管理和共享,同时避免命名冲突。Dart 提供了大量内置库,用于支持常见的功能,比如…...

从0开始深度学习(18)——环境和分布偏移
有时,根据测试集的精度衡量,模型表现得非常出色。 但是当数据分布突然改变时,模型在部署中会出现灾难性的失败。 有时模型的部署本身就是扰乱数据分布的催化剂。 举一个有点荒谬却可能真实存在的例子。 假设我们训练了一个贷款申请人违约风险…...

Java项目-基于springboot框架的线上买菜系统项目实战(附源码+文档)
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...