redis集羣—哨兵

redis sentinel 哨兵原理,配置和使用

Redis主從複製哨兵模式

Redis進階實踐之十 Redis哨兵集羣模式

深入淺出Redis-redis哨兵集羣

 

redis 的默認端口是6379

sentinel監聽端口,默認是26379

 

Redis Ping 命令使用客戶端向 Redis 服務器發送一個 PING ,如果服務器運作正常的話,會返回一個 PONG 。通常用於測試與服務器的連接是否仍然生效,或者用於測量延遲值

 

Redis Info 命令以一種易於理解和閱讀的格式,返回關於 Redis 服務器的各種信息和統計數值

Redis Monitor 命令用於實時打印出 Redis 服務器接收到的命令,調試用。

 

Redis哨兵模式



 

哨兵的幾個不足點:

 

1、哨兵集羣中只要有一臺宕了,整個集羣的故障轉移機制就失效了。

2、哨兵啓動時候redis主庫必需運行正常,否則故障轉移機制也失效。

3、應用端需要先詢問哨兵才能訪問到redis主庫,是否對效率也有明顯的影響。

 

一、簡介

在使用主從複製的情況下,Master服務器進行了down機的情況,我們的系統就不能再進行寫的操作,所以此時redis在2.6版本引入了哨兵模式,但是並不穩定,2.8版本之後哨兵模式才穩定了起來。

顧名思義Redis的哨兵模式就是對redis系統進行實時的監控,其主要功能有下面兩點

1.監測主數據庫和從數據庫是否正常運行。

2.當我們的主數據庫出現故障的時候,可以自動將從數據庫轉換爲主數據庫,實現自動的切換。

 

 

Sentinel是Redis高可用性的解決方案:

由一個或多個Sentinel實例組成的Sentinel系統可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,並在被監視的主服務器進入下線狀態時,自動將已下線主服務器屬下的模模個從服務器升級爲新的主服務器,然後由新的主服務器代替已下線的主服務器繼續處理命令請求。

 

Redis提供的sentinel(哨兵)機制,通過sentinel模式啓動redis後,自動監控master/slave的運行狀態,

基本原理是:心跳機制+投票裁決

監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。

提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。

自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其他從服務器改爲複製新的主服務器; 當客戶端試圖連接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可以使用新主服務器代替失效服務器。

 

 

哨兵(sentinel) 雖然有一個單獨的可執行文件 redis-sentinel ,但實際上它只是一個運行在特殊模式下的 Redis 服務器,你可以在啓動一個普通 Redis 服務器時通過給定 --sentinel 選項來啓動哨兵(sentinel),哨兵(sentinel) 的一些設計思路和zookeeper非常類似。

 

Sentinel集羣之間會互相通信,溝通交流redis節點的狀態,做出相應的判斷並進行處理,這裏的主觀下線狀態和客觀下線狀態是比較重要的狀態,它們決定了是否進行故障轉移,可以 通過訂閱指定的頻道信息,當服務器出現故障得時候通知管理員,客戶端可以將 Sentinel 看作是一個只提供了訂閱功能的 Redis 服務器,你不可以使用 PUBLISH 命令向這個服務器發送信息,但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通過訂閱給定的頻道來獲取相應的事件提醒。一個頻道能夠接收和這個頻道的名字相同的事件。 比如說, 名爲 +sdown 的頻道就可以接收所有實例進入主觀下線(SDOWN)狀態的事件。 

 

 

二、步驟:

1. 啓動並初始化Sentinel(哨兵)

a、初始化服務器

b、將普通redis服務器使用的代碼替換成Sentinel專用代碼

c、初始化Sentinel狀態,sentinelState結構中保存了服務器中所有和Sentinel功能有關的狀態:

當前紀元,用於實現故障轉移:uint64_t current_epoch

所有被這個sentinel監視的主服務器:dict *masters

是否進入了tilt模式:int tilt

正在執行的腳本數量:int running_scripts

進入tilt模式的時間:mstime_t tilt_start_time

最後一次執行時間處理器的時間:mstime_t previous_time

FIFO隊列,包含了所有需要執行的用戶腳本:list *scripts_queue

