天天看點

SpringBoot配置Redis哨兵模式

SpringBoot配置Redis哨兵模式

       所謂哨兵模式,其實是一個僞叢集,即便是在多個哨兵的情況下,哨兵監控的都是同一個主節點,也就是一主多從的模式。

       SpringBoot配置哨兵模式,隻需要配置哨兵的IP和端口,不需要配置主從節點的資訊,當主節點挂掉後,哨兵會自動完成主從切換,直接上代碼

@Configuration
public class JedisPoolConfiguration {
    /**
     * jedis連接配接池配置
     * @return
     * @Bean  加載後,方法傳回的對象作為bean,被放在IOC容器裡
     */
    @Bean
    /*@ConfigurationProperties(prefix = "jedisPool")*/
    public JedisPoolConfig jedisPoolConfig(){
        System.out.println("配置類執行了");
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        return jedisPoolConfig;
    }

    @Bean
    public RedisSentinelConfiguration sentinelConfiguration(){
        RedisSentinelConfiguration sentinelConfiguration = new RedisSentinelConfiguration();
        Set<RedisNode> redisNodes = new HashSet<>();
        //ip和端口資訊可以寫在配置檔案裡
        RedisNode redisNode = new RedisNode("192.168.1.128",26379);
        RedisNode redisNode2 = new RedisNode("192.168.1.128",26380);
        RedisNode redisNode3 = new RedisNode("192.168.1.128",26381);
        redisNodes.add(redisNode);
        redisNodes.add(redisNode2);
        redisNodes.add(redisNode3);
        //setSentinels的參數類型是Iterable<RedisNode>,是以放有RedisNode的集合可以是實作Iterable接口的任意集合,使用list、set都可以
        sentinelConfiguration.setSentinels(redisNodes);
        //監控主節點的名稱
        sentinelConfiguration.setMaster("mymaster");
        return sentinelConfiguration;
    }

    /**
     * 連接配接工廠配置資訊,需要注入連接配接池配置資訊
     * @param jedisPoolConfig
     * @return
     */
    @Bean
    public JedisConnectionFactory jedisConnectionFactory(RedisSentinelConfiguration redisSentinelConfiguration,JedisPoolConfig jedisPoolConfig){
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisSentinelConfiguration,jedisPoolConfig);
        return jedisConnectionFactory;
    }

    /**
     * 操作redis方法的對象,需要注入連接配接工廠,封裝了操作redis的方法
     * @param jedisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String,Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory){
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //使用的時候再具體轉換序列化方式,存取都需要
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        return  redisTemplate;
    }

}
           

在其他業務代碼中,注入redisTemplate,使用就可以了

配置的過程中遇到幾個問題,希望大家引以為戒:

1.

SpringBoot配置Redis哨兵模式

連接配接不到哨兵,All sentinels down

查了很多資料,有說是防火牆的問題,我把Linux伺服器、window的伺服器防火牆都關了,在windows上使用telnet也是通的,把 sentinel.conf檔案中的bind也設定為了0.0.0.0,保護模式也關閉了protected-mode no,還是不行,最後檢查了下代碼,原來是裝有哨兵節點資訊的集合沒有放到sentinelConfiguration中,也就是沒寫sentinelConfiguration.setSentinels(redisNodes);這段代碼,真是氣自己呀,重新開機後,項目正常運作,redis也可以正常使用。

2.手動關閉主節點後,通過info replication檢視其它節點資訊,其中一個從節點成功切換為主節點,說明哨兵配置的是沒有問題的,但是項目報錯如下:

Could not get a resource from the pool
           

沒有拿到redis連接配接,也就是redis不可用,很奇怪,從節點都成功切換為主節點了,哨兵怎麼還是找不到主節點,檢視了下哨兵的配置檔案,發現監控的主節點IP位址變成了127.0.0.1,之前配置的是伺服器的ip 192.168.1.128,重新開機哨兵,項目正常運作了,不知道這種問題是不是由于虛拟機的問題造成的

3.建議每次重新開機哨兵的時候,将 sentinel.conf配置檔案中

Generated by CONFIG REWRITE
           

被重寫的這部分内容删除再重新開機。

繼續閱讀