1. 程式人生 > 其它 >redis(七)哨兵

redis(七)哨兵

簡介

哨兵(sentinel) 是一個分散式系統,用於對主從結構中的每臺伺服器進行監控,當出現故障時通過投票機制選擇新的 master並將所有slave連線到新的master

作用:

  • 監控

    ​ 不斷的檢查master和slave是否正常執行。 master存活檢測、master與slave執行情況檢測

  • 通知(提醒)

    ​ 當被監控的伺服器出現問題時,向其他(哨兵間,客戶端)傳送通知。

  • 自動故障轉移

    ​ 斷開master與slave連線,選取一個slave作為master,將其他slave連線到新的master,並告知客戶端新的服 務器地址

注意:

哨兵也是一臺redis伺服器,只是不提供資料服務

通常哨兵配置數量為單數 因為要投票,雙數有可能會打平

配置哨兵模式

1.配置一拖2的主從結構

​ 之前已經有一主一從了,現在啟動第三臺

docker run -p 6381:6381 --name redis-6381 -v /usr/local/docker/redis/conf:/etc/redis/ -v /usr/local/docker/redis/data:/data -d redis redis-server /etc/redis/redis-6381.conf

現在有6379、6380、6381三臺redis 主為6379

2.配置三個哨兵(配置相同,埠不同)

  • 下載sentinel.conf

  • 新建檔案配置拷貝進去作為備份

    vim sentinel-common.conf
    
  • 配置sentinel.conf

cat sentinel-common.conf |grep -v "#" | grep -v "^$" > sentinel-26379.conf   去掉# 和空格

cp sentinel-26379.conf  sentinel-26380.conf

cp sentinel-26379.conf  sentinel-26381.conf
  • 修改檔案內的對應的埠26379 26380 26381

    新增驗證密碼用於連線主節點的時候密碼驗證

sentinel auth-pass mymaster zhao56

目錄結構如下

配置如下

日誌放到了data資料夾中

3.啟動三個哨兵

docker run -p 26379:26379 --name sentinel-26379 -v /usr/local/docker/redis/conf:/etc/redis/ -v /usr/local/docker/redis/data:/data -d redis  redis-sentinel /etc/redis/sentinel-26379.conf

docker run -p 26380:26380 --name sentinel-26380 -v /usr/local/docker/redis/conf:/etc/redis/ -v /usr/local/docker/redis/data:/data -d redis  redis-sentinel /etc/redis/sentinel-26380.conf

docker run -p 26381:26381 --name sentinel-26381 -v /usr/local/docker/redis/conf:/etc/redis/ -v /usr/local/docker/redis/data:/data -d redis  redis-sentinel /etc/redis/sentinel-26381.conf

檢視生成的日誌檔案

26379.log

26380.log

26381.log

  • 連線哨兵23679
docker exec -it sentinel-26379 redis-cli -p 26379

get 命令不能用

執行info 命令會發現

  • 現在停掉6379的redis即master
docker stop redis-6379

檢視26379日誌

可以看出發現6379掉線,然後投票3/2 三個哨兵都說6379掉線了,大於設定的數量2

所以選舉出新的master 為6381

  • 驗證master掉線


6380只允許讀不允許寫6381可以設定name成功

  • 重新啟動6379

過一會發現

6379 重新連上來了,變成了slave

哨兵模式原理

哨兵在進行主從切換過程中經歷三個階段

1.監控

2.通知

3故障轉移

1.監控階段

  • 用於同步各個節點的狀態資訊
    • 獲取各個sentinel的狀態(是否線上)
    • 獲取master的狀態
      • master屬性
        • runid
        • role:master
      • 各個slave的詳細資訊
    • 獲取所有slave的狀態(根據master中的slave資訊)
      • slave屬性
        • runid
        • role:slave
        • master_host、master_port
        • offset

1.當第一個sentinel連線以後會想master傳送info指令

2.建立cmd連線方便之後發命令,並且雙方儲存一些資訊

3.向slave發info命令

4.第二胎sentinel連線上以後也會連線master發現已經連過了, 所以也會連線之前的sentinel

此時兩個sentinel資訊不同,所以建立釋出訂閱,相互發送ping命令,相互同步資訊

2.通知階段

sentinel1通過建立的連線向幾個服務端傳送命令,然後將反饋的狀態共享給其他sentinel,下次可能是sentinel2或sentinel3去傳送命令

3故障轉移階段

1.故障驗證

sentinel1會想master傳送指令,當master宕機的時候會沒有迴應,sentinel1重複發很多次之後發現仍未有迴應,就將master置為SRI_S_DIWN(主觀下線),此時將在sentinel共享中傳送master下線的訊息,其他sentinel會驗證是否下線,超過半數投票master下線就將master置為SRI_O_DOWN(客觀下線)

2.挑選領頭的sentinel

sentinel會發送各自的資訊進行投票,最終選擇領頭的sentinel,所以sentinel最好設定成單數,以防打平

3.處置

master下線,領頭的sentinel需要將master下線,並挑選出新的master

原則:

  • 線上的
  • 剃掉響應慢的
  • 剃掉與原master斷開時間久的
  • 優先原則
    • 優先順序
    • offset 偏移量
    • runid

傳送指令

想新的master傳送slveof no one 斷開連線

想其他slave傳送訊息連線新的master