目录
本博文主要总结关于哨兵的一些理论知识,主要关注点有一下几个方面:
一、哨兵解决了什么问题?
二、哨兵是如何解决“问题一”的?
三、如何使用哨兵?
四、Redis Sentinel客户端实现的原理是什么?Java如何操作Redis Sentinel?
四、Redis Sentinel客户端实现的原理是什么?Java如何操作Redis Sentinel?
首先,看JedisSentinelPool的构造函数。
Jedis Version:2.9.0
sentinel构造函数:
/**
*Set<String> sentinels:哨兵集合,格式为IP:PORT
*/
public JedisSentinelPool(String masterName, Set<String> sentinels, GenericObjectPoolConfig poolConfig, int timeout, String password) {
this(masterName, sentinels, poolConfig, timeout, password, 0);
}
public JedisSentinelPool(String masterName, Set<String> sentinels, GenericObjectPoolConfig poolConfig, int connectionTimeout, int soTimeout, String password, int database, String clientName) {
this.connectionTimeout = 2000;
this.soTimeout = 2000;
this.database = 0;
this.masterListeners = new HashSet();
this.log = Logger.getLogger(this.getClass().getName());
this.poolConfig = poolConfig;
this.connectionTimeout = connectionTimeout;
this.soTimeout = soTimeout;
this.password = password;
this.database = database;
this.clientName = clientName;
HostAndPort master = this.initSentinels(sentinels, masterName);
this.initPool(master);
}
再看,如何初始化哨兵的,initSentinels(sentinels, masterName)。
private HostAndPort initSentinels(Set<String> sentinels, String masterName) {
HostAndPort master = null;
boolean sentinelAvailable = false;
this.log.info("Trying to find master from available Sentinels...");
Iterator var5 = sentinels.iterator();
String sentinel;
HostAndPort hap;
while(var5.hasNext()) {
sentinel = (String)var5.next();
hap = HostAndPort.parseString(sentinel);
this.log.fine("Connecting to Sentinel " + hap);
Jedis jedis = null;
try {
jedis = new J