d、根據給定的配置文件,初始化Sentinel的監視主服務器列表(dict *masters):字典的鍵是被監視主服務器的名字,字典的值則是被監視主服務器對應的sentinelRedisInstance結構

e、創建連向主服務器的網絡連接

命令連接:專門用於向主服務器發送命令,並接收命令回覆

訂閱連接:專門用於訂閱主服務器的_sentinel_:hello頻道

 

2. 獲得主服務器信息

Sentinel默認會以每10s/次的頻率,通過命令連接它已知的所有Master,Slave發送 INFO命令,並通過分析INFO命令的回覆來獲取主服務器的當前信息

 

3. 獲取從服務器信息  

當Sentinel發現主服務器有新的從服務器出現時,Sentinel除了會爲這個新的從服務器創建相應的實例結構之外,還會創建連接到從服務器的命令連接和訂閱連接。

 

4. 向主服務器和從服務器發送信息

默認情況下,Sentinel會以2s/次的頻率,通過命令連接向所有被監視的主服務和從服務器發送信息

 

5. 接收來自主服務器和從服務器的頻道信息

對於監視同一個服務器的多個Sentinel來說,一個Sentinel發送的信息會被其他Sentinel接收到,這些信息會被用於更新其他sentinel對發送信息sentinel的認知,也會被用於更新其他sentinel對被監視服務器的認知。

 

6. 檢測主觀下線狀態

默認情況下,sentinel會以1s/次的頻率向所有與它創建了命令連接的實例(包括主服務器、從服務器、其他sentinel在內)發送PING命令,並通過實例返回的PING命令回覆來判斷實例是否在線

 

7. 檢查客觀下線狀態

當sentinel將一個主服務器判斷爲主觀下線之後,爲了確認這個主服務器是否真的下線,他會向同樣監視這一主服務器的其他Sentinel進行詢問,看他們是否也任務主服務器已經下線。當Sentinel從其他sentinel那裏接收到足夠數量的已下線判斷之後,sentinel就會將主服務器判定爲客觀下線,並進行故障轉移操作。

 

8. 選舉領頭sentinel

a、每個成爲candidate的sentinel將自己紀元數+1,並向其他sentinel發送要求選舉自己爲局部領頭sentinel的命令

b、每個folloewer-candidate都選舉第一個接收到的請求作爲自己的局部領頭sentinel並回復,然後將自己的紀元數+1

c、 每個candidate統計自己的票數,如果>=n/2+1,則該sentinel成爲領頭sentinel。

 

9. 故障轉移

a、 在已下線主服務器屬下的所有從服務器裏面,挑選出一個從服務器,並將其轉換爲主服務器

b、讓已下線主服務器屬下的所有從服務器改爲複製新的主服務器

c、將已下線主服務器設置爲新的主服務器的從服務器,當這個舊的主服務器重新上線時,他就會成爲新的主服務器的從服務器。

 

 

三、Sentinel的工作方式:

1):每個Sentinel以 1s/次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發送一個 PING 命令 

2):如果一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記爲主觀下線(SDOWN)。 

3):如果一個Master被標記爲主觀下線,則正在監視這個Master的所有 Sentinel 要以 1s/次的頻率確認Master的確進入了主觀下線狀態。 

4):當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記爲客觀下線(ODOWN)。 

5):在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令 

6):當Master被 Sentinel 標記爲客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發送 INFO 命令的頻率會從 10 秒一次改爲每秒一次 

7):若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。 

若 Master 重新向 Sentinel 的 PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除。

 

 

四、配置 

配置哨兵模式核心文件

sentinel monitor 被監控數據庫名字(自己起名字) 127.0.0.1 6379(主機IP端口) 1

上面最後一個數字1,表示主機掛掉後salve(從機)投票看讓誰接替成爲主機,得票數多少後升爲主機

 

 

啓動哨兵模式

redis-sentinel /myredis/sentinel.conf

 

查看狀態

INFO replication

 

Sentinel常用命令

1.  ping  //返回 PONG 。

2.  sentinel masters  //列出所有被監視的主服務器,以及這些主服務器的當前狀態。

3.  sentinel slaves <master name>  //列出給定主服務器的所有從服務器,以及這些從服務器的當前狀態。

