Redis哨兵(Sentinel)模式

Redis哨兵(Sentinel)模式

圖片在這裏插入圖片描述java

1、主從複製高可用

當咱們使用主從複製出現的問題

  • 手動故障轉移
  • 寫能力和存儲能力受限
  • 主從複製 -master 宕機故障處理圖片

主從切換技術的方法是:當主服務器宕機後,須要手動把一臺從服務器切換爲主服務器,這就須要人工干預,費事費力,還會形成一段時間內服務不可用。這不是一種推薦的方式,更多時候,咱們優先考慮哨兵模式。redis


~哨兵模式概述

哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進程,做爲進程,它會獨立運行。其原理是哨兵經過發送命令,等待Redis服務器響應,從而監控運行的多個Redis實例。服務器

哨兵主要有兩個做用網絡

  • 經過發送命令,讓Redis服務器返回監控其運行狀態,包括主服務器和從服務器。架構

  • 當哨兵監測到master宕機,會自動將slave切換成master,而後經過發佈訂閱模式通知其餘的從服務器,修改配置文件,讓它們切換主機。ide

然而一個哨兵進程對Redis服務器進行監控,可能會出現問題,爲此,咱們可使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就造成了多哨兵模式。測試

故障切換(failover)的過程。假設主服務器宕機,哨兵1先檢測到這個結果,系統並不會立刻進行failover過程,僅僅是哨兵1主觀的認爲主服務器不可用,這個現象成爲主觀下線。當後面的哨兵也檢測到主服務器不可用,而且數量達到必定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover操做。切換成功後,就會經過發佈訂閱模式,讓各個哨兵把本身監控的從服務器實現切換主機,這個過程稱爲客觀下線。這樣對於客戶端而言,一切都是透明的。spa

2、架構說明

圖片在這裏插入圖片描述代理

  1. 多個sentinel 發現並確認master有問題。
  2. 選舉出一個sentinel做爲領導
  3. 選出一個slave做爲master
  4. 通知其他的slave成爲新的master的slave
  5. 通知客戶端主從變化
  6. 等待老的master復活成新的master的slave

3、安裝配置

圖片在這裏插入圖片描述code

  1. 配置主從節點
  • 主節點
啓動命令:redis-server redis-7000.conf

配置

port 7000
daemonize yes
pidfile /var/run/redis-7000.pid
logfile "7000.log"
dir "/opt/soft/redis/data/"
  • Redis從節點
redis-server redis-7001.conf
redis-server redis-7002.conf

slave-1:

port 7002
daemonize yes
pidfile /var/run/redis-7002.pid
logfile "7002.log"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 7000

slave-2:

port 7001
daemonize yes
pidfile /var/run/redis-7001.pid
logfile "7001.log"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 7000


  1. 配置開啓sentinel監控主節點
  • sentine 主要配置  編輯 sentinel.conf
port ${port}
dir "/opt/soft/redis/data/"
logfile "${port}.log"
// 配置監聽的主服務器,這裏sentinel monitor表明監控,mymaster表明服務器的名稱,能夠自定義,192.168.11.128表明監控的主服務器,6379表明端口,2表明只有兩個或兩個以上的哨兵認爲主服務器不可用的時候,纔會進行failover操做。
sentinel monitor mymaster 127.0.0.1 7000 2   
sentinel down-after-millseseconds mymaster 30000 //判斷主節點時間
sentinel parallel-syncs mymaster 1    
sentinel failover-timeout mymaster 180000

啓動

redis-sentinel sentinel.conf

可使用 ps -ef|grep redis-sentinel 命令查看進程、圖片


4、實現原理

  • 故障轉移     --- java實現
/**
 * 測試Redis哨兵模式
 * @author liu
 */

public class TestSentinels {
    @SuppressWarnings("resource")
    @Test
    public void testSentinel() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(10);
        jedisPoolConfig.setMaxIdle(5);
        jedisPoolConfig.setMinIdle(5);
        // 哨兵信息
        Set<String> sentinels = new HashSet<>(Arrays.asList("127.0.0.1:26379","1127.0.0.1:26379","127.0.0.1:26379"));
        // 建立鏈接池
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig,"123456");
        // 獲取客戶端
        Jedis jedis = pool.getResource();
        // 執行兩個命令
        jedis.set("mykey""myvalue");
        String value = jedis.get("mykey");
        System.out.println(value);
    }
}

若是咱們把主服務器停掉,在通過一段時間的報錯後,redis集羣會恢復

  • 主觀下線和客觀下線

    • 主觀下線:當前sentintel節點認爲某個redis節點不可用。

    • 客觀下線:全部sentinel節點認爲某個redis節點不可用。

  • 三個定時任務

  1. 每10秒每一個sentinel對master 和 slave執行info

    - 發現slave節點
    - 確認主從關係
  2. 每2秒每一個sentinel經過master節點對channel交換信息(發佈訂閱)

    - 經過_sentinel_:hello頻道交互
    - 交互對節點的「見解」和自身信息
  3. 每1秒每一個sentinel 對其餘sentinel和redis執行ping

  • 領導者選舉

    • 只須要一個sentinel節點完成故障轉移

    • 經過sentinel is - master -down -by-addr 命令都但願成爲領導者

       -1. 每一個主觀下線都Sentitle 節點向其餘Sentinel節點發送命令,要求將它設置爲領導者
       
       -2. 收到命令對Sentinel節點若是沒有同一經過其餘Sentinel節點發送的命令,那麼就將同一該請求,不然拒絕
       
       -3. 若是該Sentinel節點發現直接的票數已經超過Sentinel集合半數且超過quorum,那麼它將成爲領導者
       
       -4. 若是此過程由多個Sentinel節點成爲領導者,那麼未來等待一段時間從新進行選舉

圖片在這裏插入圖片描述

  • 故障轉移(Sentinel領導者節點完成)

    • 1.從slave節點中選出一個 「合適點」節點做爲master節點
    • 2.對上面對slave節點執行slaveof no one 命令讓其成爲master節點。
    • 3.向剩餘的slave節點發送命令,讓它們成爲新的maater節點的slave節點,複製規避和parallel-syncs參數有關
    • 4.更新對原來master節點配置爲slave,並保持着對其 「關注」,當其恢復後命令他去複製新對master節點
  • 選擇 「合適的」 slave節點

    • 1.選擇slave-priority(slave節點優先級)最高對slave節點,若是存在返回,不存在繼續
    • 2.選擇複製偏移量最大的slave節點,複製最完整,存在返回,不存在繼續
    • 3.選擇runId最小的slave節點

5、須要說明的問題

  • 儘量在不一樣物理機上和同一個網絡部署Redis sentinel的全部節點
  • Redis sentinel中的sentinel節點個數應該大於等於3且最好是奇數。(節點數多能夠保證高可用)
  • Redis sentinel中的數據節點和普通數據節點沒有區別。每一個sentinel節點在本質上仍是一個Redis實例,只不過和Redis數據節點不一樣的是,其主要做用是監控Redis數據節點
  • 客戶端初始化時鏈接的是sentinel節點集合,再也不是具體的Redis節點,但sentinel只是配置中心不是代理。
相關文章
相關標籤/搜索