Redis之叢集環境搭建
前面文章介紹了Redis的主從複製,雖然該模式能夠在一定程度上提高系統的穩定性,但是在資料訪問量比較大的情況下,單個master應付起來還是比較吃力的,這時我們可以考慮將redis叢集部署,本文就來重點給大家介紹下Redis的叢集部署操作。
Redis叢集
一、Redis叢集相關概念
1.Redis叢集介紹
Redis 叢集是一個提供在 多個Redis間節點間 共享資料的程式集。
Redis叢集 並不支援 處理多個keys的命令,因為這需要在不同的節點間移動資料,從而達不到像Redis那樣的效能,在高負載的情況下可能會導致不可預料的錯誤.
Redis 叢集通過 分割槽 來提供一定程度的可用性,在實際環境中當某個節點宕機或者不可達的情況下繼續處理命令. Redis 叢集的優勢:
1.自動分割資料到不同的節點上。
>2.整個叢集的部分節點失敗或者不可達的情況下能夠繼續處理命令。
2.Redis分片策略
Redis 叢集沒有使用一致性hash, 而是引入了 雜湊槽的概念.
Redis 叢集有==16384==個雜湊槽,每個key通過CRC16校驗後對16384取模來決定放置哪個槽.叢集的每個節點負責一部分hash槽,舉個例子,比如當前叢集有3個節點,那麼:
節點 A 包含 0 到 5500號雜湊槽.
節點 B 包含5501 到 11000 號雜湊槽.
節點 C 包含11001 到 16384號雜湊槽.
這種結構很容易新增或者刪除節點. 比如如果我想新添加個節點D, 我需要從節點 A, B, C中得部分槽到D上. 如果我想移除節點A,需要將A中的槽移到B和C節點上,然後將沒有任何槽的A節點從叢集中移除即可. 由於從一個節點將雜湊槽移動到另一個節點並不會停止服務,所以無論新增刪除或者改變某個節點的雜湊槽的數量都不會造成叢集不可用的狀態.
3.Redis的主從複製模型
為了使在部分節點失敗或者大部分節點無法通訊的情況下叢集仍然可用,所以叢集使用了主從複製模型,每個節點都會有N-1個複製品.
在我們例子中具有A,B,C三個節點的叢集,在沒有複製模型的情況下,如果節點B失敗了,那麼整個叢集就會以為缺少5501-11000這個範圍的槽而不可用.
然而如果在叢集建立的時候(或者過一段時間)我們為每個節點新增一個從節點A1,B1,C1,那麼整個叢集便有三個master節點和三個slave節點組成,這樣在節點B失敗後,叢集便會選舉B1為新的主節點繼續服務,整個叢集便不會因為槽找不到而不可用了
不過當B和B1 都失敗後,叢集是不可用的.

二、Redis叢集搭建
1.叢集的結構
根據官網描述要讓redis叢集環境正常執行我們必須準備至少3個主節點,所以在本文中的叢集環境我們準備3個主節點例項及對應的給每個主節點準備一個從節點例項,一共6個redis例項。正常需要6個虛擬機器節點,本文我們在一個虛擬機器上模擬。
2.叢集的環境準備
搭建叢集需要使用到官方提供的ruby指令碼。
需要安裝ruby的環境。
安裝ruby
yum -y install ruby yum -y install rubygems gem install redis
錯誤處理
[root@hadoop-node01 src]# gem install redis ERROR:Error installing redis: redis requires Ruby version >= 2.2.2.
解決方式參考此連結:https://blog.csdn.net/qq_38526573/article/details/87220510
解決完成後再次執行gem install redis命令
[root@hadoop-node01 ~]# gem install redis Fetching: redis-4.1.0.gem (100%) Successfully installed redis-4.1.0 Parsing documentation for redis-4.1.0 Installing ri documentation for redis-4.1.0 Done installing documentation for redis after 1 seconds 1 gem installed
注意ruby對應的redis版本是4.1.0
各版本下載地址
http://download.redis.io/releases/
3.搭建叢集環境
3.1建立例項
在/opt目錄下建立redis-cluster目錄,並在該目錄下建立6個redis例項


