Jedis中Redis Sentinel的客户端JedisSentinelPool的源码分析。
JedisSentinelPool
代码如下,其中的重点部分为initSentinels和initPool,其他判断略。
public JedisSentinelPool(String masterName, Set<String> sentinels, GenericObjectPoolConfig poolConfig, int connectionTimeout, int soTimeout, String password, int database, String clientName) {
HostAndPort master = this.initSentinels(sentinels, masterName);
this.initPool(master);
}
initSentinels
initSentinels用sentinels和masterName,也就是Sentinel节点的集合和Redis数据节点的名字来初始化,获取到Redis的主节点,同时呢,为每个Sentinel创建了一个监听的进程。
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;
// 循环处理Sentinel节点
while(var5.hasNext()) {
sentinel = (String)var5.next();
hap = HostAndPort.parseString(sentinel);
this.log.fine("Connecting to Sentinel " + hap);
Jedis jedis = null;
try {
jedis = new Jedis(hap.getHost(), hap.getPort());
// 连接上Sentinel节点,根据masterName获取Redis的主节点
List<String> masterAddr = jedis.sentinelGetMasterAddrByName(masterName);
// Sentinel集群生效的
sentinelAvailable = true;
if (masterAddr != null && masterAddr.size() == 2) {
// 将Redis主节点赋值给master变量
master = this.toHostAndPort(masterAddr);
this.log.fine("Found Redis master at " + master);
// 根据Sentinel获取到了Redis的主节点,可以退出Sentinel的集合的循环
break;
}
this