Redis 集羣是一個提供在多個Redis間節點間共享數據的程序集。node
Redis集羣並不支持處理多個keys的命令,由於這須要在不一樣的節點間移動數據,從而達不到像Redis那樣的性能,在高負載的狀況下可能會致使不可預料的錯誤.redis
Redis 集羣經過分區來提供必定程度的可用性,在實際環境中當某個節點宕機或者不可達的狀況下繼續處理命令. Redis 集羣的優點:ruby
1.自動分割數據到不一樣的節點上。
>2.整個集羣的部分節點失敗或者不可達的狀況下可以繼續處理命令。app
Redis 集羣沒有使用一致性hash, 而是引入了 哈希槽的概念.工具
Redis 集羣有==16384==個哈希槽,每一個key經過CRC16校驗後對16384取模來決定放置哪一個槽.集羣的每一個節點負責一部分hash槽,舉個例子,好比當前集羣有3個節點,那麼:oop
節點 A 包含 0 到 5500號哈希槽.
節點 B 包含5501 到 11000 號哈希槽.
節點 C 包含11001 到 16384號哈希槽.性能
這種結構很容易添加或者刪除節點. 好比若是我想新添加個節點D, 我須要從節點 A, B, C中得部分槽到D上. 若是我想移除節點A,須要將A中的槽移到B和C節點上,而後將沒有任何槽的A節點從集羣中移除便可. 因爲從一個節點將哈希槽移動到另外一個節點並不會中止服務,因此不管添加刪除或者改變某個節點的哈希槽的數量都不會形成集羣不可用的狀態.測試
爲了使在部分節點失敗或者大部分節點沒法通訊的狀況下集羣仍然可用,因此集羣使用了主從複製模型,每一個節點都會有N-1個複製品.ui
在咱們例子中具備A,B,C三個節點的集羣,在沒有複製模型的狀況下,若是節點B失敗了,那麼整個集羣就會覺得缺乏5501-11000這個範圍的槽而不可用.spa
然而若是在集羣建立的時候(或者過一段時間)咱們爲每一個節點添加一個從節點A1,B1,C1,那麼整個集羣便有三個master節點和三個slave節點組成,這樣在節點B失敗後,集羣便會選舉B1爲新的主節點繼續服務,整個集羣便不會由於槽找不到而不可用了
不過當B和B1 都失敗後,集羣是不可用的.
根據官網描述要讓redis集羣環境正常運行咱們必須準備至少3個主節點,因此在本文中的集羣環境咱們準備3個主節點實例及對應的給每一個主節點準備一個從節點實例,一共6個redis實例。正常須要6個虛擬機節點,本文咱們在一個虛擬機上模擬。
搭建集羣須要使用到官方提供的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/
在/opt目錄下建立redis-cluster目錄,並在該目錄下建立6個redis實例
分別修改6個實例的配置文件
1.修改端口號
2.打開cluster-enable前面的註釋
3.註釋掉綁定ip
4.保護模式修改成no
5.設置日誌存儲路徑
注意重複修改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
如今咱們已經有了六個正在運行中的 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 個槽都有至少一個主節點在處理, 集羣運做正常。
登陸命令
redis7001/src/redis-cli -h 192.168.88.121 -p 7001 -c
添加一個key被分配到7002節點上,注意鏈接的端口變爲了7002。
命令 | 說明 |
---|---|
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 槽中的鍵 |
添加新的節點的基本過程就是添加一個空的節點而後移動一些數據給它,有兩種狀況,添加一個主節點和添加一個從節點(添加從節點時須要將這個新的節點設置爲集羣中某個節點的複製)
添加一個新的實例
啓動新的7007節點,使用的配置文件和之前的同樣,只要把端口號改一下便可,過程以下:
在終端打開一個新的標籤頁.
進入redis-cluster 目錄.
複製並進入redis7007文件夾.
和其餘節點同樣,建立redis.conf文件,須要將端口號改爲7007.
最後啓動節點 ../redis-server ./redis.conf
若是正常的話,節點會正確的啓動.
./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,成了真正意義上的主節點
添加的從節點被隨機的配置任意的主節點
./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
使用del-node命令移除節點。
./redis-trib.rb del-node 192.168.2.11:7007 <node-id>
第一個參數:任意集羣中現有的地址192.168.88.121:7001
第二個參數:你想移除的節點id ab853f5e95f1e32e0ee40543a9687d60fc3bd941 (該id能夠在想要移除的節點nodes.conf文件中找到)
redis7001/redis-cli -p 7001 shutdown
./redis-cli shutdown
pkill -9 redis-server –關閉全部的redis服務
~好了redis的集羣操做就介紹到此,