天天看點

Redis Cluster 原理說的頭頭是道,這些配置不懂就是紙上談兵

作者:網際網路架構小馬哥

Redis Cluster 叢集相關配置,使用叢集方式的你必須重視和知曉。别嘴上原理說的頭頭是道,而叢集有哪些配置?如何配置讓叢集快到飛起,實作真正的高可用卻一頭霧水,通過下面這些配置詳解也讓你對叢集原理更加深刻,告别技術懸浮。

cluster-enabled

普通的 Redis 執行個體是不能成為叢集的一員,想要将該節點加入 Redis Cluster,需要設定 cluster-enabled yes。

cluster-config-file

cluster-config-file nodes-6379.conf 指定叢集中的每個節點檔案。

叢集中的每個節點都有一個配置檔案,這個檔案并不是讓程式員編輯的,是我自己建立和更新的,每個節點都要使用不同的配置檔案,一定要確定同一個叢集中的不同節點使用的是不同的檔案。

cluster-node-timeout

設定叢集節點不可用的最大逾時時間,節點失效檢測。叢集中當一個節點向另一個節點發送PING指令,但是目标節點未在給定的時限内傳回PING指令的回複時,那麼發送指令的節點會将目标節點标記為PFAIL(possible failuer,可能已失效);

如果master 節點超過這個時間還是無響應,則用它的從節點将啟動故障遷移,更新成主節點。

注意,任何一個節點在這個時間之内如果還是沒有連上大部分的主節點,則此節點将停止接收任何請求。

預設配置是 cluster-node-timeout 15000,機關是毫秒數。

cluster-port

該端口是叢集總線監聽 TCP 連接配接的端口,預設配置為 cluster-port 0,我就會把端口綁定為用戶端指令端口 + 10000(用戶端端口預設 6379,是以綁定為 16379 作為叢集總線端口)。每個 Redis Cluster 節點都需要開放兩個端口:

  • 一個用于服務于用戶端的 TCP 端口,比如 6379.
  • 另一個稱為叢集總線端口,節點使用叢集總線進行故障監測、配置更新、故障轉移等。用戶端不要與叢集總線端口通信,另外請確定在防火牆打開這兩個端口,否則 Redis 叢集接地那将無法通信。

cluster-replica-validity-factor

該配置用于決定當 Redis Cluster 叢集中,一個 master 當機後,如何選擇一個 slave 節點完成故障轉移自動恢複(failover)。如果設定為 0 ,則不管 slave 與 master 之間斷開多久,都認為自己有資格成為 master。

下面提供了兩種方式來評估 slave 的資料是否太舊。

  • 如果有多個 slave 可以 failover,他們之間會通過交換資訊選出擁有擁有最大複制 offset 的 slave 節點。
  • 每個 slave 節點計算上次與 master 節點互動的時間,這個互動包含最後一次 ping 操作、master 節點傳輸過來的寫指令、上次可 master 斷開的時間等。如果上次互動的時間過去很久,那麼這個節點就不會發起 failover。

針對第二點,互動時間可以通過配置定義,如果 slave 與 master 上次互動的時間大于 (node-timeout * cluster-replica-validity-factor) + repl-ping-replica-period,該 slave 就不會發生 failover。

例如,``node-timeout = 30 秒,cluster-replica-validity-factor=10,repl-ping-slave-period=10`秒, 表示slave節點與master節點上次互動時間已經過去了310秒,那麼slave節點就不會做failover。

調大 cluster-replica-validity-factor 則允許存儲過舊資料的 slave 節點提升為 master,調小的話可能會導緻沒有 slave 節點可以升為 master 節點。

考慮高可用,建議大家設定為 cluster-replica-validity-factor 0。

cluster-migration-barrier

沒有 slave 節點的 master 節點稱為孤兒 master節點,這個配置就是用于防止出現裸奔的 master。

當某個 master 的 slave 節點當機後,叢集會從其他 master 中選出一個富餘的 slave 節點遷移過來,確定每個 master 節點至少有一個 slave 節點,防止當孤立 master 節點當機時,沒有slave節點可以升為 master 導緻叢集不可用。

預設配置為 cluster-migration-barrier 1,是一個遷移臨界值。

含義是:遷移後 master 節點至少還有 1 個 slave 節點才能做遷移操作。比如 master A 節點有2個以上 slave 節點 ,當叢集出現孤兒 master B 節點時,A 節點富餘的 slave 節點可以遷移到 master B 節點上。

生産環境建議維持預設值,最大可能保證高可用,設定為非常大的值或者配置 cluster-allow-replica-migration no 禁用自動遷移功能。

cluster-allow-replica-migration 預設配置為 yes,表示允許自動遷移。

cluster-require-full-coverage

預設配置是 yes,表示為當 redis cluster 發現至少還有一個 哈希槽沒有被配置設定時禁止查詢操作。

這就會導緻叢集部分當機,整個叢集就不可用了,當所有哈希槽都有配置設定,叢集會自動變為可用狀态。

如果你希望 cluster 的子集依然可用,配置成 cluster-require-full-coverage yes。

cluster-replica-no-failover

預設配置為 no,當配置成 yes,在master 當機時,slave 不會做故障轉移升為 master。

這個配置在多資料中心的情況下會很有用,你可能希望某個資料中心永遠不要更新為 master 節點,否則 master 節點就漂移到其他資料中心了。

cluster-allow-reads-when-down

預設是 no,表示當叢集因主節點數量達不到最小值或者哈希槽沒有完全配置設定而被标記為失效時,節點将停止所有用戶端請求。

設定成 yes,則允許叢集失效的情況下依然可從節點中讀取資料,保證了高可用。

cluster-allow-pubsubshard-when-down

配置成 yes,表示當叢集因主節點數量達不到最小值或者哈希槽沒有完全配置設定而被标記為失效時,pub/sub 依然可以正常運作。

cluster-link-sendbuf-limit

設定每個叢集總線連接配接的發送位元組緩沖區的記憶體使用限制,超過限制緩沖區将被清空(主要為了防止發送緩沖區發送給慢速連接配接時無限延長時間的問題)。

預設禁用,建議最小設定1gb,這樣預設情況下叢集連接配接緩沖區可以容納至少一pubsub消息(client-query-buffer-limit 預設是1gb);

繼續閱讀