1. 程式人生 > >Redis Cluster 介紹與使用

Redis Cluster 介紹與使用

Redis Cluster 功能特性

Redis 叢集是分散式的redis 實現,具有以下特性:

1. 高可用性與可線性擴張到1000個節點
2. 資料自動路由到多個節點
3. 節點間資料共享
4. 可動態新增或者刪除節點
5. 部分節點不可達時,叢集仍可用
6. 資料通過非同步複製,不保證資料的強一致性
7. 可動態調整資料分佈

Redis 叢集架構圖

redis-cluster.png

其中
	一: Redis 叢集協議
		1、Redis 叢集,節點負責儲存資料、記錄叢集狀態,叢集節點能自動發現其他節點,檢測出節點的狀態,並在需要的時候,推選中主節點
		2、Redis 叢集節點中通過TCP連線和一個二級制協議(cluster bus) 建立通訊。發現新的節點、傳送PING包、特定的情況下發送叢集訊息。叢集連線能夠釋出與訂閱訊息
		3、Redis 叢集節點不能代理請求,客戶端發起請求後,接收到重定向(MOVED\ASK)錯誤,會自動重定向到其他節點。理論上來說,客戶端是可以自由地向叢集中的所有節點發送請求,在需要的時候把請求重定向到其他節點,所以客戶端是不需要儲存叢集狀態。 不過客戶端可以快取鍵值和節點之間的對映關係,這樣能明顯提高命令執行的效率。
	二: 安全寫入	
		Redis 叢集節點之間使用非同步複製,在分割槽過程中存在視窗,容易導致丟失寫入資料,Redis叢集即使努力嘗試所有寫入,但是以下兩種情況可能丟失資料:
			1、命令操作到達主節點後,但在主節點回復的時候,此時寫入可能還沒有通過主節點複製到從節點那裡。如果這時候主庫宕機了,這條命令永久丟失。以防主節點長時間不可達而它的一個從節點已經被提升為主節點。
			2、分割槽導致一個主節點不可達,然而叢集傳送故障轉移(failover),提升從節點為主節點,原來的主節點再次恢復。一個沒有更新路由表(routing table)的客戶端或許會在叢集把這個主節點變成一個從節點(新主節點的從節點)之前對它進行寫入操作。導致資料徹底丟失
	三: 可用性
		Redis 叢集少數節點不可用後,在經過cluster-node-timeout時間後,叢集根據自動故障機制,將從節點提升為主節點。這事叢集恢復可用
		舉個例子,一個由 N 個主節點組成的叢集,每個主節點都只有一個從節點。當有一個節點(因為故障)被分割出去後,叢集的多數節點這邊仍然是可訪問的。當有兩個節點(因故障)被分割出去後叢集仍可用的概率是 1-(1/(N*2-1))(在第一個節點故障出錯後總共剩下 N*2-1 個節點,那麼失去冗餘備份(即失去從節點)的那個主節點也故障出錯的概率是 1/(N*2-1)))。
		比如一個擁有6個節點的叢集,每個節點都只有一個從節點,那麼在兩個節點從多數節點這邊分割出去後叢集不再可用的概率是 1/(6*2-1) = 0.0909,即有大約 9% 的概率。

Redis 叢集資料分佈

Redis 叢集沒有使用一致性hash,引入了雜湊槽(HASH SLOT).
Redis 叢集中所有的主節點都負責 16384 個雜湊槽中的一部分。當叢集處於穩定狀態時,叢集中沒有在執行重配置(reconfiguration)操作,每個雜湊槽都只由一個節點進行處理(不過主節點可以有一個或多個從節點,可以在網路斷線或節點失效時替換掉主節點) 
slot = CRC16(KEY) / 16384

Redis 叢集鍵HASH標籤

目標: 
    HASH 標籤是確保兩個KEY 都能在同一個HASH槽的一種方式。
