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.
連接配接不到哨兵,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
被重寫的這部分内容删除再重新開機。