天天看點

徹底明白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]指令都能查詢叢集資訊,因為每個節點都維護叢集資訊,而且一般情況下都是相同的,例如:

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

每列資訊是:

[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. 主從切換日志

可通過日志,觀察主從切換:

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

如上圖所示:叢集中有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,則說明叢集不可用,如下圖:

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

在以下3種情況下,叢集會不可用:

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

可以發現這三種情況均是master不可用并且無法進行主從切換,而隻有master支援寫操作,是以此時叢集不可用。

下面通過日志觀察叢集不可用:

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

如上圖所示,在 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. 叢集容錯測試

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

9. 典型日志整理

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