Jedis根据哨兵获得主节点和辅节点信息
-
应单例模式创建JedisSentinelPool对象
-
主节点:
jedisSentinelPool调用getCurrentHostMaster()得到当前主节点信息
-
父节点:
注意到Jedis对象有一个方法sentinelSlaves(String masterName)
分析可得,由Sentinel创建的Jedis对象可以通过此方法获得辅节点信息
返回值是List<Map<String, String>>;
相当于通过命令行
redis-cli -p 26379 >>> sentinel master mymaster >>> sentinel slaves mymaster
获得到的信息
坑位
每次获取辅节点得到的是127.0.0.1的地址,并且程序执行后,主节点就down了。
经排查,是sentinel.conf的配置问题,官方配置全而细,一不小心就出错。直接创建最纯净的配置
port 26379
sentinel monitor mymaster <公网IP> 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
然后把redis.conf中的所有ip都改为公网ip。问题解决
代码
package com.closer.redis;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.*;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.exceptions.JedisException;
import java.util.*;
/**
* <p>JedisSentinelPoolUtil</p>
* <p>description</p>
*
* @author ws
* @version 1.0.0
* @date 2020-06-06 15:09
*/
public class JedisSentinelPoolUtil {
private static volatile JedisSentinelPool jedisSentinelPool = null;
private static Set<String> sentinels = new HashSet<>(Arrays.asList(
"<IP>:26379",
"<IP>:26380",
"<IP>:26381"
));
private static Logger logger = LoggerFactory.getLogger(JedisSentinelPoolUtil.class);
private JedisSentinelPoolUtil() {
}
/**
* maxActive: 链接池中最大连接数,默认为8.
* maxIdle: 链接池中最大空闲的连接数,