寫在前面
參考文章:
- 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]
詳細解釋:
-
runid: 該行描述的節點的id。
-
ip:prot: 該行描述的節點的ip和port
-
flags: 逗號分隔的標記位,可能的值有:
master: 該行描述的節點是master slave: 該行描述的節點是slave fail?:該行描述的節點可能不可用 fail:該行描述的節點不可用(故障)
-
master_runid: 該行描述的節點的master的id,如果本身是master則顯示-
-
ping-sent: 最近一次發送ping的Unix時間戳,0表示未發送過
-
pong-recv:最近一次收到pong的Unix時間戳,0表示未收到過
-
config-epoch: 好像是主從切換的次數
-
link-state: 連接狀態,connnected 和 disconnected
-
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種情況下,集羣會不可用:
- 某個master和其slave同時失聯。
- 某個master失聯,並且其無slave。
- 超過半數的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. 典型日誌整理