10.Redis哨兵架構

lglglglglgui發表於2020-09-24

概述

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();
        }
    }
}

相關文章