首页 > 数据库 >SpringBoot2.x整合Redis Sentinel

SpringBoot2.x整合Redis Sentinel

时间:2024-04-30 23:33:24浏览次数:27  
标签:主库 lettuce 配置 Redis sentinel SpringBoot2 Sentinel 主从

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@190
    lettuce:
      pool:
        max-active: 20
        max-wait: -1
        max-idle: 10
        min-idle: 2
    sentinel:
      # 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的异常,符合预期
  • 立即进行读操作,可以正常响应,符合预期
  • 等待几秒后,进行读写操作,均可正常响应,符合预期。

标签:主库,lettuce,配置,Redis,sentinel,SpringBoot2,Sentinel,主从
From: https://www.cnblogs.com/cd-along/p/18168879

相关文章

  • Redis 高性能
    为什么Redis性能很高,遥遥领先于MySQL?个人分析有如下原因:IO多路复用物理结构上来说,它是内存数据库,内存的访问速度比硬盘快几个量级。机械硬盘的随机访问速度一般为毫秒级,SSD硬盘的随机访问速度一般为微秒级,而内存的随机访问速度一般为纳秒级。逻辑结构上来说,归功于它的存......
  • Redis 高可用之持久化
    Redis服务实例宕机后,其中的数据还能恢复吗?是的,与其他内存数据库不同(如memcache没有持久化),redis还提供了数据持久化功能,并提供两种持久化方式:AOF(appendonlyfile):逻辑文件,记录的是一条一条的更改命令。在进行数据恢复时,需要一条一条的重放日志,恢复速度较慢RDB(readdatabase)......
  • 【Redis】Redis的操作命令(五)——Redis 有序集合(sorted set)
    有序集合添加元素ZADDrunoobkey1redis有序集合移除元素ZRANGErunoobkey010WITHSCORES有序集合命令命令说明例子ZADDkeyscore1member1[score2member2]向有序集合添加一个或多个成员,或者更新已存在成员的分数 ZCARDkey获取有序集合的成员数 ......
  • 【Redis】Redis的操作命令(四)——Redis 集合(SET)
    Redis的SET是String类型的无序列表。添加无序列表语句:SADDsetDemoredis获取无序列表语句SMEMBERSsetDemoRedis集合命令如下:命令描述例子SADDkeymember1[member2]向集合添加一个或多个成员 SCARDkey获取集合的成员数 SDIFFkey1[key2]返回......
  • Redis删除
    1.登录可以连接Redis的ECS实例,安装Redis客户端,详情请参见redis-cli连接。2.执行以下命令,删除模糊匹配到的Key。redis-cli-h[$Addr]-p[$port]-n[$db]-a[$Password]keys"[$Key]*"|xargs-r-t-n1redis-cli-h[$Addr]-p[$port]-n[$db]-a[$Password]delredis-c......
  • java代码运行出现DENIED Redis is running in protected mode because protected mode
    这个错误是因为开启了保护模式,导致出错。所以需要关闭redis的保护模式。编辑redis的redis.config  注释bind127.0.0.1 、修改protected-mode为no、修改 daemonize为no然后重启redis ......
  • cmd redis 设置密码
     cmdredis设置密码在Redis中设置密码,你需要修改Redis配置文件或者通过命令行设置。以下是通过命令行设置密码的方法:连接到Redis服务器。使用CONFIGSETrequirepassyourpassword命令来设置密码。例如,如果你想通过命令行设置密码为mysecretpassword,你可以这样做:1.re......
  • Redis中对数组的获取类型转换
    1#####Redis中对数组的获取类型转换23```java4//判断redis中键值key是否存在;5BooleancarWeizi_redis_service=redisService.hasKey("carWeizi_redis_service");6if(carWeizi_redis_service){7//获取对应的list数组传入时re......
  • 双token+redis(token无感刷新)
    为什么要使用双token+redis呢?单token+redis+自动续期不行吗?单token+redis的缺点:可能会出现用户正在操作的时候,token过期了,让用户重新登录的情况。单token+redis+自动续期的缺点:单token设置短期的话,虽然一直操作可以通过拦截器重置token过期时间让它续期,但是如果隔一会儿不操作......
  • 日志分析-redis应急响应
    简介服务器场景操作系统Linux服务器账号密码rootxjredis任务环境说明注:样本请勿在本地运行!!!样本请勿在本地运行!!!样本请勿在本地运行!!!应急响应工程师小王某人收到安全设备告警服务器被植入恶意文件,请上机排查步骤#1通过本地PCSSH到服务器并且分析黑客攻击成功的IP为......