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 配置文件:

在这里插入图片描述

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

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

相关文章

请求响应(后端必备)

一、请求 1.简单参数 原始方式: 在原始的web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取 RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){String name request.getP…

什么叫价内期权?直接带你了解期权价内期权怎么使用?!

今天带你了解什么叫价内期权?直接带你了解期权价内期权怎么使用?!价内期权是具有内在价值的期权。期权持有人行权时,对看涨期权而言,行权价格低于标的证券结算价格;对看跌期权而言,标的证券结算…

js 请求blob:https:// 图片

方式1 def get_file_content_chrome(driver, uri):result driver.execute_async_script("""var uri arguments[0];var callback arguments[1];var toBase64 function(buffer){for(var r,nnew Uint8Array(buffer),tn.length,anew Uint8Array(4*Math.ceil(t/…

前端Vue组件化实践:自定义加载组件的探索与应用

在前端开发领域,随着业务逻辑复杂度的提升和系统规模的不断扩大,传统的开发方式逐渐暴露出效率低下、维护困难等问题。为了解决这些挑战,组件化开发作为一种高效、灵活的开发模式,受到了越来越多开发者的青睐。本文将结合实践&…

Java基础及进阶

JAVA特性 基础语法 一、Java程序的命令行工具 二、final、finally、finalize 三、继承 class 父类 { //代码 }class 子类 extends 父类 { //代码 }四、Vector、ArrayList、LinkedList 五、原始数据类型和包装类 六、接口和抽象类 JAVA进阶 Java引用队列 Object counter ne…

PostgreSQL行级安全策略探究

前言 最近和朋友讨论oracle行级安全策略(VPD)时,查看了下官方文档,看起来VPD的原理是针对应用了Oracle行级安全策略的表、视图或同义词发出的 SQL 语句动态添加where子句。通俗理解就是将行级安全策略动态添加为where 条件。那么PG中的行级安全策略是怎…

搭建基于 ChatGPT 的问答系统

搭建基于 ChatGPT 的问答系统 📣1.简介📣2.语言模型,提问范式和 token✨2.1语言模型✨2.2Tokens✨2.3Helper function辅助函数(提问范式) 📣3.评估输入-分类📣4.检查输入-审核✨4.1审核4.1.1 我…

使用UDP通信接收与发送Mavlink2.0协议心跳包完整示例

1.克隆mavlink源码 https://github.com/mavlink/mavlink.git 2.进入mavlink目录,安装依赖 python3 -m pip install -r pymavlink/requirements.txt 3.生成Mavlink的C头文件 mavlink % python3 -m pymavlink.tools.mavgen --lang=C --wire-protocol=2.0 --output=generated…

1-5岁幼儿胼胝体的表面形态测量

摘要 胼胝体(CC)是大脑中的一个大型白质纤维束,它参与各种认知、感觉和运动过程。尽管CC与多种发育和精神疾病有关,但关于这一结构的正常发育(特别是在幼儿阶段)还有很多待解开的谜团。虽然早期文献中报道了性别二态性,但这些研究的观察结果…

【Linux网络】select{理解认识select/select与多线程多进程/认识select函数/使用select开发并发echo服务器}

文章目录 0.理解/认识回顾回调函数select/pollread与直接使用 read 的效率差异 1.认识selectselect/多线程(Multi-threading)/多进程(Multi-processing)select函数socket就绪条件select的特点总结 2.select下echo服务器封装套接字…

C++ 类和对象 赋值运算符重载

前言: 在上文我们知道数据类型分为自定义类型和内置类型,当我想用内置类型比较大小是非常容易的但是在C中成员变量都是在类(自定义类型)里面的,那我想给类比较大小那该怎么办呢?这时候运算符重载就出现了 一 运算符重载概念&…

安全防御:防火墙基本模块

目录 一、接口 1.1 物理接口 1.2 虚拟接口 二、区域 三、模式 3.1 路由模式 3.2 透明模式 3.3 旁路检测模式 3.4 混合模式 四、安全策略 五、防火墙的状态检测和会话表技术 一、接口 1.1 物理接口 三层口 --- 可以配置IP地址的接口 二层口: 普通二层…

Java面试题:分库分表

分库分表 当数据量非常大时,就需要通过分库分表的方式进行压力分摊,避免数据库访问压力过大 分库分表的前提: 业务数据达到一定量级:单表数据量达到1000w或20g 优化解决不了性能问题 分库分表策略 垂直拆分 垂直分库 以表为依据,根据业务将不同表拆分到不同库中 eg:根…

车载终端_RTK定位|4路摄像头|驾驶辅助系统ADAS定制方案

现代车辆管理行业的发展趋势逐渐向智能化和高效化方向发展,车载终端成为关键的工具之一。在这个背景下,一款特别为车队管理行业设计的车载终端应运而生。该车载终端采用8寸多点触控电容屏,搭载联发科四核处理器,主频2.0GHz&#x…

如何安装node.js

Node.js Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。 主要特点和优势: 非阻塞 I/O 和事件驱动:能够高效处理大量并发连接,非常适合构建高并发的网络应用,如 Web 服务器、实时聊天应用等。 例如,在…

FeignClient详解

FeignClient 是 Spring Cloud Open Feign 中的一个注解,它用于定义一个 Feign 客户端,Feign 是一个声明式的 Web 服务客户端,使得编写 Web 服务客户端变得更加简单。以下是 FeignClient 注解的详细说明: 定义 Feign 客户端&#x…

网络安全——防御(防火墙)带宽以及双机热备实验

12,对现有网络进行改造升级,将当个防火墙组网改成双机热备的组网形式,做负载分担模式,游客区和DMZ区走FW3,生产区和办公区的流量走FW1 13,办公区上网用户限制流量不超过100M,其中销售部人员在其…

Swift入门笔记

Swift入门笔记 简单值控制流函数和闭包对象和类枚举和结构体并发协议和扩展错误处理泛型 简单值 // 声明变量 var myVariable 42 myVariable 50// 声明常量 let myConstant 42// 声明类型 let implicitInteger 70 let implicitDouble 70.0 let explicitDouble: Double 7…

排序相关算法--3.选择排序

之前涉及的堆排序就是选择排序的一种,先进行选择。 基本选择排序: 最简单,也是最没用的排序算法,时间复杂度高并且还是不稳定的排序方法,项目中很少会用。 过程: 在一个长度为 N 的无序数组中,…