實現方式:
    HASH 槽是用另一種不同的計算方式計算的。基本來說,如果KEY包含一個"{...}"這樣的模式,只有“{” 和 “}” 之間的字串會被用來做HASH以獲取HAS槽。如果同時出現多個“{}” 計算方式如下:
    * 如果KEY 包含一個 “{” 字元
    * 那麼在 “{”的右邊就會字元 "}"
    * 在字元 "{" 和 "}"直接會有一個或多個字元。但是第一個"}" 一定會出現在第一個"{"之後
    * 只有在第一個 { 和它右邊第一個 } 之間的內容會被用來計算雜湊值
例子:
    1、比如這兩個鍵 user:{1000}.following 和user:{1000}.followers 會被雜湊到同一個雜湊槽裡,因為只有 "1000" 這個子串會被用來計算雜湊值。
    2、對於 user{}{list} 這個鍵,整個鍵都會被用來計算雜湊值,因為第一個出現的 { 和它右邊第一個出現的 } 之間沒有任何字元。
    3、對於 user{{momoid}}following 這個鍵,用來計算雜湊值的是 "{momoid" 這個子串,因為它是第一個 { 及其右邊第一個 } 之間的內容。
    4、對於 user{momoid}{following} 這個鍵,用來計算雜湊值的是 "momoid" 這個子串,因為演算法會在第一次有效或無效(比如中間沒有任何位元組)地匹配到 { 和 } 的時候停止。
    5、按照這個演算法,如果一個鍵是以 {} 開頭的話,那麼就當作整個鍵會被用來計算雜湊值。當使用二進位制資料做為鍵名稱的時候,這是非常有用的。

Redis 叢集相關命令

叢集
    1、CLUSTER INFO 列印叢集的資訊  
    2、CLUSTER NODES 列出叢集當前已知的所有節點(node),以及這些節點的相關資訊。 
    3、CLUSTER FAILOVER 手動故障轉移,需要在轉移的主節點的從節點上執行 
節點  
    1、CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。  
    2、CLUSTER FORGET <node_id> 從叢集中移除 node_id 指定的節點。  
    3、CLUSTER REPLICATE <node_id> 將當前節點設定為 node_id 指定的節點的從節點。  
    4、CLUSTER SAVECONFIG 將節點的配置檔案儲存到硬盤裡面。  
槽(slot)  
    1、CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。  
    2、CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。  
    3、CLUSTER FLUSHSLOTS 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。  
    4、CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽,然後再進行指派。  
    1、CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。  
    2、CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中匯入槽 slot 到本節點。  
    3、CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的匯入(import)或者遷移(migrate)。  
鍵  
    1、CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。  
    2、CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。  
    3、CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。    
不支援的命令:
    1、不支援SELECT 命令,叢集只使用資料庫 0 
    2、不支援多個KEY的操作 如 MSET、SUION、SINTER等命令 (因為KEYS 無法hash到同一個slot中)

redis-trib.rb 相關命令
    1、redis-trib.rb create [--replicas N] host:ip [host:ip ...]  建立叢集
    2、redis-trib.rb add-node host:ip host:ip  將前面的host:ip 新增到叢集中
    3、redis-trib.rb check host:ip 檢查叢集的狀態
    4、redis-trib.rb reshard host:ip OR  redis-trib.rb reshard --from host:port --to host:port --slots --yes叢集重新分片
    5、redis-trib.rb del-node host:ip 'NODE ID' 將節點從叢集中移除

Redis 叢集配置

redis 叢集需要執行在 叢集模式的redis例項,不是普通的redis例項。叢集模式需要新增叢集相關的配置。開啟叢集模式的redis例項,可以使用叢集特有的命令和特性

其中相關配置如下:

必須配置:
cluster-enabled yes                         --> 開啟叢集模式
cluster-config-file nodes-30000.conf        --> 叢集相關的資訊
cluster-node-timeout 15000                  --> 節點超時時間,用來failover的操作

可選配置:
cluster-slave-validity-factor 10            
cluster-migration-barrier 1
cluster-require-full-coverage yes

Redis Cluster 主從搭建

啟動叢集模式的例項(與普通啟動方式一致),不需搭建主從關係

搭建叢集: 在上述啟動的6個redis例項中,搭建叢集。通過redis自帶的叢集命令列工具 redis-trib.rb 。 redis-trib.rb 位於redis原始碼包中src檔案中。它可以完成建立叢集、檢查叢集、叢集reshard、新增節點、刪除節點等操作

建立叢集 redis-trib.rb create [–replicas [N]] host:ip [host:ip]

redis-trib.rb create --replicas 1 127.0.0.1:30000 127.0.0.1:30001 127.0.0.1:30001 127.0.0.1:31000 127.0.0.1:31001 127.0.0.1:31002
其中 --replicas N 選項表明叢集中的每個節點帶幾個從節點

輸出日誌:
    [OK] All 16384 slots covered

叢集狀態檢查 redis-trib.rb check host:ip

redis-trib.rb check 127.0.0.1:30000
輸出日誌:
    Connecting to node 127.0.0.1:30000: OK
    Connecting to node 127.0.0.1:30002: OK
    Connecting to node 127.0.0.1:31000: OK
    Connecting to node 127.0.0.1:31001: OK
    Connecting to node 127.0.0.1:30001: OK
    Connecting to node 127.0.0.1:31002: OK
    >>> Performing Cluster Check (using node 127.0.0.1:30000)
    M: 36801ef9849f12526be1e954f9e6f6fa24c50d46 127.0.0.1:30000
        slots:0-5961,10923-11421 (6461 slots) master
        1 additional replica(s)
    M: 98c4c66ee189569dec47a9600b057f90626cc6a7 127.0.0.1:30002
        slots:11422-16383 (4962 slots) master
        1 additional replica(s)
    S: 54d7d1241b1d9c24f76d99e9814d8cf8d8db474e 127.0.0.1:31000
        slots: (0 slots) slave
        replicates 36801ef9849f12526be1e954f9e6f6fa24c50d46
    S: 3f5ae989b9b1b6617c53e77ed4853b618408bbe6 127.0.0.1:31001
        slots: (0 slots) slave
        replicates 6b880ae14f8c9dbfd54f8c4811cf0c039d523216
    M: 6b880ae14f8c9dbfd54f8c4811cf0c039d523216 127.0.0.1:30001
        slots:5962-10922 (4961 slots) master
        1 additional replica(s)
    S: 81a3a70ce2fbb8bcce2e9be9ed77e34d9d4d5b21 127.0.0.1:31002
        slots: (0 slots) slave
        replicates 98c4c66ee189569dec47a9600b057f90626cc6a7
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.

新增節點: 啟動一個新的叢集模式的redis例項。使用 redis-trib.rb add-node host:ip host:ip

redis-trib.rb add-node 127.0.0.1:30004 127.0.0.1:3000
其中  127.0.0.1:30004 為新節點  127.0.0.1:30000 為叢集中任意節點

檢視叢集節點:
    redis-cli  -c -p 30000
    127.0.0.1:30000> CLUSTER NODES
    98c4c66ee189569dec47a9600b057f90626cc6a7 127.0.0.1:30002 master - 0 1429686483614 3 connected 11422-16383
    54d7d1241b1d9c24f76d99e9814d8cf8d8db474e 127.0.0.1:31000 slave 36801ef9849f12526be1e954f9e6f6fa24c50d46 0 1429686485615 7 connected
    3f5ae989b9b1b6617c53e77ed4853b618408bbe6 127.0.0.1:31001 slave 6b880ae14f8c9dbfd54f8c4811cf0c039d523216 0 1429686484614 5 connected
    2eb135bf03dbdbc57e704578b2833cc3fb860b6e 127.0.0.1:30004 master - 0 1429686479607 0 connected   --> 新節點
    6b880ae14f8c9dbfd54f8c4811cf0c039d523216 127.0.0.1:30001 master - 0 1429686481612 2 connected 5962-10922
    81a3a70ce2fbb8bcce2e9be9ed77e34d9d4d5b21 127.0.0.1:31002 slave 98c4c66ee189569dec47a9600b057f90626cc6a7 0 1429686482613 6 connected
    36801ef9849f12526be1e954f9e6f6fa24c50d46 127.0.0.1:30000 myself,master - 0 0 7 connected 0-5961 10923-11421

輸出資訊解析:
    1、節點ID
    2、IP:PORT
    3、節點狀態標識: master、slave、myself、fail?、fail
    4、如果是從節點,表示主節點的ID。如果是主節點,為 '-'
    5、叢集最近一次向各個節點發送PING命令後,過去多長時間還沒有接到回覆
    6、節點最近一次返回PONG的時間戳
    7、節點的配置紀元
    8、本節點的網路連線情況: connected、disconnected
    9、如果是主節點,表示節點包含的曹 

新增從節點: CLUSTER REPLICATE ID

 127.0.0.1:31004> CLUSTER REPLICATE 2eb135bf03dbdbc57e704578b2833cc3fb860b6e 
	其中  2eb135bf03dbdbc57e704578b2833cc3fb860b6e 為主庫的叢集ID 

叢集reshard: 為新節點分片slots redis-trib.rb reshard host:port

redis-trib.rb reshard 127.0.0.1:30004
日誌輸出:
Shell# redis-trib.rb reshard 127.0.0.1:30004
Connecting to node 127.0.0.1:30004: OK
Connecting to node 127.0.0.1:30000: OK
Connecting to node 127.0.0.1:31001: OK
Connecting to node 127.0.0.1:30001: OK
Connecting to node 127.0.0.1:31000: OK
Connecting to node 127.0.0.1:30002: OK
Connecting to node 127.0.0.1:31002: OK
>>> Performing Cluster Check (using node 127.0.0.1:30004)
M: 2eb135bf03dbdbc57e704578b2833cc3fb860b6e 127.0.0.1:30004      --> 新節點資訊
   slots: (0 slots) master
   0 additional replica(s)
M: 36801ef9849f12526be1e954f9e6f6fa24c50d46 127.0.0.1:30000
   slots:0-5961,10923-11421 (6461 slots) master
   1 additional replica(s)
S: 3f5ae989b9b1b6617c53e77ed4853b618408bbe6 127.0.0.1:31001
   slots: (0 slots) slave
   replicates 6b880ae14f8c9dbfd54f8c4811cf0c039d523216
M: 6b880ae14f8c9dbfd54f8c4811cf0c039d523216 127.0.0.1:30001
   slots:5962-10922 (4961 slots) master
   1 additional replica(s)
S: 54d7d1241b1d9c24f76d99e9814d8cf8d8db474e 127.0.0.1:31000
   slots: (0 slots) slave
   replicates 36801ef9849f12526be1e954f9e6f6fa24c50d46
M: 98c4c66ee189569dec47a9600b057f90626cc6a7 127.0.0.1:30002
   slots:11422-16383 (4962 slots) master
   1 additional replica(s)
S: 81a3a70ce2fbb8bcce2e9be9ed77e34d9d4d5b21 127.0.0.1:31002
   slots: (0 slots) slave
   replicates 98c4c66ee189569dec47a9600b057f90626cc6a7
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000               --> slot數量
What is the receiving node ID? 2eb135bf03dbdbc57e704578b2833cc3fb860b6e  --> 接收叢集NODE ID  
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:36801ef9849f12526be1e954f9e6f6fa24c50d46                  --> 來源NODE ID
Source node #2:done
......

Redis Cluster failover機制

節點心跳

Redis 叢集在執行的過程中,每個節點每秒會隨機ping幾個節點,不過每個節點都會保證去PING滿足這個條件的其他節點:在過去的一半"cluster-node-timeout"時間裡都沒有傳送PING包過去或者沒有接收從那節點發來的PONG包的節點。在"cluster-node-timeout"時間過去之前,若TCP連線有問題,節點會嘗試去重試連線,確保自己不會被當做不可達的節點。
如果 “cluster-node-time” 被設為一個很小的數而節點數量(N)非常大,那麼訊息交流數量會比 O(N) 更大,因為每個節點都會嘗試去 ping 每一個在過去一半 NODE_TIMEOUT 時間裡都沒更新資訊的節點。

失效檢測

Redis 叢集失效檢測是用來識別出大多數節點何時無法訪問某一個主節點或從節點。當這個事件發生時,就提升一個從節點來做主節點;若如果無法提升從節點來做主節點的話,那麼整個叢集就置為錯誤狀態並停止接收客戶端的查詢
每個節點都有一份跟其他已知節點相關的標識列表。其中有兩個標識是用於失效檢測,分別是 PFAIL 和 FAIL.
	PFAIL 標識: 表示可能失效(Possible failure),這是一個非公認的(non acknowledged)失效型別。
		當一個節點在超過 "cluster-node-timeout" 時間後仍無法訪問某個節點,那麼它會用 PFAIL 來標識這個不可達的節點。無論節點型別是什麼,主節點和從節點都能標識其他的節點為 PFAIL
	FAIL 表示一個節點已經失效,而且這個情況已經被大多數主節點在某段固定時間內確認過的了。
		滿足以下條件,PFAIL 狀態升級為 FAIL 狀態:(設定叢集含有 A B C AS BS CS 六個節點)
			1、節點A正常,節點C 狀態為 PFAIL
			2、節點A 通過gossip欄位收集叢集中大部分節點標識節點C的狀態資訊
			3、如果大部分節點標識節點C為 PFAIL 狀態,或者 cluster-node-timeout *  FAIL_REPORT_VALIDITY_MULT 這段時間內處於 PFAIL狀態
			
		此時節點A 會標記 節點C 為 FAIL 狀態,並向所有的節點發送關於節點C的 FAIL 資訊。 FAIL 資訊會強制接收的節點把節點C 標識為 FAIL 狀態
		
NOTE:
	FAIL 標識基本都是單向的,也就是說,一個節點能從 PFAIL 狀態升級到 FAIL 狀態. 清除FAIL狀態的方法:
		1、節點已經恢復可達的,並且它是一個從節點。在這種情況下,FAIL 標識可以清除掉,因為從節點並沒有被故障轉移。
		2、節點已經恢復可達的,而且它是一個主節點,但經過了很長時間(N * NODE_TIMEOUT)後也沒有檢測到任何從節點被提升了。

從選舉與提升

 從節點的選舉與提升都是由從節點處理的,主節點會投票要提升哪個從節點。當滿足以下條件,一個節點可以發起選舉:
		1、該從節點的主節點處理 FALI 狀態
		2、這個主節點負責的HASH曹個數不為O
		3、從節點和主節點之間的重複連線(replication link)斷線不超過一段給定的時間,這是為了確保從節點的資料是可靠
	一旦從節點被推選出來,就會想主節點請求投票,一旦從節點贏得投票,它會響所有其他節點發送PING 和 PONG 資料包,宣佈自己已經成為主節點,並且提供它的HASH槽資訊,並配置 currentEpoch 資訊
	為了加速其他節點的重新配置,該節點會廣播一個 pong 包 給叢集裡的所有節點(那些現在訪問不到的節點最終也會收到一個 ping 包或 pong 包,並且進行重新配置)。其他節點會檢測到有一個新的主節點(帶著更大的configEpoch)在負責處理之前一箇舊的主節點負責的雜湊槽,然後就升級自己的配置資訊。 舊主節點的從節點,或者是經過故障轉移後重新加入叢集的該舊主節點,不僅會升級配置資訊,還會配置新主節點的備份。 

模擬宕機(實現故障轉移)

叢集當期轉態:

127.0.0.1:30000> CLUSTER NODES
98c4c66ee189569dec47a9600b057f90626cc6a7 127.0.0.1:30002 master - 0 1429696352375 3 connected 11422-16383
54d7d1241b1d9c24f76d99e9814d8cf8d8db474e 127.0.0.1:31000 slave 36801ef9849f12526be1e954f9e6f6fa24c50d46 0 1429696349869 9 connected
3f5ae989b9b1b6617c53e77ed4853b618408bbe6 127.0.0.1:31001 slave 6b880ae14f8c9dbfd54f8c4811cf0c039d523216 0 1429696346364 5 connected
6b880ae14f8c9dbfd54f8c4811cf0c039d523216 127.0.0.1:30001 master - 0 1429696351373 2 connected 5962-10922
81a3a70ce2fbb8bcce2e9be9ed77e34d9d4d5b21 127.0.0.1:31002 slave 98c4c66ee189569dec47a9600b057f90626cc6a7 0 1429696350370 6 connected
36801ef9849f12526be1e954f9e6f6fa24c50d46 127.0.0.1:30000 myself,master - 0 0 9 connected 0-5961 10923-11421

其中 127.0.0.1:31000 節點為 127.0.0.1:30000 從節點

關閉其中的一個節點後(127.0.0.1:30000)的叢集狀態:

127.0.0.1:30001> CLUSTER NODES
81a3a70ce2fbb8bcce2e9be9ed77e34d9d4d5b21 127.0.0.1:31002 slave 98c4c66ee189569dec47a9600b057f90626cc6a7 0 1429696448146 6 connected
98c4c66ee189569dec47a9600b057f90626cc6a7 127.0.0.1:30002 master - 0 1429696447143 3 connected 11422-16383
6b880ae14f8c9dbfd54f8c4811cf0c039d523216 127.0.0.1:30001 myself,master - 0 0 2 connected 5962-10922
36801ef9849f12526be1e954f9e6f6fa24c50d46 127.0.0.1:30000 master,fail? - 1429696434521 1429696430116 9 disconnected 0-5961 10923-11421
3f5ae989b9b1b6617c53e77ed4853b618408bbe6 127.0.0.1:31001 slave 6b880ae14f8c9dbfd54f8c4811cf0c039d523216 0 1429696445139 5 connected
54d7d1241b1d9c24f76d99e9814d8cf8d8db474e 127.0.0.1:31000 slave 36801ef9849f12526be1e954f9e6f6fa24c50d46 0 1429696449148 9 connected

其中 127.0.0.1:30000 的狀態fail? 表示正在判斷是否失敗

127.0.0.1:30001> CLUSTER NODES
81a3a70ce2fbb8bcce2e9be9ed77e34d9d4d5b21 127.0.0.1:31002 slave 98c4c66ee189569dec47a9600b057f90626cc6a7 0 1429696473317 6 connected
98c4c66ee189569dec47a9600b057f90626cc6a7 127.0.0.1:30002 master - 0 1429696474317 3 connected 11422-16383
6b880ae14f8c9dbfd54f8c4811cf0c039d523216 127.0.0.1:30001 myself,master - 0 0 2 connected 5962-10922
36801ef9849f12526be1e954f9e6f6fa24c50d46 127.0.0.1:30000 master,fail - 1429696434521 1429696430116 9 disconnected
3f5ae989b9b1b6617c53e77ed4853b618408bbe6 127.0.0.1:31001 slave 6b880ae14f8c9dbfd54f8c4811cf0c039d523216 0 1429696472315 5 connected
54d7d1241b1d9c24f76d99e9814d8cf8d8db474e 127.0.0.1:31000 master - 0 1429696471313 10 connected 0-5961 10923-11421

其中 127.0.0.1:30000 的狀態 fail 表示節點失敗,127.0.0.1:30000 節點提升為主庫。

恢復關閉的例項

127.0.0.1:30001> CLUSTER NODES
81a3a70ce2fbb8bcce2e9be9ed77e34d9d4d5b21 127.0.0.1:31002 slave 98c4c66ee189569dec47a9600b057f90626cc6a7 0 1429696545465 6 connected
98c4c66ee189569dec47a9600b057f90626cc6a7 127.0.0.1:30002 master - 0 1429696542960 3 connected 11422-16383
6b880ae14f8c9dbfd54f8c4811cf0c039d523216 127.0.0.1:30001 myself,master - 0 0 2 connected 5962-10922
36801ef9849f12526be1e954f9e6f6fa24c50d46 127.0.0.1:30000 slave 54d7d1241b1d9c24f76d99e9814d8cf8d8db474e 0 1429696542458 10 connected
3f5ae989b9b1b6617c53e77ed4853b618408bbe6 127.0.0.1:31001 slave 6b880ae14f8c9dbfd54f8c4811cf0c039d523216 0 1429696546467 5 connected
54d7d1241b1d9c24f76d99e9814d8cf8d8db474e 127.0.0.1:31000 master - 0 1429696547470 10 connected 0-5961 10923-11421

其中 127.0.0.1:30000 變成 127.0.0.1:31000的從庫

總結:

優點:
    1、redis 在主節點下線後,從節點會自動提升為主節點,提供服務
    2、redis 宕機節點恢復後,自動會新增到叢集中,變成從節點
缺點:
    1、由於redis的複製使用非同步機制,在自動故障轉移的過程中,叢集可能會丟失寫命令。然而 redis 幾乎是同時執行(將命令恢復傳送給客戶端,以及將命令複製到從節點)這兩個操作,所以實際中,命令丟失的視窗非常小。

叢集訂閱、釋出

Redis 叢集中,客戶端能訂閱任何一個節點,也能釋出訊息給任何一個節點。叢集會確保釋出的訊息都會按需進行轉發