Redis 7.x 系列【23】哨兵模式

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 概述
    • 2. 工作原理
      • 2.1 监控
      • 2.2 标记下线
      • 2.3 哨兵领袖
      • 2.4 新的主节点
      • 2.5 通知更新
    • 3. 搭建演示
      • 3.1 安装
      • 3.2 修改配置
      • 3.3 启动
      • 3.4 测试

1. 概述

官方文档

主从复制模式常用于数据备份和读写分离,当主节点故障时,需要人工干预来处理主节点故障和从节点的升级,在实际应用中,可用性并不高。

Redis 提供了基于哨兵(Sentinel)的高可用解决方案,Sentinel是一个运行在特殊模式下的 Redis 服务端,本身不存储任何数据,而是作为主从复制模式下的监控和管理工具。当主节点出现故障时,可以提供自动故障转移功能,从而保证 Redis 服务的连续性和稳定性。

核心功能:

  • 监控:持续检查主节点和从节点实例是否按预期工作
  • 通知:可以通过 API 通知系统管理员或其他计算机程序,被监控的Redis实例出现问题
  • 自动故障转移:如果主节点未按预期工作,启动故障转移过程,将其中一个从节点被提升为主节点,其他的从节点重新配置使用新的主节点,并且通知在连接时使用的新地址
  • 配置中心:客户端通过连接哨兵来获得当前Redis服务的主节点地址

2. 工作原理

2.1 监控

Redis Sentinel 在启动完成后,首先需要连接到到主从节点进行监控:

在这里插入图片描述

Sentinel 配置文件中,首先需要配置主节点的地址,首次上线时,会根据该地址连接到主节点,并定期(通常是每1秒)向主节点发送 PING 命令来检查其状态。

Sentinel 连接到主节点后,还会通过 INFO 命令获取所有从节点的地址信息,建立和从节点的连接,并同样采用心跳机制进行状态检查。

多个 Sentinel 节点之间,也需要进行通信,会在主节点中建立一个 __sentinel__:hello 专用通道,利用发布订阅机制进行数据交互。可以使用可视化工具查看:

在这里插入图片描述

2.2 标记下线

当某个 Sentinel 节点发送 PING 命令后,主节点在规定的时间内没有响应,则会标记为主观下线Subjectively Down)状态,其他 Sentinel 节点同样也会检测到主节点下线,并标记为主观下线。当主节点被足够数量的 Sentinel 节点都标记为 S_DOWN ,则标记为客观下线Objectively Down)状态。

sentinel monitor 配置项中,可以设置主节点被多少个 Sentinel 标记为 S_DOWN 时,则标记为O_Down

sentinel monitor mymaster 127.0.0.1 6379 2

主观下线客观下线,需要多个哨兵达成一致意见,才能认为主节点客观上已经宕掉,这一步骤是为了防止单个 Sentinel 节点的误判。

2.3 哨兵领袖

当主节点被判定为客观下线后,哨兵节点之间会进行投票选举,以选出哨兵领袖(Leader Sentinel),负责后续的故障转移工作。

整个选举过程基于 Raft 算法,当半数以上的哨兵投票通过后就认定该哨兵为哨兵领袖,所以一般将哨兵数量部署为单数,避免脑裂

2.4 新的主节点

Leader Sentinel 会在从节点中,选择一个新的主节点,选择的标准一般有:

  • 响应速度,慢的就会被优先过滤掉,说明健壮性不够
  • 节点配置的优先级,优先级越高,越容易被选中
  • 数据偏移量,偏移量越大,说明数据复制的完整度越高
  • 节点创建时间,越早创建的节点,会优先选择( 根据RunId 排序)

选出新的主节点后,Leader Sentinel 会调用 REPLICAOF 命令将选出的新节点升级为主节点,其他的从节点更新配置信息,并连接到新的主节点,并确保和新主节点之间的数据同步。

2.5 通知更新

Leader Sentinel 通过发布订阅通知其他哨兵节点,还可以通过 API 或者脚本发送通知,报告集群的状态变化和故障情况。

3. 搭建演示

数据节点直接使用之前搭建的一主两从环境,在此基础上搭建三个哨兵节点,简要部署架构图如下:

在这里插入图片描述
所有节点网络访问地址如下 :

  • 主节点:192.168.56.101:6379
  • 从节点一:192.168.56.102:6379
  • 从节点二:192.168.56.103:6379
  • 哨兵节点一:192.168.56.104:26379
  • 哨兵节点二:192.168.56.105:26379
  • 哨兵节点三:192.168.56.106:26379

3.1 安装

Redis 7.x 系列【2】单机部署
Redis 7.x 系列【21】主从复制

