10.Redis哨兵架构

概述

sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。如果redis的主节点挂掉,利用哨兵机制,可以从剩下的从节点中选出主节点,弥补了上一节讲的主从复制架构不能自动选举主节点的难处。
有了sentinel哨兵之后,客户端第一次不会主动去找redis的主节点,而是去访问哨兵主节点的ip与端口,之后客户端就直接访问redis的主节点。
当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis 主节点通知给client端。
redis的主目录下有sentinel哨兵的配置文件,src目录下有哨兵的启动服务。

在这里插入图片描述

redis哨兵架构搭配步骤

1.
#复制一份sentinel.conf文件
cp sentinel.conf sentinel_26379.conf 

2.
#将相关配置修改为如下值:
 	port 26379 
 	daemonize yes 
 	pidfile "/var/run/redis‐sentinel_26379.pid" 
 	logfile "26379.log" 
	dir "/usr/local/redis‐5.0.2/data" 
	# sentinel monitor <master‐name> <ip> <redis‐port> <quorum> 
	# quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 + 1),master才算真正失效
	sentinel monitor mymaster 192.168.20.136 6379 2  
	
3.	
#启动sentinel哨兵实例 
src/redis‐sentinel sentinel‐26379.conf

4.
#查看sentinel的info信息 
src/redis‐cli ‐p 26379 
127.0.0.1:26379>info 
可以看到Sentinel的info里已经识别出了redis的主从

5.可以自己再配置两个sentinel,端口26380和26381,注意上述配置文件里的对应数字都要修改

搭建结果

在这里插入图片描述
一个主节点,两个从节点,三个哨兵

哨兵的Jedis连接代码

public class JedisSentinelTest {
    
    
 
    public static void main(String[] args) {
    
    
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(20);
        jedisPoolConfig.setMaxIdle(10);
        jedisPoolConfig.setMinIdle(5);
 
        Set<String> sentinels = new HashSet<>();
        sentinels.add(new HostAndPort("192.168.20.136", 26379).toString());
        sentinels.add(new HostAndPort("192.168.20.136", 26380).toString());
        sentinels.add(new HostAndPort("192.168.20.136", 26381).toString());
 		 //JedisSentinelPool其实本质跟JedisPool类似,都是与redis主节点建立的连接池
 		 //JedisSentinelPool并不是说与sentinel建立的连接池,而是通过sentinel发现redis主节点并与其建立连接 
 		 //masterName需要与哨兵的配置文件中配置的主节点名称一致
        String masterName = "mymaster";
        JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels,
                jedisPoolConfig, 3000, null);
 		Jedis jedis = null;
 		try {
    
    
        jedis = jedisSentinelPool.getResource();
        System.out.println(jedis.set("sentinel", "zhangsan")); 
        System.out.println(jedis.get("sentinel"));
        } catch (Exception e) {
    
    
  		e.printStackTrace();
        } finally {
    
    
        //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
        if(null != jedis)
            jedis.close();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/lglglglglgui/article/details/108782170