客户端连接
请求响应流程
既然已经实现高可用为什么不直接直连?
高可用涉及的是服务高可用、完成自动的故障转移;故障转移后客户端无法感知将无法保证正常的使用。
需要保证的是服务高可用 和 客户端高可用。
客户端实现基本原理
-
客户端实现基本原理 - step1:获取所有的Sentinel的节点和MasterName,遍历Sentinel集合得到一个可用(即可以ping通)的Sentinel节点。
-
客户端实现基本原理 - step2:向可用的Sentinel节点发送sentinel的get-master-addr-by-name的请求,参数masterName;获取master节点信息。
-
客户端实现基本原理 - step3:客户端获取得到master节点后会执行一次role或者role replication来验证是否是master节点。
-
客户端实现基本原理 - step4:master节点发生变化,sentinel是感知的(所有的故障发现、转移是由sentinel做的);
sentinel怎么通知client的呢?
内部是一个发布订阅的模式,client订阅sentinel的某一个频道,该频道里由谁是master的信息,假如由变化sentinel就在频道里publish一条消息,client订阅就可以获取到信息,通过新的master信息进行连接。
下图就是客户端实现基本原理:
客户端接入流程
- Sentinel 地址集合
- masterName
- 不是代理模式
jedis
- JedisSentinelPool不是连接Sentinel节点集合的连接池
- 本质上还是连接master
- 只是跟JedisPool进行区分
JedisSentinelPool sentinelPool = new JedisSentinelPool(masterName, sentinelSet, poolConfig, timeout);
Jedis jedis = null;
try {
jedis = redisSentinelPool.getResource();
//jedis command
} catch(Exception e) {
logger.error(e.getMessage(), e);
}finally {
if(jedis != null) {
jedis.close();
}
}