企业级Redis开发运维从入门到实践 (25)— Redis Sentinel(哨兵)的客户端连接

时间:2024-03-19 17:58:03

客户端连接

请求响应流程

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

客户端实现基本原理
  1. 客户端实现基本原理 - step1:获取所有的Sentinel的节点和MasterName,遍历Sentinel集合得到一个可用(即可以ping通)的Sentinel节点。
    企业级Redis开发运维从入门到实践 (25)— Redis Sentinel(哨兵)的客户端连接

  2. 客户端实现基本原理 - step2:向可用的Sentinel节点发送sentinel的get-master-addr-by-name的请求,参数masterName;获取master节点信息。
    企业级Redis开发运维从入门到实践 (25)— Redis Sentinel(哨兵)的客户端连接

  3. 客户端实现基本原理 - step3:客户端获取得到master节点后会执行一次role或者role replication来验证是否是master节点。
    企业级Redis开发运维从入门到实践 (25)— Redis Sentinel(哨兵)的客户端连接

  4. 客户端实现基本原理 - step4:master节点发生变化,sentinel是感知的(所有的故障发现、转移是由sentinel做的);
    sentinel怎么通知client的呢?
    内部是一个发布订阅的模式,client订阅sentinel的某一个频道,该频道里由谁是master的信息,假如由变化sentinel就在频道里publish一条消息,client订阅就可以获取到信息,通过新的master信息进行连接。
    企业级Redis开发运维从入门到实践 (25)— Redis Sentinel(哨兵)的客户端连接

下图就是客户端实现基本原理:
企业级Redis开发运维从入门到实践 (25)— Redis Sentinel(哨兵)的客户端连接

客户端接入流程
  1. Sentinel 地址集合
  2. masterName
  3. 不是代理模式
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();
	}
}