<a href="http://doc.redisfans.com/topic/cluster-tutorial.html">http://doc.redisfans.com/topic/cluster-tutorial.html</a>
redis 叢集是為了多個節點之間資料的共享和叢集高可用的保證。 redis 叢集不支援同時處理多個鍵的redis指令,由于叢集需要在多個redis之間遷移資料,在高負載的情況下這些指令會降低redis的性能,并導緻不可預知的問題。
redis叢集的好處
将資料自動切分到多個不同的節點的能力。 當叢集中的某一部分不可用時,仍然可以處理指令請求的能力。
redis 叢集采用分片(sharding)而非一緻性哈希(consistency hashing)來實作 一個redis叢集包含了 16384 個哈希槽(hash slot) 使用公式 CRC16(key) % 16384 來計算鍵 key 屬于哪個槽 添加或删除節點都不會導緻阻塞,是以也不會導緻叢集的不可用
添加或删除節點資料遷移:
1、添加節點,根據 <code>CRC16(key) % 16384</code>來從新計算節點資料配置設定并遷移相應節點資料。
2、删除節點,在節點資料遷移完畢後下線即可。
Redis 叢集對節點使用了主從複制功能: 叢集中的每個節點都有 1 個至 N 個複制品(replica), 其中一個複制品為主節點(master), 而其餘的 N-1 個複制品為從節點(slave)。 如果某個節點的 master 下線,則其 replica 會接管 master 的工作,使得叢集繼續可用。 如果某個節點的 master 和所有 replica 都下線了,則會導緻整個叢集不可用。
Redis 叢集不保證資料的強一緻性(strong consistency) 在特定條件下, Redis 叢集可能會丢失已經被執行過的寫指令。
Redis 叢集另外一種可能會丢失指令的情況是, 叢集出現網絡分裂(network partition), 并且一個用戶端與至少包括一個主節點在内的少數(minority)執行個體被孤立。
最少選項的叢集配置檔案
<code>cluster-enabled</code> 用于開啟叢集, <code>cluster-conf-file</code> 用于設定節點配置檔案。
需要幾個節點的叢集,則根據最小配置分别建立幾個存放配置檔案的目錄和配置檔案并修改端口即可。
啟動叢集的每個節點: <code>./redis-server 配置檔案所在位置</code>
<code>建立新叢集</code>、<code>檢查叢集</code>或者<code>對叢集進行重新分片</code>(<code>reshared</code>):
通過使用 Redis 叢集指令行工具 <code>redis-trib</code>
如建立叢集:
給定 redis-trib.rb 程式的指令是 create , 這表示我們希望建立一個新的叢集。 選項 --replicas 1 表示我們希望為叢集中的每個主節點建立一個從節點。 之後跟着的其他參數則是執行個體的位址清單, 我們希望程式使用這些位址所訓示的執行個體來建立新叢集。
檢測和确認完成後,如果一切正常的話, redis-trib 将輸出以下資訊:
重新分片并不會對正在運作的叢集程式産生任何影響
隻需要指定叢集中其中一個節點的位址, <code>redis-trib</code> 就會自動找到叢集中的其他節點。接下來根據需要的提示和需要做相應的操作即可。
添加的新節點是一個主節點 添加的新節點是一個從節點
1、第一步要做的總是添加一個空節點。
和上述建立節點執行個體一樣:
2、啟動節點
3、将新節點添加到叢集裡
此時,新節點已經連上叢集;成為了叢集的一部分。但是和其他主節點相比, 新節點還有兩點差別:
新節點沒有包含任何資料, 因為它沒有包含任何哈希槽。 盡管新節點沒有包含任何哈希槽, 但它仍然是一個主節點;是以在叢集将某個從節點更新為新的主節點前, 這個新節點不會被選中。
4、使用redis-trib轉移哈希槽資料到新節點
具體轉移方式見前文。
在資料轉移完畢後,新節點就會成為真正的主節點了。
5、如果是想讓新增的節點成為從節點
在新節點中執行如下指令
1) 要把節點中的哈希槽轉移到其他節點中
<code>./redis-trib.rb reshard 127.0.0.1:7000</code>
2) 根據系統提示輸入需要删除節點哈希槽的數量
3) 根據系統提示輸入要接收這些哈希槽的節點的ID
4) 完成後,輸入要移除的節點ID,并輸入 done 指令
5) 最後删除節點