Redis 3.x——哨兵客户端连接

Spring Boot 3.x集成Redis连接问题排查指南 Redis作为高性能的内存数据库,在现代分布式系统中广泛用于缓存、会话存储等场景。其基于RESP协议的通信机制和客户端-服务器架构,要求开发者正确配置网络参数和协议版本。Spring Boot通过Lettuce客户端实现Redis集成,但在3.x版本中可能遇到连接失败问题,这通常涉及网络配置、协议兼容性或连接池设置等技术细节。通过分析连接超时、认证失败等典型场景,结合Lettuce客户端的特性排查,可以解决大多数Redis连接问题。特别是在微服务架构下,合理的连接池配置和健康检查机制能显著提升系统稳定性。 阅读详情

1、Redis Sentinel的客户端

Sentinel节点集合具备了监控、通知、自动故障转移、配置提供者若干功能,也就是说实际上最了解主节点信息的就是Sentinel节点集合,而各个主节点可以通过<master-name>进行标识的,所以,无论是哪种编程语言的客户端,如果需要正确地连接Redis Sentinel,必须有Sentinel节点集合和masterName两个参数。

2、Redis Sentinel客户端基本实现原理

实现一个Redis Sentinel客户端的基本步骤如下:

1)遍历Sentinel节点集合获取一个可用的Sentinel节点,后面会介绍Sentinel节点之间可以共享数据,所以从任意一个Sentinel节点获取主节点信息都是可以的,如图所示。

在这里插入图片描述
2)通过sentinel get-master-addr-by-name master-name这个API来获取对应主节点的相关信息,如图所示。

在这里插入图片描述

3)验证当前获取的“主节点”是真正的主节点,这样做的目的是为了防止故障转移期间主节点的变化,如图所示。
在这里插入图片描述
4)保持和Sentinel节点集合的“联系”​,时刻获取关于主节点的相关“信息”​,如图所示。

在这里插入图片描述
从上面的模型可以看出,Redis Sentinel客户端只有在初始化和切换主节点时需要和Sentinel节点集合进行交互来获取主节点信息,所以在设计客户端时需要将Sentinel节点集合考虑成配置(相关节点信息和变化)发现服务。

上述过程只是从客户端设计的角度进行分析,在开发客户端时要考虑的细节还有很多,但是这些问题并不需要深究,下面将介绍如何使用Java的Redis客户端操作Redis Sentinel。

3、Java操作Redis Sentinel

我们依然使用Jedis2.8.2(以下简称Jedis)作为Redis的Java客户端,Jedis能够很好地支持Redis Sentinel,并且使用Jedis连接Redis Sentinel也很简单,按照RedisSentinel的原理,需要有masterName和Sentinel节点集合两个参数。

Jedis的连接池JedisPool,为了不与之相混淆,Jedis针对RedisSentinel给出了一个JedisSentinelPool,很显然这个连接池保存的连接还是针对主节点的。Jedis给出很多构造方法,其中最全的如下所示:

public JedisSentinelPool(String masterName, Set<String> sentinels,
    final GenericObjectPoolConfig poolConfig, final int connectionTimeout, 
    final int soTimeout,
    final String password, final int database, 
    final String clientName)

具体参数含义如下:

  • masterName——主节点名。
  • sentinels——Sentinel节点集合。
  • poolConfig——common-pool连接池配置。
  • connectTimeout——连接超时。
  • soTimeout——读写超时。
  • password——主节点密码。
  • database——当前数据库索引。
  • clientName——客户端名。

例如要想通过简单的几个参数获取JedisSentinelPool,可以直接按照下面方式进行JedisSentinelPool的初始化。

JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName,
    sentinelSet, poolConfig, timeout);

此时timeout既代表连接超时又代表读写超时,password为空,database默认使用0,clientName为空。具体可以参考JedisSentinelPool源码。

和JedisPool非常类似,我们在使用JedisSentinelPool时也要尽可能按照common-pool的标准模式进行代码的书写。

Jedis jedis = null;
try {
    jedis = jedisSentinelPool.getResource();
    // jedis command
} catch (Exception e) {
    logger.error(e.getMessage(), e);
} finally {
    if (jedis != null)
        jedis.close();
}
  • jedis.close()是和第4章介绍的一样,并不是关闭Jedis连接。
  • JedisSentinelPool和JedisPool一样,尽可能全局只有一个。
  • Jedis源码中的JedisSentinelPool介绍一下JedisSentinelPool的实现过程,下面给出的代码就是JedisSentinelPool的初始化方法。
public JedisSentinelPool(String masterName, Set<String> sentinels,
    final GenericObjectPoolConfig poolConfig, final int connectionTimeout, 
    final int soTimeout, final String password, final int database, 
    final String clientName) {
…
    HostAndPort master = initSentinels(sentinels, masterName);
    initPool(master);
…
}

