徹底明白Redis集羣主從切換原理

寫在前面

參考文章:

  1. https://www.cnblogs.com/dadonggg/p/8628735.html

1.Redis Cluster

爲了支持高可用,Redis提供了集羣部署方案,當master發生故障時,能及時進行主從切換。

redis-cli 使用參數【-c】連接集羣中任意一個節點,無論是主還是從,都沒有任何區別,都能訪問整個集羣。

Jedis使用JedisCluster時也一樣,配置一個節點即可訪問整個集羣,配置多個更安全。

這是因爲Redis集羣是去中心化的,每個節點都維護着集羣所有節點的信息。

2.什麼是主從切換?

主從切換是指某個master不可用時,它的其中一個從節點升級爲master的操作。

通過投票機制來判斷master是否不可用,參與投票的是所有的master,所有的master之間維持着心跳,如果一半以上的master確定某個master失聯,則集羣認爲該master掛掉,此時發生主從切換。

通過選舉機制來確定哪一個從節點升級爲master。選舉的依據依次是:網絡連接正常->5秒內回覆過INFO命令->10*down-after-milliseconds內與主連接過的->從服務器優先級->複製偏移量->運行id較小的。選出之後通過slaveif no ont將該從服務器升爲新master。

通過配置文件參數【cluster-node-timeout】指定心跳超時時間,默認是15秒。

3. 集羣信息

在任意節點執行[cluster nodes]命令都能查詢集羣信息,因爲每個節點都維護集羣信息,而且一般情況下都是相同的,例如:
在這裏插入圖片描述
每列信息是:

[runid] [ip:port] [flags] [mster_runid] [ping-sent] [pong-recv] [config-epoch] [link-state] [hash slot]

詳細解釋:

  1. runid: 該行描述的節點的id。

  2. ip:prot: 該行描述的節點的ip和port

  3. flags: 逗號分隔的標記位,可能的值有:

    master: 該行描述的節點是master
    slave: 該行描述的節點是slave
    fail?:該行描述的節點可能不可用
    fail:該行描述的節點不可用(故障)
    
  4. master_runid: 該行描述的節點的master的id,如果本身是master則顯示-

  5. ping-sent: 最近一次發送ping的Unix時間戳,0表示未發送過

  6. pong-recv:最近一次收到pong的Unix時間戳,0表示未收到過

  7. config-epoch: 好像是主從切換的次數

  8. link-state: 連接狀態,connnected 和 disconnected

  9. hash slot: 該行描述的master中存儲的key的hash的範圍

默認情況下,每個節點都會持久化集羣信息到workdir下的[ndoes-6379.conf]文件中,用於節點重啓後能夠正確的加入集羣。

4. 主從切換日誌

可通過日誌,觀察主從切換:
在這裏插入圖片描述
如上圖所示:集羣中有9個節點,端口分別是7001~7009

7007的master在10:38:29時發現失聯,此時狀態是[disconnected],

15秒後在10:38:45時,被確定爲不可用,此時狀態是[fail]。

並在下一秒即10:38:46時完成主從切換,7007原來的從節點7006升級爲master。

5. 從節點重啓

slave重啓時,會根據集羣信息加入到集羣;首先檢查master是否在線,如果在線則自動成爲其slave;如果master不在線,則成爲新master的slave。

Redis的主從關係是鏈式的,一個從節點也是可以擁有從節點的,所以一個當一個slave重啓時,如果其原來的master現在也是從節點的,但是該slave仍然會成爲它的從節點,就出現了從節點的從節點。

6. 從節點均衡

當某個master無可用的slave時,Redis Cluster會嘗試將其他master的slave轉移給這個master,作爲它的從節點。

7. 集羣不可用

當集羣不可用時,客戶端會收到 【CLUSTERDOWN the cluster is down 】的錯誤信息;也可以通過命令【cluster info】查看一個集羣的狀態,如果輸出的【cluster_stat】是ok說明狀態正常,如果是fail,則說明集羣不可用,如下圖:
在這裏插入圖片描述
在以下3種情況下,集羣會不可用:

  1. 某個master和其slave同時失聯。
  2. 某個master失聯,並且其無slave。
  3. 超過半數的master同時失聯。

可以發現這三種情況均是master不可用並且無法進行主從切換,而只有master支持寫操作,所以此時集羣不可用。

下面通過日誌觀察集羣不可用:
在這裏插入圖片描述
如上圖所示,在 11:19:10 同時關閉master(7004)和其所有slave,3個節點的連接狀態立刻變成 disconnected,
在 11:19:31 時master(7004)被判斷爲fail狀態,並且此時無可用的slave,因此 cluster_state 變成 fail, 此時客戶端任何指令都將響應: cluster is down

注意在 11:19:10 ~ 11:19:30 之間,集羣狀態是ok,客戶端如果不訪問master(7004)則無異常,如果訪問master(7004),因爲該節點已關閉,所以操作系統會響應: Connection Refused

8. 集羣容錯測試

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

9. 典型日誌整理

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

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