寫在前面
參考文章:
- 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