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.配置三個哨兵(配置相同,埠不同)
-
新建檔案配置拷貝進去作為備份
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的詳細資訊
- master屬性
- 獲取所有slave的狀態(根據master中的slave資訊)
- slave屬性
- runid
- role:slave
- master_host、master_port
- offset
- …
- slave屬性
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