Redis专题(5):Redis Sentinel(哨兵)的客户端连接

客户端连接
请求响应流程
既然已经实现高可用为什么不直接直连?
高可用涉及的是服务高可用、完成自动的故障转移;故障转移后客户端无法感知将无法保证正常的使用。
需要保证的是服务高可用 客户端高可用

客户端实现基本原理
1.客户端实现基本原理 - step1:获取所有的Sentinel的节点和MasterName,遍历Sentinel集合得到一个可用(即可以ping通)的Sentinel节点。

 


2.客户端实现基本原理 - step2:向可用的Sentinel节点发送sentinel的get-master-addr-by-name的请求,参数masterName;获取master节点信息。

 


3.客户端实现基本原理 - step3:客户端获取得到master节点后会执行一次role或者role replication来验证是否是master节点。

 


4.客户端实现基本原理 - 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();
      }
    }

posted @ 2019-08-10 23:33  qxwang  阅读(368)  评论(0)    收藏  举报