目录:

Redis学习篇-windows下redis主从模式搭建

Redis学习篇-windows下哨兵模式

 

前言:

通过结合前篇的redis sentinel与springboot达到增加理解的效果。本文采取1master2slave3sentinel.

 

一.预备工作

先启动master和两个slave,然后再启动sentinel.

redis端口依次为6379,6380,6381,sentinel依次是10001,10002,10003

二.创建springboot项目

pom文件

<properties>
   <java.version>1.8</java.version>
   <lombok.version>1.18.4</lombok.version>
</properties>

<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
      <exclusions>
         <exclusion>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
         </exclusion>
         <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
         </exclusion>
      </exclusions>
   </dependency>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
   </dependency>

   <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <version>2.5.0</version>
      <!--<version>2.4.2</version>-->
   </dependency>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
   </dependency>
   <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
      <scope>provided</scope>
   </dependency>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
         <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
         </exclusion>
      </exclusions>
   </dependency>
</dependencies>

yml文件:

spring:
  redis:
    password: 123456
    jedis:
      pool:
        #最大连接数
        max-active: 1024
        #最大阻塞等待时间(负数表示没限制)
        max-wait: 20000
        #最大空闲
        max-idle: 200
        #最小空闲
        min-idle: 10
    sentinel:
      master: mymaster
      nodes: 127.0.0.1:10001,127.0.0.1:10002,127.0.0.1:10003
server:
  port: 9527

 

config文件:

@Configuration
@EnableAutoConfiguration
@Slf4j
public class RedisSentinelConfig {

    @Value("#{'${spring.redis.sentinel.nodes}'.split(',')}")
    private List<String> nodes;

    @Bean
    @ConfigurationProperties(prefix="spring.redis")
    public JedisPoolConfig getRedisConfig(){
        JedisPoolConfig config = new JedisPoolConfig();
        return config;
    }
    @Bean
    public RedisSentinelConfiguration sentinelConfiguration(){
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
        //配置matser的名称
        redisSentinelConfiguration.master("mymaster");
        //配置redis的哨兵sentinel
        Set<RedisNode> redisNodeSet = new HashSet<>();
        nodes.forEach(x->{
            redisNodeSet.add(new RedisNode(x.split(":")[0],Integer.parseInt(x.split(":")[1])));
        });
        log.info("redisNodeSet -->"+redisNodeSet);
        //哨兵模式添加set
        redisSentinelConfiguration.setSentinels(redisNodeSet);
        return redisSentinelConfiguration;
    }

    @Bean
    public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig, RedisSentinelConfiguration sentinelConfig) {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(sentinelConfig,jedisPoolConfig);
        return jedisConnectionFactory;
    }
}

 

 启动服务:期间曾经遇到一个问题:

警告: Cannot get master address from sentinel running @ 127.0.0.1:6379. Reason: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect. Trying next one.

问题的原因是因为sentinel绑定127.0.0.1的时候绑定自己本机ip或者指定ip地址

 完成这些以后日志:

经过sentinel找到redis地址。

接下来说说 JedisConnectionFactory

按照上面的配置,获得了JedisPoolConfig的bean和RedisSentinelConfiguration的bean.最终配置的JedisConnectionFactory。

点进JedisConnectionFactory类里面去,可以看到里面的类关系图,如图所示(网上找的)

å¨è¿éæå¥å¾çæè¿°

 时序图:

å¨è¿éæå¥å¾çæè¿°

 

 根据bean的生命周期,由于JedisConnectionFactory实现了InitializingBean因此先执行了afterPropertiesSet方法,在afterPropertiesSet方法里面调用createPool,一直调用,在initSentinels的方面里面调用了new JedisSentinelPool.MasterListener返回了masterlisenter,随后调用了masterlistener的start方法。

 

打断点进入initSentinels方法里面,先是根据yml的配置文件获取哨兵的ip和端口,然后根据sentinelGetMasterAndAddrByName获取redis主节点的ip和地址

  如下图所示,其实masterlistener是个内部类,继承了Thread.

在这个线程里面不停在遍历,获取redis的master节点。

 关闭主节点后,经过选举,和masterlinster的遍历循环,更改了主节点并告知了服务

GitHub 加速计划 / sentine / Sentinel
49
7
下载
alibaba/Sentinel: Sentinel 是阿里巴巴开源的一款面向分布式服务架构的流量控制、熔断降级组件,提供实时监控、限流、降级和系统保护功能,适用于微服务治理场景。
最近提交(Master分支:4 个月前 )
222670e6 * fix: Endpoint#toString host formatting; add Endpoint unit test * test: remove empty EndpointTest.java (fix accidental PR changes) --------- Signed-off-by: 赖尧 <yujitang_2006@qq.com> 28 天前
e7a9c560 * chore: remove node_modules from git & add to .gitignore * fix(docs): normalize README table style (MD060) across adapters and cluster modules * docs: fix compact table style in parameter flow README * docs: fix markdownlint MD009 and MD060 in README files * docs: fix table format in parameter-flow-control README (MD060/MD009) * docs: fix table format in spring-webmvc README files (MD060/MD009) * fix: restore UTF-8 encoding and fix markdownlint errors * fix: wrap remaining bare URLs with angle brackets (MD034) * fix: remove trailing spaces from table rows (MD009) --------- Signed-off-by: 赖尧 <yujitang_2006@qq.com> 1 个月前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