Redis Sentinel也是一个特殊的 Redis 服务端,安装方法和普通的 Redis 一样,参考上面的文档,在三台哨兵服务器上安装即可。

3.2 修改配置

接下来需要修改所有哨兵节点的配置文件,首先从源码中将 sentinel.conf 配置文件复制到配置目录:

[root@localhost /]# mkdir /etc/redis
[root@localhost /]# cp ~/redis-7.2.5/sentinel.conf /etc/redis/
[root@localhost bin]# vim sentinel.conf

三个哨兵节点都需要修改配置,首先允许后台启动:

daemonize yes

配置当前监控的主节点的名称、IP、端口,以及进行故障转移的最少的投票数:

sentinel monitor mymaster 192.168.56.101 6379 2

如果主从节点设置了密码,还需要配置主节点名称、认证密码 (主从密码需要保持一致):

sentinel auth-pass mymaster 123456

可以配置 Sentinel 节点的密码(其他哨兵节点的密码需要保持一致):

requirepass entinel123456

3.3 启动

这里直接使用命令启动,先启动所有主从复制节点,再启动所有哨兵节点:

[root@localhost bin]# cd /usr/local/bin
[root@localhost bin]# ./redis-sentinel /etc/redis/sentinel.conf

3.4 测试

使用 ./redis-cli 连接任一哨兵节点:

[root@localhost bin]# ./redis-cli -p 26379
127.0.0.1:26379> auth sentinel123456
OK

输入 info sentinel 查看所有哨兵信息,可以看到当前连接的主节点地址为 192.168.56.101:6379 ,以及从节点和哨兵节点的数量:

127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.56.101:6379,slaves=2,sentinels=3

在主节点服务器上,直接 kill 掉主节点进程:

[root@localhost bin]# ps -ef | grep redis
root     16305     1  0 01:05 ?        00:00:29 ./redis-server *:6379
root     19902 19252  0 11:18 pts/2    00:00:00 grep --color=auto redis
[root@localhost bin]# kill 16305

再次执行 info sentinel 命令,可以看到主节点地址变成了 192.168.56.102:6379 ,自动进行了故障转移,并选举了新的主节点(当之前下线的主节点重新连接后,会降级为从节点):

127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.56.102:6379,slaves=3,sentinels=3

查看 sentinel.conf 配置文件,可以看到自动更新了主节点:

在这里插入图片描述

还会自动更新从节点 redis.conf 配置文件:

在这里插入图片描述

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

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

相关文章

JMeter案例分享:通过数据验证的错误,说说CSV数据文件设置中的线程共享模式

前言 用过JMeter参数化的小伙伴,想必对CSV Data Set Config非常熟悉。大家平时更关注变量名称,是否忽略首行等参数,其余的一般都使用默认值。然而我最近遇到一个未按照我的预想读取数据的案例,原因就出在最后一个参数“线程共享模…

服务重启时容器未自动启动

1、容器重启策略 通过设置容器的重启策略,‌可以决定在容器退出时Docker守护进程是否重启该容器。‌常见的重启策略包括:‌ no:‌不重启容器,‌默认策略。‌always:‌无论容器是如何退出的,‌总是重启容器…

keil配置irom偏移地址进行IAP,偏移地址不生效问题解决

如果keil配置了 IROM1 偏移地址,但是生成的hex,程序并没有偏移,问题多半是出现在linker里如下图所示。选择了分散加载,所以keil配置地址偏移不生效。 点开edit 更改分散加载的地址偏移即可。 偏移成功,可以IAP了。

算法学习笔记(8.5)-零钱兑换问题二

目录 Question: 动态规划思路: 代码实现: 空间优化代码 Question: 给定n种硬币,第i种硬币的面值为coins[i-1],目标金额为amt,每种硬币可以重复选取,问凑出目标金额的硬币组合数量。 动态规划思路…

Java 线程池详解

序言 在高并发编程中,线程池是一个非常重要的组件。它不仅能够有效地管理和复用线程资源,还可以提升应用程序的性能和稳定性。本文将详细介绍Java中的线程池机制,以及如何正确地使用线程池。 一、什么是线程池 线程池是一组已经初始化并等…

ftp pool 功能分析及 golang 实现

本文探究一种轻量级的 pool 实现 ftp 连接。 一、背景 简要介绍:业务中一般使用较多的是各种开源组件,设计有点重,因此本文探究一种轻量级的 pool 池的思想实现。 期望:设置连接池最大连接数为 N 时,批量执行 M 个 F…

超时导致SparkContext构造失败的问题探究

文章目录 1.前言2. 基于事故现场对问题进行分析2.1 日志分析2.2 单独测试Topology代码试图重现问题 3. 源码解析3.1 Client模式和Cluster模式下客户端的提交和启动过程客户端提交时在两种模式下的处理逻辑ApplicationMaster启动时在两种模式下的处理逻辑 3.2 两种模式下的下层角…

