1.客户端实现基本原理
(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).master节点发生变化,Sentinel是感知的(所有的故障发现、转移是由sentinel做的)。那么Sentinel怎么通知client的呢?内部是一个发布订阅的模式,client订阅Sentinel的某一个频道,该频道里有谁是master的信息,假如变化的Sentinel就在频道里publish一条消息,client就可以获取到信息,通过新的master信息进行连接。
在这里插入图片描述

(5).客户端实现基本原理
在这里插入图片描述

2.客户端介入
(1).流程

  • Sentinel地址集合
  • masterName
  • 不是代理模式

(2).代码示例

public class JedisSentinelDemo {
    public static void main(String[] args) {
        //设置连接池信息
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(50);
        jedisPoolConfig.setMaxWaitMillis(1000);
        //设置Sentinel所有节点信息
        Set<String> sentinelSet = new HashSet<>();
        sentinelSet.add("47.***.***.140:26379");//172.17.31.46
        sentinelSet.add("39.***.***.47:26379");
        sentinelSet.add("39.***.***.3:26379");//172.24.6.215
        JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinelSet, jedisPoolConfig, 10 * 1000);
        int counter = 0;
        while (true) {
            counter++;
            Jedis jedis = null;
            try {
                jedis = sentinelPool.getResource();
                //将key的值设置为10000以内的数
                Random random = new Random();
                int index = random.nextInt(10000) + 1;
                String key = "k-" + index;
                String value = "v-" + index;
                jedis.set(key, value);
                if (counter % 100 == 0) {
                    System.out.println("key:" + key + ",value" + jedis.get(key));
                }
                TimeUnit.MILLISECONDS.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (jedis != null) {
                    jedis.close();
                }
            }
        }
    }
}

成功运行后,会输入如下信息。

19:04:57.824 [main] INFO redis.clients.jedis.JedisSentinelPool - Trying to find master from available Sentinels...
19:04:57.827 [main] DEBUG redis.clients.jedis.JedisSentinelPool - Connecting to Sentinel 47.***.***.140:26379
19:04:57.892 [main] DEBUG redis.clients.jedis.JedisSentinelPool - Found Redis master at 47.***.***.140:6379
19:04:57.892 [main] INFO redis.clients.jedis.JedisSentinelPool - Redis master running at 47.***.***.140:6379, starting Sentinel listeners...
19:04:57.996 [main] INFO redis.clients.jedis.JedisSentinelPool - Created JedisPool to master at 47.***.***.140:6379
key:k-7504,valuev-7504
key:k-6910,valuev-6910
......
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