下面的代码就是JedisSentinelPool初始化代码的重要函数initSentinels(Setsentinels,final StringmasterName),包含了Sentinel 节点集合和masterName参数,用来获取指定主节点的ip地址和端口。

private HostAndPort initSentinels(Set<String> sentinels, final String masterName) {
// 主节点
    HostAndPort master = null;
// 遍历所有sentinel节点
    for (String sentinel : sentinels) {
// 连接sentinel节点
        HostAndPort hap = toHostAndPort(Arrays.asList(sentinel.split(":")));
        Jedis jedis = new Jedis(hap.getHost(), hap.getPort());
// 使用sentinel get-master-addr-by-name masterName获取主节点信息
        List<String> masterAddr = jedis.sentinelGetMasterAddrByName(masterName);
// 命令返回列表为空或者长度不为2,继续从下一个sentinel节点查询
        if (masterAddr == null || masterAddr.size() != 2) {
            continue;
        }
// 解析masterAddr获取主节点信息
        master = toHostAndPort(masterAddr);
// 找到后直接跳出for循环
        break;
    }
    if (master == null) {
// 直接抛出异常,
        throw new Exception();
    }
// 为每个sentinel节点开启主节点switch的监控线程
    for (String sentinel : sentinels) {
        final HostAndPort hap = toHostAndPort(Arrays.asList(sentinel.split(":")));
        MasterListener masterListener = new MasterListener(masterName, hap.getHost(), 
            hap.getPort());
        masterListener.start();
    }
// 返回结果
    return master;
}

具体过程如下:

1)遍历Sentinel节点集合,找到一个可用的Sentinel节点,如果找不到就从Sentinel节点集合中去找下一个,如果都找不到直接抛出异常给客户端:

new JedisException("Can connect to sentinel, but " + masterName + " seems to be not monitored…")

2)找到一个可用的Sentinel节点,执行sentinelGetMasterAddrByName(masterName),找到对应主节点信息:

List<String> masterAddr = jedis.sentinelGetMasterAddrByName(masterName);

3)JedisSentinelPool中没有发现对主节点角色验证的代码,这是因为get-master-addr-by-name master-name这个API本身就会自动获取真正的主节点(例如故障转移期间)​。

4)为每一个Sentinel节点单独启动一个线程,利用Redis的发布订阅功能,每个线程订阅Sentinel节点上切换master的相关频道+switch-master。

for (String sentinel : sentinels) {
    final HostAndPort hap = toHostAndPort(Arrays.asList(sentinel.split(":")));
    MasterListener masterListener = new MasterListener(masterName, hap.
        getHost(), hap.getPort());
    masterListener.start();
}

下面代码就是MasterListener的核心监听代码,代码中比较重要的部分就是订阅Sentinel节点的+switch-master频道,它就是Redis Sentinel在结束对主节点故障转移后会发布切换主节点的消息,Sentinel节点基本将故障转移的各个阶段发生的行为都通过这种发布订阅的形式对外提供,开发者只需订阅感兴趣的频道即可​,这里我们比较关心的是+switch-master这个频道。

Jedis sentinelJedis = new Jedis(sentinelHost, sentinelPort);
// 客户端订阅Sentinel节点上"+switch-master"(切换主节点)频道
sentinelJedis.subscribe(new JedisPubSub() {
    @Override
    public void onMessage(String channel, String message) {
        String[] switchMasterMsg = message.split(" ");
        if (switchMasterMsg.length > 3) {
// 判断是否为当前masterName
            if (masterName.equals(switchMasterMsg[0])) {
// 发现当前masterName发生switch,使用initPool重新初始化连接池
                initPool(toHostAndPort(switchMasterMsg[3], switchMasterMsg[4]));
            }
        }
    }
}, "+switch-master");
[springboot]整合连接redis单例、哨兵及集群模式 当redis 哨兵或cluster集群搭建好之后,在Spring Boot应用中你该如何去理解这些redis实例及集群模式,如何连接及使用这些redis实例。 阅读详情

相关推荐

结合 Conda 手动安装 RepeatMasker

RepeatMasker 是一个广泛使用的生物信息学工具,用于识别和屏蔽(mask)基因组序列中的 重复序列(repeats) 。在使用过程中需要调用重复序列数据库(Repbase 和 Dfam),如果使用Conda安装的话会出现许多问题,因此推荐手动安装。在此记录我手动安装RepeatMasker的流程,希望对各位同学有所帮助。

m0_65437087的博客 2536

redis哨兵模式