4.  sentinel get-master-addr-by-name <master name>  //返回給定名字的主服務器的 IP 地址和端口號。如果這個主服務器正在執行故障轉移操作,或者針對這個主服務器的故障轉移操作已經完成,那麼這個命令返回新的主服務器的IP 地址和端口號。

5.  sentinel reset <pattern>  //重置所有名字和給定模式 pattern 相匹配的主服務器。pattern參數是一個 Glob風格的模式。重置操作清除主服務器目前的所有狀態,包括正在執行中的故障轉移,並移除目前已經發現和關聯的,主服務器的所有從服務器和Sentinel 。

 sentinel failover <master name>  //當主服務器失效時,在不詢問其他 Sentinel意見的情況下,強制開始一次自動故障遷移(不過發起故障轉移的 Sentinel 會向其他Sentinel 發送一個新的配置,其他Sentinel 會根據這個配置進行相應的更新)。

 

 

Sentinel配置詳解

1. port 26379  //sentinel監聽端口,默認是26379,可以修改。

2.  sentinel monitor <master-name> <ip> <redis-port> <quorum> 

//告訴 sentinel去監聽地址爲ip:port的一個master,這裏的master-name可以自定義,quorum是一個數字,指明當有多少個sentinel認爲一個master失效時,master纔算真正失效。master-name只能包含英文字母,數字,和“.-_”這三個字符。

配置示例:sentinel monitor master-1 127.0.0.1 6379 2

 

3. sentinel down-after-milliseconds <master-name> <milliseconds>   

//sentinel會向master發送心跳PING來確認master是否存活,如果 master在“一定時間範圍”內不迴應PONG或者是回覆了一個錯誤消息,那麼這個sentinel會主觀地 (單方面地)認爲這個master已經不可用了 (subjectively down, 也簡稱爲SDOWN)。而這個down-after-milliseconds就是用來指定這個“一定時間範圍”的,單位是毫秒。

配置示例:sentinel down-after-milliseconds master-1 5000

 

4.  sentinel failover-timeout <master-name> <milliseconds> 

//如果在該時間(ms)內未能完成failover操作,則認爲該failover失敗。

配置示例:sentinel failover-timeout master-1 18000

 

5. sentinel parallel-syncs <master-name> <numslaves> 

//在發生 failover主備切換時,這個選項指定了最多可以有多少個slave同時對新的 master進行同步,這個數字越小,完成failover所需的時間就越長,但是如果這個數字越大,就意味着越多的slave因爲replication而不可用。可以通過將這個值設爲 1來保證每次只有一個slave處於不能處理命令請求的狀態。

配置示例:sentinel parallel-syncs master-1 1

 

6.  sentinel notification-script <master-name> <script-path>  //通知型腳本

當sentinel有任何警告級別的事件發生時(比如說redis實例的主觀失效和客觀失效等等),將會去調用這個腳本,這時這個腳本應該通過郵件,SMS等方式去通知系統管理員關於系統不正常運行的信息。調用該腳本時,將傳給腳本兩個參數,一個是事件的類型,一個是事件的描述。如果sentinel.conf配置文件中配置了這個腳本路徑,那麼必須保證這個腳本存在於這個路徑,並且是可執行的,否則sentinel無法正常啓動成功。

 

配置示例:sentinel notification-script master-1 D:\script.bat

 

7.  sentinel client-reconfig-script <master-name> <script-path> 

//當一個 master由於failover而發生改變時,這個腳本將會被調用,通知相關的客戶端關於master地址已經發生改變的信息。以下參數將會在調用腳本時傳給腳本:<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>目前<state>總是“failover”, <role>是“leader”或者“observer”中的一個。參數 from-ip, from-port, to-ip, to-port是用來和舊的master和新的master(即舊的slave)通信的。這個腳本應該是通用的,能被多次調用,不是針對性的。

 

配置示例:sentinel client-reconfig-script mymaster D:\script.bat

 

8.  sentinel auth-pass <master-name> <password> 

//設置連接master和 slave時的密碼,注意的是sentinel不能分別爲master和slave設置不同的密碼,因此master和slave的密碼應該設置相同。

配置示例:sentinel auth-pass master-1 grs

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章