Redis从入门到精通(十四)Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

文章目录

    • 前言
    • 5.3 Redis哨兵
      • 5.3.1 哨兵原理
        • 5.3.1.1 集群的结构和作用
        • 5.3.1.2 集群监控原理
        • 5.3.1.3 集群故障恢复原理
      • 5.3.2 搭建哨兵集群
      • 5.3.3 RedisTemplate
        • 5.3.3.1 搭建测试项目
        • 5.3.3.2 场景测试

前言

Redis分布式缓存系列文章:

Redis从入门到精通(十三)Redis分布式缓存(一)RDB和AOF持久化、Redis主从集群的搭建与原理分析

5.3 Redis哨兵

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。

5.3.1 哨兵原理

5.3.1.1 集群的结构和作用

哨兵的结构如图:

哨兵的作用如下:

  • 监控:Sentinel会不断检查master和slave是否按预期工作;
  • 自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后,将作为新的master的slave节点加入集群。
  • 通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端。
5.3.1.2 集群监控原理

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

  • 主观下线:如果某Sentinel节点发现某Redis实例未在规定时间响应,则认为该Redis实例主观下线。
  • 客观下线:若超过指定数量(quorum)的Sentinel都认为该Redis实例主观下线,则该Redis实例客观下线。quorum值最好超过Sentinel实例数量的一半。

5.3.1.3 集群故障恢复原理

一旦发现master故障,Sentinel需要在salve中选择一个作为新的master,选择依据是这样的:

  • 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds * 10)则会排除该slave节点;
  • 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举;
  • 如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高;
  • 最后是判断slave节点的运行id大小,越小优先级越高。

当选出一个新的master后,Sentinel会进行角色切换,切换流程是这样的:

  • Sentinel给备选的slave1节点发送slaveof no one命令,让该节点成为master;
  • Sentinel给所有其它slave发送slaveof <ip> <port>命令,让这些slave成为新master的从节点,开始从新的master上同步数据;
  • 最后,Sentinel将故障节点标记为slave,当故障节点恢复后会自动成为新的master的slave节点。

5.3.2 搭建哨兵集群

这里将搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。同样,可以在一台虚拟机上创建3个不同端口(27001、27002、27003)的Sentinel实例,来模拟Sentinel集群。

搭建步骤:

  • 1)在/usr/local/redis目录下创建3个目录,名称分别是s1、s2、s3:

  • 2)分别在s1、s2、s3目录下创建配置文件sentinel.conf,添加下面的内容:
# 端口
port 27001
# 以后台进程启动
daemonize yes
sentinel announce-ip "192.168.146.128"
# 指定主节点信息# mymaster 主节点名称,自定义,任意写# 192.168.146.128 7001 主节点的IP和端口# 2 选举master时的quorum值
sentinel monitor mymaster 192.168.146.128 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
# 文件目录
dir "/usr/local/redis/s1"
# 日志文件目录
logfile "/usr/local/redis/s1/sentinel_27001.log"

s1、s2、s3的配置文件中port、dir、logfile应改成各自对应的,其余配置可保持一致。

  • 3)启动3个Sentinel实例**
/usr/local/bin/redis-sentinel /usr/local/redis/s1/sentinel.conf
/usr/local/bin/redis-sentinel /usr/local/redis/s2/sentinel.conf
/usr/local/bin/redis-sentinel /usr/local/redis/s3/sentinel.conf

启动完成后,可查看Sentinel进程如下:

  • 4)测试哨兵作用

尝试让master节点7001宕机,查看Sentinel 27001的日志:

查看7002的日志:

查看7003的日志:

查看此时Redis集群的状态:

至此,Redis哨兵集群搭建完成,并正常工作。

5.3.3 RedisTemplate

在Sentinel集群监管下的Redis主从集群,其节点的角色会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。

Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。

5.3.3.1 搭建测试项目

下面搭建一个SpringBoot项目来进行测试,步骤如下:

  • 1)引入依赖
<!--pom.xml--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>
</dependencies>
  • 2)编写配置文件
// src/main/resources/application.ymlserver:port: 8082
spring:application:name: redis_learning_clusterredis:# Redis主从集群的主节点host: 192.168.146.128port: 7001password: 123321# Redis哨兵集群配置sentinel:master: mymasternodes:- 192.168.146.128:27001- 192.168.146.128:27002- 192.168.146.128:27003lettuce:pool:max-active: 10max-idle: 10min-idle: 1time-between-eviction-runs: 10sjackson:default-property-inclusion: non_null# 修改日志级别为Debug,这样才能查看到RedisTemplate具体连接了哪个实例
logging:level:root: DEBUG
  • 3)编写主启动类