3.2修改配置檔案
分別修改6個例項的配置檔案
1.修改埠號
2.開啟cluster-enable前面的註釋
3.註釋掉繫結ip
4.保護模式修改為no
5.設定日誌儲存路徑
注意重複修改6次。
3.3複製ruby指令碼
3.4啟動6個例項
啟動例項時可能報錯
Ps: [ERR] Node 172.168.63.202:7001 is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some
解決辦法:
將每個節點下aof、rdb、nodes.conf本地備份檔案刪除;
編寫簡單指令碼啟動
start-all.sh
cd /opt/redis-cluster/redis7001 rm -rf dump.rdb nodes.conf appendonly.aof src/redis-server redis.conf cd /opt/redis-cluster/redis7002 rm -rf dump.rdb nodes.conf appendonly.aof src/redis-server redis.conf cd /opt/redis-cluster/redis7003 rm -rf dump.rdb nodes.conf appendonly.aof src/redis-server redis.conf cd /opt/redis-cluster/redis7004 rm -rf dump.rdb nodes.conf appendonly.aof src/redis-server redis.conf cd /opt/redis-cluster/redis7005 rm -rf dump.rdb nodes.conf appendonly.aof src/redis-server redis.conf cd /opt/redis-cluster/redis7006 rm -rf dump.rdb nodes.conf appendonly.aof src/redis-server redis.conf
改變檔案指令碼許可權模式:
chmod 777 start-all.sh
然後再啟動:
./start-all.sh
3.5建立叢集
現在我們已經有了六個正在執行中的 Redis 例項, 接下來我們需要使用這些例項來建立叢集, 併為每個節點編寫配置檔案。
通過使用 Redis 叢集命令列工具 redis-trib , 編寫節點配置檔案的工作可以非常容易地完成: redis-trib 位於 Redis 原始碼的 src 資料夾中, 它是一個 Ruby 程式, 這個程式通過向例項傳送特殊命令來完成建立新叢集, 檢查叢集, 或者對叢集進行重新分片(reshared)等工作
./redis-trib.rb create --replicas 1 192.168.88.121:7001 192.168.88.121:7002 192.168.88.121:7003 192.168.88.121:7004 192.168.88.121:7005 192.168.88.121:7006
命令說明
選項–replicas 1 表示我們希望為叢集中的每個主節點建立一個從節點
之後跟著的其他引數則是這個叢集例項的地址列表,3個master3個slave
redis-trib 會打印出一份預想中的配置給你看, 如果你覺得沒問題的話, 就可以輸入 ==yes==, redis-trib 就會將這份配置應用到叢集當中,讓各個節點開始互相通訊,最後可以得到如下資訊:
[root@hadoop-node01 redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.88.121:7001 192.168.88.121:7002 192.168.88.121:7003 192.168.88.121:7004 192.168.88.121:7005 192.168>>> Creating cluster Invalid IP or Port (given as 192.168) - use IP:Port format [root@hadoop-node01 redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.88.121:7001 192.168.88.121:7002 192.168.88.121:7003 192.168.88.121:7004 192.168.88.121:7005 192.168.88.121:7006>>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 192.168.88.121:7001 192.168.88.121:7002 192.168.88.121:7003 Adding replica 192.168.88.121:7005 to 192.168.88.121:7001 Adding replica 192.168.88.121:7006 to 192.168.88.121:7002 Adding replica 192.168.88.121:7004 to 192.168.88.121:7003 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: f97aa0b15e5a7f51c69f26543e7b785d52479afe 192.168.88.121:7001 slots:0-5460 (5461 slots) master M: 8e4a66caac1f738e9d951d212a5ba2a00e675acd 192.168.88.121:7002 slots:5461-10922 (5462 slots) master M: 1528779486cb926b11cb996c5682c6b749d26bc1 192.168.88.121:7003 slots:10923-16383 (5461 slots) master S: ea08ca738d621c5161a0ecfe838ed8fd89f5c0c5 192.168.88.121:7004 replicates 8e4a66caac1f738e9d951d212a5ba2a00e675acd S: 0ac234a10f28e24173ffc4e686073fa7710dd264 192.168.88.121:7005 replicates 1528779486cb926b11cb996c5682c6b749d26bc1 S: d560e0e3da9a715fb4aae5910cf5533cec2f815f 192.168.88.121:7006 replicates f97aa0b15e5a7f51c69f26543e7b785d52479afe Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join...... >>> Performing Cluster Check (using node 192.168.88.121:7001) M: f97aa0b15e5a7f51c69f26543e7b785d52479afe 192.168.88.121:7001 slots:0-5460 (5461 slots) master 1 additional replica(s) S: d560e0e3da9a715fb4aae5910cf5533cec2f815f 192.168.88.121:7006 slots: (0 slots) slave replicates f97aa0b15e5a7f51c69f26543e7b785d52479afe M: 1528779486cb926b11cb996c5682c6b749d26bc1 192.168.88.121:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: 8e4a66caac1f738e9d951d212a5ba2a00e675acd 192.168.88.121:7002 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 0ac234a10f28e24173ffc4e686073fa7710dd264 192.168.88.121:7005 slots: (0 slots) slave replicates 1528779486cb926b11cb996c5682c6b749d26bc1 S: ea08ca738d621c5161a0ecfe838ed8fd89f5c0c5 192.168.88.121:7004 slots: (0 slots) slave replicates 8e4a66caac1f738e9d951d212a5ba2a00e675acd [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
這表示叢集中的 16384 個槽都有至少一個主節點在處理, 叢集運作正常。

4.測試叢集
登入命令
redis7001/src/redis-cli -h 192.168.88.121 -p 7001 -c
新增一個key被分配到7002節點上,注意連線的埠變為了7002。
5.檢視叢集環境
命令 | 說明 |
---|---|
cluster info | 列印叢集的資訊 |
cluster nodes | 列出叢集當前已知的所有節點( node),以及這些節點的相關資訊。節點 |
cluster meet <ip> <port> | 將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。 |
cluster forget
|
從叢集中移除 node_id 指定的節點。 |
cluster replicate
|
將當前節點設定為 node_id 指定的節點的從節點。 |
cluster saveconfig | 將節點的配置檔案儲存到硬盤裡面。槽(slot) |
cluster addslots <slot> [slot ...] |
將一個或多個槽( slot)指派( assign)給當前節點。 |
cluster delslots <slot> [slot ...] |
移除一個或多個槽對當前節點的指派。 |
cluster flushslots | 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。 |
cluster setslot <slot> node <node_id> |
將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。 |
cluster setslot <slot> migrating <node_id> |
將本節點的槽 slot 遷移到 node_id 指定的節點中。 |
cluster setslot <slot> importing <node_id> |
從 node_id 指定的節點中匯入槽 slot 到本節點。 |
cluster setslot <slot> stable | 取消對槽 slot 的匯入( import)或者遷移( migrate)。鍵 |
cluster keyslot <key> | 計算鍵 key 應該被放置在哪個槽上。 |
cluster countkeysinslot <slot> |
返回槽 slot 目前包含的鍵值對數量。 |
cluster getkeysinslot <slot> <count> |
返回 count 個 slot 槽中的鍵 |
cluster info命令
cluster nodes
6.增加節點
新增新的節點的基本過程就是新增一個空的節點然後移動一些資料給它,有兩種情況,新增一個主節點和新增一個從節點(新增從節點時需要將這個新的節點設定為叢集中某個節點的複製)
新增一個新的例項
啟動新的7007節點,使用的配置檔案和以前的一樣,只要把埠號改一下即可,過程如下:
在終端開啟一個新的標籤頁.
進入redis-cluster 目錄.
複製並進入redis7007資料夾.
和其他節點一樣,建立redis.conf檔案,需要將埠號改成7007.
最後啟動節點 ../redis-server ./redis.conf
如果正常的話,節點會正確的啟動.

1.新增主節點
./redis-trib.rb add-node 192.168.88.121:7007 192.168.88.121:7001
第一個引數是新節點的地址,第二個引數是任意一個已經存在的節點的IP和埠


新節點現在已經連線上了叢集, 成為叢集的一份子, 並且可以對客戶端的命令請求進行轉向了, 但是和其他主節點相比, 新節點還有兩點區別:
- 新節點沒有包含任何資料, 因為它沒有包含任何雜湊槽.
- 儘管新節點沒有包含任何雜湊槽, 但它仍然是一個主節點, 所以在叢集需要將某個從節點升級為新的主節點時, 這個新節點不會被選中。
接下來, 只要使用 redis-trib 程式, 將叢集中的某些雜湊桶移動到新節點裡面, 新節點就會成為真正的主節點了。
重新分配slot
./redis-trib.rb reshard 192.168.88.121:7001
只需要指定叢集中其中一個節點的地址, redis-trib 就會自動找到叢集中的其他節點


7007節點被分類slot,成了真正意義上的主節點
2.新增從節點
新增的從節點被隨機的配置任意的主節點
./redis-trib.rb add-node --slave 192.168.88.121:7008 192.168.88.121:7001
將從節點新增給指定的主節點
./redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000
7.刪除節點
使用del-node命令移除節點。
./redis-trib.rb del-node 192.168.2.11:7007 <node-id>
第一個引數:任意叢集中現有的地址192.168.88.121:7001
第二個引數:你想移除的節點id ab853f5e95f1e32e0ee40543a9687d60fc3bd941 (該id可以在想要移除的節點nodes.conf檔案中找到)
關閉redis
redis7001/redis-cli -p 7001 shutdown
./redis-cli shutdown
pkill -9 redis-server –關閉所有的redis服務
~好了redis的叢集操作就介紹到此,
更多內容可以檢視官網手冊:http://www.redis.cn/documentation.html