OSPF.综合实验

1、首先将各个网段基于172.16.0.0 16 进行划分 1.1、划分为4个大区域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四个网段 划分R4 划分area2 划分area3 划分area1 2、进行IP配置 如图使用配置指令进行配置 ip address x.x.x.x /x 并且将缺省路由…

uniapp编译成h5后接口请求参数变成[object object]

问题:uniapp编译成h5后接口请求参数变成[object object] 但是运行在开发者工具上没有一点问题 排查: 1:请求参数:看是否是在请求前就已经变成了[object object]了 结果: 一切正常 2:请求头:看…

2024辽宁省数学建模C题【改性生物碳对水中洛克沙胂和砷离子的吸附】原创论文分享

大家好呀,从发布赛题一直到现在,总算完成了2024 年辽宁省大学数学建模竞赛C题改性生物碳对水中洛克沙胂和砷离子的吸附完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃…

OpenGL笔记九之彩色三角形与重心插值算法

OpenGL笔记九之彩色三角形与重心插值算法 —— 2024-07-07 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记九之彩色三角形与重心插值算法1.运行3.main.cpp 1.运行 3.main.cpp 代码 #include <iostream>#define DEBUG//注意&#xff1a;glad…

虚拟机centos连接xshell

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

VsCode远程ssh连接失败:Could not establish connection to XXX

一、问题描述 在VsCode中按下"F1"&#xff0c;选择Remote-SSH:Connect to Host 选择一个已经配置好的SSH主机&#xff0c;比如我选择的是192.168.0.104&#xff1a; 结果提示&#xff1a;Could not establish connection to XXX 二、解决方法 观察VsCode的输出信息…

几何建模-Parasolid中GO功能使用

1.背景介绍 1.1 Parasolid和它的接口间关系 1.2 什么是GO GO全称是Graphical Output.你的程序需要在屏幕或者打印设备上显示模型数据时。在需要使用PK中的某个渲染函数时创建图形显示数据时&#xff0c;Parasolid会调用GO相关的函数。GO函数会输出绘图指令给你的应用程序提供…

《昇思25天学习打卡营第20天|onereal》

应用实践/LLM原理和实践/基于MindSpore的GPT2文本摘要 基于MindSpore的GPT2文本摘要 数据集加载与处理 数据集加载 本次实验使用的是nlpcc2017摘要数据&#xff0c;内容为新闻正文及其摘要&#xff0c;总计50000个样本。 数据预处理 原始数据格式&#xff1a; article: [CLS…

MySQL-基础点

目录 MySQL概念 数据库三大范式是什么&#xff1f; blob 和 text 有什么区别&#xff1f; DATETIME 和 TIMESTAMP 的异同&#xff1f; MySQL 中 in 和 exists 的区别&#xff1f; MySQL 里记录货币用什么字段类型比较好&#xff1f; MySQL 怎么存储 emoji? 用过哪些 M…

MongoDB7出现:Windows下使用mongo命令提示不是内部或外部命令

确保环境变量添加正确的情况&#xff0c;仍然出现这种问题。如果安装的是新版本&#xff0c;则大概率是新版本mongodb的bin里面没有mongo命令 解决方案&#xff1a; 下载mongodb shell 下载链接 把shell的命令放进来 启用命令&#xff1a;mongosh

浅谈数学模型在UGC/AIGC游戏数值调参中的应用(AI智能体)

浅谈数学模型在UGC/AIGC游戏数值调参中的应用 ygluu 卢益贵 关键词&#xff1a;UGC、AIGC、AI智能体、大模型、数学模型、游戏数值调参、游戏策划 一、前言 在策划大大群提出《游戏工厂&#xff1a;AI&#xff08;AIGC/ChatGPT&#xff09;与流程式游戏开发》讨论之后就已完…

每日一练,java

目录 描述示例 总结 描述 题目来自牛客网 •输入一个字符串&#xff0c;请按长度为8拆分每个输入字符串并进行输出&#xff1b; •长度不是8整数倍的字符串请在后面补数字0&#xff0c;空字符串不处理。 输入描述&#xff1a; 连续输入字符串(每个字符串长度小于等于100) 输…

JDK14新特征最全详解

JDK 14一共发行了16个JEP(JDK Enhancement Proposals&#xff0c;JDK 增强提案)&#xff0c;筛选出JDK 14新特性。 - 343: 打包工具 (Incubator) - 345: G1的NUMA内存分配优化 - 349: JFR事件流 - 352: 非原子性的字节缓冲区映射 - 358: 友好的空指针异常 - 359: Records…