1、哨兵模式 Redis Sentinel是实现Redis高可用的一个方案。在主从复制模式中,主节点故障通常都是走的以下的流程:主节点发生了故障,导致客户端连接失败并且从节点复制失败。若主节点无法正常启动的情况下,就会选择一个从节点进行slave of no one 的操作,让它重新晋升为主节点,更新软件应用的主节点的信息使用slave of {newMaster} ,与新的主节点建立复制关系。 原来的主节点恢复后与新的主节点建立复制关系,降为从节点。 ...

weixin_40482816的博客 2527

Android手机本地语音转文字实战:用FunASR+ONNX Runtime打造离线ASR应用(附模型下载)

本文详细介绍了如何在Android应用中集成FunASR和ONNX Runtime,构建高性能的离线语音识别系统。通过模型选择、工程化集成和性能调优等实战技巧,开发者可以实现本地语音转文字功能,有效保护用户隐私并提升响应速度。

weixin_29046611的博客 266

在redis哨兵模式下怎么进行连接使用

普通的redis连接和哨兵的redis连接还是有点出入的,如果您使用Redis哨兵模式,那么您需要确保您的应用程序能够自动发现主节点和从节点。这可以通过使用Redis哨兵来实现,Redis哨兵是一个分布式系统,它可以监视Redis主节点和从节点的状态,并在主节点宕机时自动将从节点晋升为主节点。所以需要在编写业务代码的时候能够满足说,如果某个节点的角色变更不会影响到业务代码的,业务代码不需要进行修改。

m0_73299531的博客 1673

Altera下载器驱动配置:手把手教程(从零实现)

详解Altera USB-Blaster驱动安装全过程,从设备识别到软件配置一步一图,解决常见连接问题,确保开发下载器正常工作,适合初学者快速上手FPGA下载调试。

weixin_35751194的博客 989

告别轮询!用STM32CubeMX给STM32F030配置ADC多通道+DMA,实测代码分享

本文详细介绍了如何使用STM32CubeMX为STM32F030配置ADC多通道采集与DMA传输,显著提升采集效率。通过实测对比轮询与DMA模式的性能差异,提供完整的代码实现和优化技巧,帮助开发者快速掌握这一高效采集方案。

weixin_42570296的博客 410

Redis-哨兵模式

Redis

qq_33879443的博客 1403

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。

m0_70212665的博客 5714

redis哨兵模式 客户端怎么链接

Redis哨兵模式客户端连接指南 一、Redis简介 Redis是一个高性能的Key-Value数据库,它以其快速的读写速度和多种数据结构支持而广泛应用。在某些情况下,仅靠一个Redis实例可能会导致单点故障。因此,引入Redis Sentinel(哨兵)来提供高可用性。 二、Redis Sentinel概述 Redis ...

weixin_40828007的博客 1182

SIPVicious实战指南:从零开始掌握VoIP渗透测试(Kali Linux环境)

本文为SIPVicious实战指南,详细介绍了在Kali Linux环境下进行VoIP渗透测试的完整流程。从环境准备与工具安装开始,逐步讲解如何使用svmap扫描SIP服务器、svwar枚举PBX分机号,以及svcrack进行密码安全测试,并整合svreport生成报告。旨在帮助安全从业者从零开始,系统掌握这套经典开源工具,在授权范围内有效评估VoIP系统的安全性。

weixin_29327977的博客 541

Unity游戏开发客户端面经——数据结构(初级)

Unity游戏开发客户端面经 之 数据结构篇

Sea3752的博客 1万+

Redis(9.4)—— 哨兵的客户端连接

通过前面的学习,相信读者对Redis Sentinel有了一定的了解,本节将介绍应用方如何正确地连接Redis Sentinel。有人会说这有什么难的,已经知道了主节点的ip地址和端口,用对应编程语言的客户端连接主节点不就可以了吗?但试想一下,如果这样使用客户端,客户端连接Redis Sentinel和主从复制的Redis又有什么区别呢,如果主节点挂掉了,虽然Redis Sentinel可以完成故...

天青色等烟雨 而我在等你 1万+

R语言使用rms包的psm函数拟合参数生存模型(parametric survival model)、并可视化列线图(诺模图、nomogram)

R语言使用rms包的psm函数拟合参数生存模型(parametric survival model)、并可视化列线图(诺模图、nomogram)

statistics+insight+vista+power 903

【限时免费】 【保姆级超详细还免费(redis-sdk) 新手指导】

【保姆级超详细还免费(redis-sdk) 新手指导】 【免费下载链接】redis-sdk 仓颉语言实现的Redis客户端SDK。接口设计兼容jedis接口语义,支持RESP2和RESP3协议,支持发布订阅模式,支持哨兵模式和集群模式。当前master分支适配仓颉1.0.0 LTS版本,分支Branch_cj0.53.1...

gitblog_01421的博客 360

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring Boot响应式Redis整合:Lettuce实战与性能优化指南

