SpringBoot2.x整合Redis Sentinel

news/2024/10/16 2:25:39

redis sentinel搭建之后,在spring-boot项目中集成。

配置

在pom.xml文件中添加如下依赖配置(这里spring-boot版本2.2.5),这个版本中,默认使用lettuce作为redis连接池。

<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>

在application.yml添加如下redis sentinel、lettuce配置,对应的配置类是RedisProperties

spring:redis:
#    host: 127.0.0.1
#    port: 6380# 连接redis节点和sentinel的密码,password: passwd@190lettuce:pool:max-active: 20max-wait: -1max-idle: 10min-idle: 2sentinel:# redis主库别名配置,需要与哨兵配置中的主库别名一致master: master_node# 哨兵集群nodes:- 127.0.0.1:6390- 127.0.0.1:6391- 127.0.0.1:6393

集成

自动装配

在进行RedisProperties配置后,Spring Boot有一个自动装配的机制,步骤如下

  1. 配置Redis Connection Factory,用于管理Redis连接池。详见LettuceConnectionConfiguration
  2. 通过Redis Connection配置RedisTemplate,用于访问Redis。详见RedisAutoConfiguration

自动装配的方式适合在Redis单实例时使用,切换为sentinel架构后,在配置Redis Connection Factory中没有配置sentinel的访问密码,如果sentinel开启密码访问,会无法连接到sentinel集群。

在sentinel没有进行密码验证时,也只会对主库进行读写操作,无法做到主从库多节点访问。源码可见LettuceConnectionConfiguration.createLettuceConnectionFactory。

Redis Connection Factory

@Bean
@ConditionalOnMissingBean(RedisConnectionFactory.class)
LettuceConnectionFactory redisConnectionFactory(ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,ClientResources clientResources) throws UnknownHostException {LettuceClientConfiguration clientConfig = getLettuceClientConfiguration(builderCustomizers, clientResources,getProperties().getLettuce().getPool());return createLettuceConnectionFactory(clientConfig);
}

Redis Template

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);return template;}
}

手动装配

自动装配模式下创建的RedisConnectionFactory无法满足我们的需求,那么只能由我们自己自定义配置了。

创建一个RedisConnectionFactory Bean,并重写sentinel配置和lettuce client配置。

@Bean
public RedisConnectionFactory lettuceConnectionFactory(RedisProperties redisProperties) {// 读取sentinel配置String masterName = redisProperties.getSentinel().getMaster();List<String> sentinelNodeList = redisProperties.getSentinel().getNodes();RedisSentinelConfiguration sentinelConfiguration = new RedisSentinelConfiguration(masterName, new HashSet<>(sentinelNodeList));// 设置节点和哨兵访问密码 sentinelConfiguration.setPassword(redisProperties.getPassword());sentinelConfiguration.setSentinelPassword(redisProperties.getPassword());// lettuce client配置,在进行读取时,访问任意一个节点,默认读写都只从主节点进行LettucePoolingClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder().readFrom(ReadFrom.ANY).build();LettuceConnectionFactory factory = new LettuceConnectionFactory(sentinelConfiguration, clientConfig);// 在获取连接时,先验证连接是否已经中断,如果已经中断则创建一个新的连接factory.setValidateConnection(true);return factory;
}

验证

启动spring-boot项目后,Lettuce Connection通过Sentinel获取到主从库节点信息,并与之进行连接。在创建连接时,根据lettuce pool配置,会对主从节点做负载均衡,让连接均衡分配到各个节点。我们主要测试的项目是

  • 写操作是否走的主库,读操作是否为任意主从库
  • 主库宕机后,是否可以正常工作,能不能从Sentinel获取主从切换信息,进行主库的重新设定

而要知道这些信息,就得查看lettuce的日志,而日志级别为logging.level.root=info时,是看不到这些信息的。

在application.yml中添加如下配置,将lettuce包的日志级别设置为debug。

logging:level:io.lettuce.core: debug

在配置好后重启项目,通过RedisTemplate做两个类型的操作,一个是Set、一个是Get。

验证写操作

连续执行多个Set操作,查看Lettuce日志,发现请求始终是发给主库的,符合预期。

验证读操作

连续执行多个Get操作,查看Lettuce日志,发现请求是发给任一主从库的,符合预期。

验证主从切换

将主库宕机后,哨兵检测到主库下线,然后重新选主后进行主从切换,这个过程正常的话几秒内完成。客户端从哨兵获取新的主从库信息,重新配置主从库节点。

  • 立即进行写操作,报无法连接redis的异常,符合预期
  • 立即进行读操作,可以正常响应,符合预期
  • 等待几秒后,进行读写操作,均可正常响应,符合预期。

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

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

相关文章

PLC程序中的配方应用

建立ARRAYDB集合配方需要的所有元素结构,组成一个UDT(包含范围最全) 新建一组ARRAY DB,元素的个数就是配方需要的副本的个数 数组DB勾选仅存储在装载内存中,以便数据量大的配方不占用数据工作存储器空间,节省资源 在ARRAY DB的起始值处填写配方的具体值 1200不支持ARRAY …

Redis 高可用之主从哨兵集群实战

搭建集群 架构规划为一个主库节点,一个从库节点,三个哨兵节点,其中主从库节点内存配置需保持一致,哨兵节点对配置要求较低,可配置在主从节点上。 搭建主库 主从库节点内存配置需保持一致,主从库连接密码保持一致。主库不进行任何持久化配置,交给从库完成。 编写配置文件…

Juummmmppingg!

You jump,I jump.To jump,or not to jump,that is the question.灵感来源是无聊的时候自己和自己玩的数学小游戏 初始版本 给定了从1到50这50个正整数, 正直善良的勇者啊,请选定起始方块(这也算访问一次,但不计入跳跃数量( (我都乱写了你就让让我吧), 然后在这些方块上…

测试与发布

目录测试报告一、bug的发现与解决二、场景测试(scenario testing)发布说明一、功能说明二、对运行环境的要求三、安装方法四、已知的限制和缺陷五、发布方式和发布地址 测试报告 一、bug的发现与解决1.在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? 答:共发现…

Trusted Types API

Trusted Types API: 锁定 DOM API 的不安全部分,以防止客户端跨站脚本(XSS)攻击untrusted<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-wi…

【MMD x EEVEE教程】工具篇 • blender设置

这篇教程适合有一定基础的萌新....*& blender下载官方网址https://www.blender.org/官方blender,都是最新版,如果需要找旧版的blender可以到这里来https://download.blender.org/release/ ,里边包好了所有版本的blender,因为是做MMD,下载自己需要版本后,建议额外下载…

ojdbc6jar包手动解压导入本地仓库

报错 Cannot resolve com.oracle:ojdbc6:11.2.0.1.0 <!--oracle驱动--> <dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.1.0</version> </dependency>解决方式: 手动导入 …

瑞芯微-I2S | ALSA基础-3

针对音频设备,linux内核中包含了两类音频设备驱动框架;OSS:开放声音系统 包含dsp和mixer字符设备接口,应用访问底层硬件是直接通过sound设备节点实现的;ALSA:先进linux声音架构(Advanced Linux Sound Archiecture) 以card和组件(PCM、mixer等)为组件,应用是通过ALSA…