// com.star.redis.cluster.RedisClusterApp@SpringBootApplication
public class RedisClusterApp {public static void main(String[] args) {SpringApplication.run(RedisClusterApp.class, args);}@Beanpublic LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer() {// 配置读写策略// MASTER 从master节点读取// MASTER_PREFERRED 优先从master节点读取,master不可用才读取replica节点// REPLICA 从slave(replica)节点读取// REPLICA_PREFERRED 优先从slave(replica)节点读取,所有的slave都不可用才读取master节点return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);}}
  • 4)编写Controller类
// com.star.redis.cluster.controller.RedisController@RestController
@RequestMapping("/redis")
public class RedisController {@Resourceprivate StringRedisTemplate stringRedisTemplate;@GetMapping("/get/{key}")public String get(@PathVariable String key) {return stringRedisTemplate.opsForValue().get(key);}@GetMapping("/set/{key}/{value}")public String set(@PathVariable String key, @PathVariable String value) {stringRedisTemplate.opsForValue().set(key, value);return "success";}
}
5.3.3.2 场景测试

首先检查一下当前Redis主从集群的状态:

此时7003实例是master节点,7001、7002实例是slave节点。

场景一:调用/redis/set/name/Rose接口,由日志可知写操作由master节点7003实例完成:

场景二:调用/redis/get/name接口,由日志可知读操作由slave节点7002实例完成:

场景三:如果此时master节点7003宕机了,Sentinel会重新选举一个master,这里选择的是7001:

场景四:再次调用/redis/set/name/Rose接口,由日志可知写操作由master节点7001实例完成,意味着RedisTemplate感知到了主从节点的变化:

场景五:再次调用/redis/get/name接口,由日志可知读操作由slave节点7002实例完成:

至此,Redis哨兵集群搭建完毕,且正常工作。

本节完,更多内容请查阅分类专栏:Redis从入门到精通

感兴趣的读者还可以查阅我的另外几个专栏:

  • SpringBoot源码解读与原理分析(已完结)
  • MyBatis3源码深度解析(已完结)
  • 再探Java为面试赋能(持续更新中…)

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

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

相关文章

VM虚拟机安装Linux系统Redhat7.4版本

1、打开VM软件创建一个新的虚拟机&#xff1a; 可选择经典安装&#xff0c;也可以选择自定义安装&#xff0c;本次选择自定义安装&#xff0c;然后选择下一步 2、直接默认选择下一步即可 3、选择稍后安装操作系统&#xff0c;选择下一步 4、之后选择呢需要安装客户机的操作系统…

[Algorithm][滑动窗口][长度最小的子数组] + 滑动窗口原理

目录 0.滑动窗口原理讲解1.长度最小的子数组1.题目链接2.算法原理讲解3.代码实现 0.滑动窗口原理讲解 滑动窗口&#xff1a;“同向双指针”滑动窗口可处理「⼀段连续的区间」问题如何使用&#xff1f; left 0, right 0进窗口判断 是否出窗口 更新结果 -> 视情况而定 可能…

ChatGPT4.5:能力大提升,全新体验

说明 ChatGPT4是2023年的5月份发布的&#xff0c;马上就发布一周年了。其他的大语言模型&#xff0c;比如Claude和开源的Lama也相继更新了最新版本。而根据目前国外发布的各种消息来看&#xff0c;ChatGPT4.5也即将发布。 GPT-4.5 Turbo 发布时间 最新消息显示&#xff0c;Op…

OceanBase 4.3 列存存储格式和列存索引存储格式

以 t1 表和索引为例子&#xff0c;下面两张图说明了存储层如何存储数据。 create table t1 (id1 int, id2 int, name varchar(10), salary int, primary key(id1, id2)) with column group (each column);create index idx (name) storing(salary) with column group(each co…

【力扣】55. 跳跃游戏 - 力扣(LeetCode)

Problem: 55. 跳跃游戏 记录自己解答的思路和代码 文章目录 问题思路复杂度Code 问题 思路 这个题的主要思路就是先找到0对应的位置&#xff0c;然后标记起来对应left&#xff0c;如果只有一个零&#xff0c;只需要left后面的数中有>1的数就能跳过去&#xff0c;如果是00&a…

深澜计费管理系统 /demo/proxy存在任意文件读取漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 深澜计费管理系统是一款用于网络设备计费管理的软件…

案例实践 | InterMat:基于长安链的材料数据发现与共享系统

案例名称&#xff1a;InterMat-基于区块链的材料数据发现与共享系统 ■ 建设单位 北京钢研新材科技有限公司 ■ 用户群体 材料数据上下游单位 ■ 应用成效 已建设10共识节点、50轻节点&#xff0c;1万注册用户 案例背景 材料是构成各种装备和工程的物质载体&#xff0c…

【.Net动态Web API】背景与实现原理

&#x1f680;前言 本文是《.Net Core进阶编程课程》教程专栏的导航站&#xff08;点击链接&#xff0c;跳转到专栏主页&#xff0c;欢迎订阅&#xff0c;持续更新…&#xff09; 专栏介绍&#xff1a;通过源码实例来讲解Asp.Net Core进阶知识点&#xff0c;让大家完全掌握每一…

设计模式———单例模式

单例也就是只能有一个实例&#xff0c;即只创建一个实例对象&#xff0c;不能有多个。 可能会疑惑&#xff0c;那我写代码的时候注意点&#xff0c;只new一次不就得了。理论上是可以的&#xff0c;但在实际中很难实现&#xff0c;因为你无法预料到后面是否会脑抽一下~~因此我们…

【记录】Python|Selenium 下载 PDF 不预览不弹窗(2024年)

版本&#xff1a; Chrome 124Python 12Selenium 4.19.0 版本与我有差异不要紧&#xff0c;只要别差异太大比如 Chrome 用 57 之前的版本了&#xff0c;就可以看本文。 如果你从前完全没使用过、没安装过Selenium&#xff0c;可以参考这篇博客《【记录】Python3&#xff5c;Sele…

大型网站系统架构演化实例_1.单体架构和垂直架构

大型网站的技术挑战主要来自于庞大的用户&#xff0c;高并发的访问和海量的数据&#xff0c;任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户&#xff0c;问题就会变得很棘手。通常大型网站架构主要解决这类问题。 1.第一阶段&#xff1a;单体架构 大型网站都是…

安防视频监控/视频集中存储EasyCVR平台级联时,下级平台未发流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Go 单元测试之Mysql数据库集成测试

文章目录 一、 sqlmock介绍二、安装三、基本用法四、一个小案例五、Gorm 初始化注意点 一、 sqlmock介绍 sqlmock 是一个用于测试数据库交互的 Go 模拟库。它可以模拟 SQL 查询、插入、更新等操作&#xff0c;并且可以验证 SQL 语句的执行情况&#xff0c;非常适合用于单元测试…

如何安装MacOS的虚拟机?mac安装虚拟机的步骤 虚拟机安装MacOS VMware Fusion和Parallels Desktop19

要在Mac上运行MacOS的虚拟机&#xff0c;常用的方法是使用虚拟化软件如VMware Fusion或Parallels Desktop。 以下是安装MacOS的虚拟机的主要步骤&#xff1a; 1. 检查系统要求&#xff1a;确定您的Mac硬件和操作系统满足安装要求。您需要一台具备足够性能的Mac&#xff0c;并…

【前端Vue】Vue从0基础完整教程第7篇:组件化开发,组件通信【附代码文档】

Vue从0基础到大神学习完整教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;vue基本概念&#xff0c;vue-cli的使用&#xff0c;vue的插值表达式&#xff0c;{{ gaga }}&#xff0c;{{ if (obj.age > 18 ) { } }}&#xff0c;vue指令&#xff0c;综合…

GPT国内怎么用?4月最新版本来了

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

37、Tomato(VulnHub)

Tomato 一、nmap 2211是ssh的端口&#xff0c;21的ftp也不是弱密码 二、web渗透 随便看看 目录爆破 /seclists/Discovery/Web-Content/common.txt /antibot_image/antibots/readme.txt 发现该站点存在反爬机制 /antibot_image/antibots/info.php 提示我们该网页存在个参数 GET&…

FineBI 6.0 Linux 部署、ClickHouse 源配置

文章目录 FineBI 概述FineBI 部署安装环境说明1.下载安装包2.安装3.初始化设置4.登录5.快速入门 启动与关闭启动关闭 ClickHouse 源配置开启驱动上传功能驱动上传数据库连接配置基础表属性设置数据导入 FineBI 概述 FineBI 是一款国产的商业智能&#xff08;BI&#xff09;软件…

Quartz + SpringBoot 实现分布式定时任务

文章目录 前言一、分布式定时任务解决方案二、Quartz是什么&#xff1f;1.quartz简介2.quartz的优缺点 二、Quartz分布式部署总结 前言 因为应用升级&#xff0c;由之前的单节点微服务应用升级为集群微服务应用&#xff0c;所以之前的定时任务Spring Scheduled不再适用了&…

固定测斜仪:工程观测的精密利器

在工程观测测量领域&#xff0c;固定测斜仪扮演着至关重要的角色。固定测斜仪&#xff0c;凭借其耐冲击型倾斜传感器、出色的可靠性、快速稳定的特点&#xff0c;以及简洁的安装和智能识别功能&#xff0c;已成为行业内重要工具。其输出信号为RS485数字量&#xff0c;可直接显示…