在构建高并发微服务架构时,异步非阻塞的响应式编程范式成为提升系统吞吐量与资源利用率的关键技术。其核心原理在于通过事件驱动和回压机制,允许线程在I/O等待期间处理其他任务,从而避免传统阻塞模型下的资源浪费。这一技术价值在高并发、低延迟场景中尤为显著,广泛应用于实时数据处理、消息推送和会话管理等场景。结合Redis这一高性能内存数据库,能够构建出极具弹性的数据访问层。本文聚焦于Spring Boot与Lettuce客户端的现代整合方案,深入探讨如何利用Lettuce的原生异步支持与连接池优化,解决传统Jedis

weixin_30918633的博客 407

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Golang如何连接redis哨兵模式,项目案例,模块化客户端

一、go环境说明 D:\dev\demo>go env set GO111MODULE=on set GOARCH=amd64 set GOBIN= set GOCACHE=C:\Users\username\AppData\Local\go-build set GOENV=C:\Users\username\AppData\Roaming\go\env set GOEXE=.exe set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set

supery071的博客 2315

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Redis 7.x哨兵模式如何实现?基于Spring Boot 3.x版

我是袁庭新,研发了一套最新版的Redis 7.x教程。Redis哨兵模式是一种提高其高可用性的解决方案。在Redis主从复制模式中,主服务器宕机需要手动切换从服务器,导致服务不可用和数据安全风险。哨兵模式通过引入哨兵节点来自动监控和管理Redis集群。

2301_82300081的博客 948

Redis原理篇——哨兵机制

主从结构中master节点的作用非常重要,一旦故障就会导致集群不可用。那么有什么办法能保证主从集群的高可用性呢?

祝你身体健康,美满幸福 2095

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

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

记录知识、锤炼自我 1257

Linux下Redis哨兵集群模式搭建详解(1主2从+3哨兵)

Linux下Redis哨兵集群模式搭建详解(1主2从+3哨兵)

weixin_42925623的博客 1万+

Redis哨兵配置与jedis客户端使用

Redis sentinel 1、配置主从 #允许所有网络访问 bind 0.0.0.0 #认证密码 requirepass redis123 #主节点忽略 从节点配置,指定主节点地址端口 slaveof 192.168.1.200 6379 #主节点忽略 从节点配置,主服务密码 masterauth redis123 #是否开启保护模式 protected-mode yes port 6380 2、哨兵配置 哨兵的配置文件都是一致的(如果只有一台机器进行模拟的话,只需要改变端口号、pidfile的文件名

yuyeshahun的博客 1463

Vert.x Redis 客户端项目教程

Vert.x Redis 客户端项目教程 1. 项目的目录结构及介绍 Vert.x Redis 客户端项目的目录结构如下: vertx-redis-client/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ ├── io/ │ │ │ │ ├── vertx/ │ │ │ │ │ ├── redis/...

gitblog_00589的博客 973

【Redis教程0x0A】详解Redis哨兵机制

Redis 在 2.8 版本以后提供的哨兵(Sentinel)机制,它的作用是实现主从节点故障转移。它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。监控、选主、通知。哨兵节点通过 Redis 的发布者/订阅者机制,哨兵之间可以相互感知,相互连接,然后组成哨兵集群,同时哨兵又通过 INFO 命令,在主节点里获得了所有从节点连接信息,于是就能和从节点建立连接,并进行监控了。1、第一轮投票:判断主节点下线。

weixin_70757494的博客 1171

redis哨兵

哨兵机制的大致工作原理如下:我们在启动redis主从结构服务过后,我们会再多开几个单独的进程,这些进程就是哨兵进程。这些进程不存储数据,就专门用来监控主从结构中的所有节点,当这些监控进程检测到主节点挂掉过后,那么这些监控进程会从这个主节点中的从节点中挑选出一个从节点晋升为新的主节点,并且会将这个新的主节点的IP和端口号通知给此时连接着的客户端;检测主节点是否挂掉选举新的主节点通知客户端接下来我们将围绕着这三个过程来具体讲一讲,哨兵节点如何检测到主节点挂了?如何选举新节点?如何通知客户端;

南猿北者博客 1160

Redis哨兵集群搭建

因为我把redis-6.2.6/redis.conf被我复制到了/usr/local/bin/目录下,并进行了修改,并未使用redis-6.2.6/redis.conf,所以需要替换redis.conf文件。将redis文件复制三份到redis-sentinel目录下。将master,slave,sentinel全都启动起来。

2509_93988769的博客 492

Redis - Python 客户端基本使用指南

Redis - Python 客户端基本使用指南

墨鸦的博客 9944
上一篇: Redis 3.x——哨兵API
下一篇: Redis 3.x——哨兵实现原理
吴声子夜歌
博客等级 码龄9年 2688粉丝 2271原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值