Redis-Cluster
即使是使用哨兵,此時的Redis集群的每個數據庫依然存有集群中的所有數據,從而導致集群的總數據存儲量受限
於可用存儲內存最小的節點,形成了木桶效應。而因為Redis是基於內存存儲的,所以這一個問題在redis中就顯得尤為突出了
在redis3.0之前,我們是通過在客戶端去做的分片,通過hash環的方式對key進行分片存儲。分片雖然能夠解決各個節點的存儲壓力,但是導致維護成本高、增加、移除節點比較繁瑣。
因此在redis3.0以后的版本最大的一個好處就是支持集群功能,集群的特點在於擁有和單機實例一樣的性能,
同時在網絡分區以后能夠提供一定的可訪問性以及對主數據庫故障恢復的支持。
哨兵和集群是兩個獨立的功能,當不需要對數據進行分片使用哨兵就夠了,如果要進行水平擴容,集群是一個比較好的方式
拓撲結構
一個Redis Cluster由多個Redis節點構成。不同節點組服務的數據沒有交集,也就是每個一節點組對應數據sharding的一個分片。
節點組內部分為主備兩類節點,對應master和slave節點。兩者數據准實時一致,通過異步化的主備復制機制來保證。
一個節點組有且只有一個master節點,同時可以有0到多個slave節點,在這個節點組中只有master節點對用戶提供些服務,讀服務可以由master或者slave提供
redis-cluster是基於gossip協議實現的無中心化節點的集群,因為去中心化的架構不存在統一的配置中心,各個節點對整個集群狀態的認知來自於節點之間的信息交互。
在Redis Cluster,這個信息交互是通過Redis Cluster Bus來完成的
Redis的數據分區
分布式數據庫首要解決把整個數據集按照分區規則映射到多個節點的問題,即把數據集划分到多個節點上,每個節點負責整個數據的一個子集, Redis Cluster采用哈希分區規則,采用虛擬槽分區。
虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把所有的數據映射到一個固定范圍內的整數集合,整數定義為槽(slot)。比如Redis Cluster槽的范圍是0 ~ 16383。
槽是集群內數據管理和遷移的基本單位。采用大范圍的槽的主要目的是為了方便數據的拆分和集群的擴展,每個節點負責一定數量的槽。
計算公式:slot = CRC16(key)%16383。每一個節點負責維護一部分槽以及槽所映射的鍵值數據。
HashTags
通過分片手段,可以將數據合理的划分到不同的節點上,這本來是一件好事。但是有的時候,我們希望對相關聯的業務以原子方式進行操作。舉個簡單的例子
我們在單節點上執行MSET , 它是一個原子性的操作,所有給定的key會在同一時間內被設置,不可能出現某些指定的key被更新另一些指定的key沒有改變的情況。
但是在集群環境下,我們仍然可以執行MSET命令,但它的操作不在是原子操作,會存在某些指定的key被更新,而另外一些指定的key沒有改變,原因是多個key可能會被分配到不同的機器上。
所以,這里就會存在一個矛盾點,及要求key盡可能的分散在不同機器,又要求某些相關聯的key分配到相同機器。這個也是在面試的時候會容易被問到的內容。怎么解決呢?
從前面的分析中我們了解到,分片其實就是一個hash的過程,對key做hash取模然后划分到不同的機器上。所以為了解決這個問題,我們需要考慮如何讓相關聯的key得到的hash值都相同呢?
如果key全部相同是不現實的,所以怎么解決呢?
在redis中引入了HashTag的概念,可以使得數據分布算法可以根據key的某一個部分進行計算,然后讓相關的key落到同一個數據分片
舉個簡單的例子,加入對於用戶的信息進行存儲, user:user1:id、user:user1:name/ 那么通過hashtag的方式,
user:{user1}:id、user:{user1}.name; 表示
當一個key包含 {} 的時候,就不對整個key做hash,而僅對 {} 包括的字符串做hash。
重定向客戶端
Redis Cluster並不會代理查詢,那么如果客戶端訪問了一個key並不存在的節點,這個節點是怎么處理的呢?比如我想獲取key為msg的值,msg計算出來的槽編號為254,
當前節點正好不負責編號為254的槽,那么就會返回客戶端下面信息:
-MOVED 254 127.0.0.1:6381
表示客戶端想要的254槽由運行在IP為127.0.0.1,端口為6381的Master實例服務。如果根據key計算得出的槽恰好由當前節點負責,則當期節點會立即返回結果
分片遷移
在一個穩定的Redis cluster下,每一個slot對應的節點是確定的,但是在某些情況下,節點和分片對應的關系會發生變更
\1. 新加入master節點
\2. 某個節點宕機
也就是說當動態添加或減少node節點時,需要將16384個槽做個再分配,槽中的鍵值也要遷移。當然,這一過程,在目前實現中,還處於半自動狀態,需要人工介入。
新增一個主節點
新增一個節點D,redis cluster的這種做法是從各個節點的前面各拿取一部分slot到D上。大致就會變成這樣:
節點A覆蓋1365-5460
節點B覆蓋6827-10922
節點C覆蓋12288-16383
節點D覆蓋0-1364,5461-6826,10923-12287
刪除一個主節點
先將節點的數據移動到其他節點上,然后才能執行刪除
槽遷移的過程
槽遷移的過程中有一個不穩定狀態,這個不穩定狀態會有一些規則,這些規則定義客戶端的行為,從而使得RedisCluster不必宕機的情況下可以執行槽的遷移。
下面這張圖描述了我們遷移編號為1、2、3的槽的過程中,他們在MasterA節點和MasterB節點中的狀態
簡單的工作流程
\1. 向MasterB發送狀態變更命令,吧Master B對應的slot狀態設置為IMPORTING
\2. 向MasterA發送狀態變更命令,將Master對應的slot狀態設置為MIGRATING
當MasterA的狀態設置為MIGRANTING后,表示對應的slot正在遷移,為了保證slot數據的一致性,MasterA此時對於slot內部數據提供讀寫服務的行為和通常狀態下是有區別的,
MIGRATING狀態
\1. 如果客戶端訪問的Key還沒有遷移出去,則正常處理這個key
\2. 如果key已經遷移或者根本就不存在這個key,則回復客戶端ASK信息讓它跳轉到MasterB去執行
IMPORTING狀態
當MasterB的狀態設置為IMPORTING后,表示對應的slot正在向MasterB遷入,及時Master仍然能對外提供該slot的讀寫服務,但和通常狀態下也是有區別的
\1. 當來自客戶端的正常訪問不是從ASK跳轉過來的,說明客戶端還不知道遷移正在進行,很有可能操作了一個目前
還沒遷移完成的並且還存在於MasterA上的key,如果此時這個key在A上已經被修改了,那么B和A的修改則會發生
沖突。所以對於MasterB上的slot上的所有非ASK跳轉過來的操作,MasterB都不會uu出去護理,而是通過MOVED命令讓客戶端跳轉到MasterA上去執行
這樣的狀態控制保證了同一個key在遷移之前總是在源節點上執行,遷移后總是在目標節點上執行,防止出現兩邊同時寫導致的沖突問題。
而且遷移過程中新增的key一定會在目標節點上執行,源節點也不會新增key,是的整個遷移過程既能對外正常提供服務,又能在一定的時間點完成slot的遷移。
Redis-Cluster環境搭建三主三從
為方便演示,我們在一台機器上演示三主六從的rediscluster
1..創建存放多個實例的目錄
mkdir /data/cluster -p cd /data/cluster mkdir 7000 7001 7002 7003 7004 7005 7006 7007 7008
2.修改配置文件
cp 到redis上一層目錄
cp redis/redis.conf /data/cluster/7000/
修改配置文件中下面選項
port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
(注意:找到相應的信息修改,或者把修改的信息全部注釋掉,重新添加下面信息到頭部,有利於以后修改和查看) #注釋掉ip或者設置0.0.0.0都是局域網訪問 #bind 127.0.0.1 #端口號 port 7777 #指定了記錄日志的文件 logfile "/root/svr/redis-3.2.9/cluster-conf/7777/redis.log" #該目錄要事先創建好,數據目錄,數據庫的寫入會在這個目錄。rdb、aof文件也會寫在這個目錄 dir /root/svr/redis-3.2.9/cluster-conf/7777/ #是否開啟集群 cluster-enabled yes #集群配置文件的名稱,每個節點都有一個集群相關的配置文件,持久化保存集群的信息, #這個文件並不需要手動配置,這個配置文件有Redis生成並更新, #每個Redis集群節點需要一個單獨的配置文件,請確保與實例運行的系統中配置文件名稱不沖突。 cluster-config-file nodes.conf #節點互連超時的閥值。集群節點超時毫秒數 cluster-node-timeout 5000 #默認redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了, #但是redis如果中途宕機,會導致可能有幾分鍾的數據丟失, #根據save來策略進行持久化,Append Only File是另一種持久化方式,可以提供更好的持久化特性, #Redis會把每次寫入的數據在接收后都寫入 appendonly.aof 文件, #每次啟動時Redis都會先把這個文件的數據讀入內存里,先忽略RDB文件。 appendonly yes
文件中的 cluster-enabled 選項用於開實例的集群模式, 而 cluster-conf-file 選項則設定了保存節點配置文件的路徑, 默認值為nodes.conf 。其他參數相信童鞋們都知道。節點配置文件無須人為修改, 它由 Redis 集群在啟動時創建, 並在有需要時自動進行更新。
修改完成后,把修改完成的redis.conf復制到7001-7008目錄下,並且端口修改成和文件夾對應。
3.啟動9個redis實例
cd /data/cluster/7000 redis-server redis.conf cd /data/cluster/7001 redis-server redis.conf cd /data/cluster/7002 redis-server redis.conf cd /data/cluster/7003 redis-server redis.conf cd /data/cluster/7004 redis-server redis.conf cd /data/cluster/7005 redis-server redis.conf cd /data/cluster/7006 redis-server redis.conf cd /data/cluster/7007 redis-server redis.conf cd /data/cluster/7008 redis-server redis.conf
查看進程否存在
[root@localhost 7008]# ps -ef |grep redis root 5464 1 0 10:01 ? 00:00:00 redis-server 127.0.0.1:7000 [cluster] root 5469 1 0 10:01 ? 00:00:00 redis-server 127.0.0.1:7001 [cluster] root 5473 1 0 10:01 ? 00:00:00 redis-server 127.0.0.1:7002 [cluster] root 5478 1 0 10:01 ? 00:00:00 redis-server 127.0.0.1:7003 [cluster] root 5482 1 0 10:01 ? 00:00:00 redis-server 127.0.0.1:7004 [cluster] root 5486 1 0 10:01 ? 00:00:00 redis-server 127.0.0.1:7005 [cluster] root 5490 1 0 10:01 ? 00:00:00 redis-server 127.0.0.1:7006 [cluster] root 5495 1 0 10:02 ? 00:00:00 redis-server 127.0.0.1:7007 [cluster] root 5499 1 0 10:02 ? 00:00:00 redis-server 127.0.0.1:7008 [cluster] root 5504 4941 0 10:02 pts/2 00:00:00 grep redis
4.執行命令創建集群,首先安裝依賴,否則創建集群失敗。
yum install ruby rubygems -y
有時候yum安裝某個軟件的時候特別慢,不想再繼續安裝下去了,或者想做其他的操作,可以按照以下終止yum進程
ctrl+z #中斷當前的安裝顯示
ps -ef | grep yum #查找當前yum相關的進程
kill -9 進程號(pid) #殺掉進程
舉個例子
安裝 ca-certificates,停着好久不動了,按 ctrl+z 中斷
查看當前的進程號pid
第一條記錄是需要殺掉的,不然接下來yum用不了
殺掉之后,再次查看,發現進程沒有了,可以進行其他的操作了。
有時候是否有網:ping www.baidu.com
查看是否能ping通,不同則可能是虛擬機網絡連接選擇的問題(本人由僅主機改為net連接,對應子網改變,對應虛擬機的ip則會發生改變),下面是虛擬機的三種網絡:
1、橋接:虛擬機通過本機的真實網卡和主機進行通訊。不僅可以和你的本機進行通訊,如果局域網內有同網段的計算機,也可以進行通訊。不過需要占用同網段的一個ip地址。
2、NAT:虛擬機通過VMware-8這塊虛擬出來的網卡和你的本機進行通訊。
3、host-only:虛擬機通過VMware-1這塊虛擬出來的網卡和你的本機進行通訊。
NAT和host-only 不會占用一個ip地址,只能和你的本機進行通訊。
NAT和host-only還有一個區別就是,host-only只能和你的本機進行通訊,不可以訪問互聯網。NAT除了只可以和你的本機進行通訊之外,如果你的本機可以訪問互聯網,你的虛擬機同樣可以訪問互聯網。
安裝gem-redis
下載地址:https://rubygems.org/gems/redis/versions/3.0.0
gem install -l redis-3.0.0.gem
復制集群管理程序到/usr/local/bin
cp redis-3.0.0/src/redis-trib.rb /usr/local/bin/redis-trib
創建集群:
redis-trib create --replicas 2 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008
命令的意義如下:
- 給定 redis-trib.rb 程序的命令是 create , 這表示我們希望創建一個新的集群。
- 選項 --replicas 2 表示我們希望為集群中的每個主節點創建2個從節點。
- 之后跟着的其他參數則是實例的地址列表, 我們希望程序使用這些地址所指示的實例來創建新集群。
簡單來說, 以上命令的意思就是讓 redis-trib 程序創建一個包含三個主節點和三個從節點的集群。
接着, redis-trib 會打印出一份預想中的配置給你看, 如果你覺得沒問題的話, 就可以輸入 yes , redis-trib 就會將這份配置應用到集群當中:
>>> Creating cluster >>> Performing hash slots allocation on 9 nodes... Using 3 masters: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 Adding replica 127.0.0.1:7003 to 127.0.0.1:7000 Adding replica 127.0.0.1:7004 to 127.0.0.1:7000 Adding replica 127.0.0.1:7005 to 127.0.0.1:7001 Adding replica 127.0.0.1:7006 to 127.0.0.1:7001 Adding replica 127.0.0.1:7007 to 127.0.0.1:7002 Adding replica 127.0.0.1:7008 to 127.0.0.1:7002 M: 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 slots:0-5460 (5461 slots) master M: 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 slots:5461-10922 (5462 slots) master M: cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 slots:10923-16383 (5461 slots) master S: ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 replicates 4381850849cd6bb3cae49494a08277c77bfa7720 S: 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 replicates 4381850849cd6bb3cae49494a08277c77bfa7720 S: 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba S: 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba S: e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc Can I set the above configuration? (type 'yes' to accept):
輸入 yes 並按下回車確認之后, 集群就會將配置應用到各個節點, 並連接起(join)各個節點 —— 也即是, 讓各個節點開始互相通訊
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 127.0.0.1:7000) M: 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 slots:0-5460 (5461 slots) master 2 additional replica(s) M: 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 2 additional replica(s) S: e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slots: (0 slots) slave replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba S: 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slots: (0 slots) slave replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba S: c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 M: cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 2 additional replica(s) S: ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
集群的客戶端
Redis 集群現階段的一個問題是客戶端實現很少。 以下是一些我知道的實現:
- redis-rb-cluster 是我(@antirez)編寫的 Ruby 實現, 用於作為其他實現的參考。 該實現是對 redis-rb 的一個簡單包裝, 高效地實現了與集群進行通訊所需的最少語義(semantic)。
- redis-py-cluster 看上去是 redis-rb-cluster 的一個 Python 版本, 這個項目有一段時間沒有更新了(最后一次提交是在六個月之前), 不過可以將這個項目用作學習集群的起點。
- 流行的 Predis 曾經對早期的 Redis 集群有過一定的支持, 但我不確定它對集群的支持是否完整, 也不清楚它是否和最新版本的 Redis 集群兼容 (因為新版的 Redis 集群將槽的數量從 4k 改為 16k 了)。
- Redis unstable 分支中的 redis-cli 程序實現了非常基本的集群支持, 可以使用命令 redis-cli -c 來啟動。
測試 Redis 集群比較簡單的辦法就是使用 redis-rb-cluster 或者 redis-cli , 接下來我們將使用 redis-cli 為例來進行演示:
[root@localhost 7008]# redis-cli -c -p 7001
127.0.0.1:7001> set name lf
OK
127.0.0.1:7001> get name
"lf"
我們可以看看還有哪些命令可以用:
[root@localhost 7008]# redis-trib help Usage: redis-trib <command> <options> <arguments ...> set-timeout host:port milliseconds add-node new_host:new_port existing_host:existing_port --master-id <arg> --slave fix host:port help (show this help) del-node host:port node_id import host:port --from <arg> check host:port call host:port command arg arg .. arg create host1:port1 ... hostN:portN --replicas <arg> reshard host:port --yes --to <arg> --from <arg> --slots <arg> For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster. [root@localhost 7008]#
可以看見有add-node,不用想了,肯定是添加節點。那么del-node就是刪除節點。還有check肯定就是檢查狀態了。
[root@localhost 7008]# redis-cli -p 7000 cluster nodes 2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001 master - 0 1428293673322 2 connected 5461-10922 37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003 slave 2774f156af482b4f76a5c0bda8ec561a8a1719c2 0 1428293672305 4 connected e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004 slave 2d03b862083ee1b1785dba5db2987739cf3a80eb 0 1428293674340 5 connected 0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002 master - 0 1428293670262 3 connected 10923-16383 2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460 9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005 slave 0456869a2c2359c3e06e065a09de86df2e3135ac 0 1428293675362 6 connected [root@redis-server ~]#
可以看到7000-7002是master,7003-7005是slave。
故障轉移測試:
127.0.0.1:7001> KEYS * 1) "name" 127.0.0.1:7001> get name "lf" 127.0.0.1:7001>
可以看見7001是正常的,並且獲取到了key,value,現在kill掉7000實例,再進行查詢。
[root@localhost 7008]# ps -ef | grep 7000 root 4168 1 0 11:49 ? 00:00:03 redis-server *:7000 [cluster] root 4385 4361 0 12:39 pts/3 00:00:00 grep 7000 [root@localhost 7008]# kill 4168 [root@localhost 7008]# ps -ef | grep 7000 root 4387 4361 0 12:39 pts/3 00:00:00 grep 7000 [root@localhost 7008]# redis-cli -c -p 7001 127.0.0.1:7001> get name "lf" 127.0.0.1:7001>
可以正常獲取到value,現在看看狀態。
[root@localhost 7008]# redis-cli -c -p 7001 cluster nodes 2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001 myself,master - 0 0 2 connected 5461-10922 0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002 master - 0 1428295271619 3 connected 10923-16383 37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003 master - 0 1428295270603 7 connected 0-5460 e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004 slave 2d03b862083ee1b1785dba5db2987739cf3a80eb 0 1428295272642 5 connected 2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000 master,fail - 1428295159553 1428295157205 1 disconnected 9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005 slave 0456869a2c2359c3e06e065a09de86df2e3135ac 0 1428295269587 6 connected
原來的7000端口實例已經顯示fail,原來的7003是slave,現在自動提升為master。
關於更多的在線添加節點,刪除節點,以及對集群進行重新分片請參考官方文檔。
redis-cluster是個好東西,只是stable才出來不久,肯定坑略多,而且現在使用的人比較少,前期了解學習一下是可以的,生產環境肯定要慎重考慮。且需要進行嚴格的測試。生產環境中redis的集群可以考慮使用Twitter開源的twemproxy,以及豌豆莢開源的codis,這兩個項目都比較成熟,現在使用的公司很多。
redis-cluster的自動擴容、縮容機制
如何在不停掉Cluster集群環境的情況下,動態的往集群環境中增加主、從節點和動態的從集群環境中刪除節點。
redis的動態擴容操作都是通過redis-trib.rb腳本文件來完成的
[root@localhost cluster]# redis-trib
Cluster集群增加操作
增加節點的順序是先增加Master主節點,然后在增加Slave從節點。
節點信息
[root@localhost cluster]# ps -ef |grep redis root 5464 1 0 03:31 ? 00:00:00 redis-server 127.0.0.1:7000 [cluster] root 5469 1 0 03:31 ? 00:00:00 redis-server 127.0.0.1:7001 [cluster] root 5473 1 0 03:31 ? 00:00:00 redis-server 127.0.0.1:7002 [cluster] root 5478 1 0 03:31 ? 00:00:00 redis-server 127.0.0.1:7003 [cluster] root 5482 1 0 03:31 ? 00:00:00 redis-server 127.0.0.1:7004 [cluster] root 5486 1 0 03:31 ? 00:00:00 redis-server 127.0.0.1:7005 [cluster] root 5490 1 0 03:31 ? 00:00:00 redis-server 127.0.0.1:7006 [cluster] root 5495 1 0 03:32 ? 00:00:00 redis-server 127.0.0.1:7007 [cluster] root 5499 1 0 03:32 ? 00:00:00 redis-server 127.0.0.1:7008 [cluster] root 5813 5752 0 03:52 pts/1 00:00:00 grep redis
連接集群:
redis-cli -c -h 127.0.0.1 -p 7000
查看集群節點詳細信息,三主六從如下
127.0.0.1:7000> CLUSTER nodes 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 master - 0 1557226729070 2 connected 5461-10922 e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557226729070 8 connected 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slave 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 0 1557226730087 7 connected 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slave 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 0 1557226729578 6 connected c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557226730087 9 connected 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557226730598 5 connected cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 master - 0 1557226730598 3 connected 10923-16383 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460 ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557226728566 4 connected
1、動態增加Master主服務器節點
1.1、創建目錄7009(Master主節點文件夾)和7010、7011(Slave從節點文件夾),並從以前Cluster集群節點7000-7008任一節點中拷貝配置文件redis.conf到其目錄下,注意修改端口號。
1.2、啟動7009和7010、7011目錄下Redis實例,並查看效果。
啟動實例
cd /data/cluster/7009 redis-server redis.conf cd /data/cluster/7010 redis-server redis.conf cd /data/cluster/7011 redis-server redis.conf
效果:新添加的redis服務,已加入集群里
[root@localhost 7011]# ps -ef |grep redis
root 5464 1 0 03:31 ? 00:00:01 redis-server 127.0.0.1:7000 [cluster]
root 5469 1 0 03:31 ? 00:00:01 redis-server 127.0.0.1:7001 [cluster]
root 5473 1 0 03:31 ? 00:00:01 redis-server 127.0.0.1:7002 [cluster]
root 5478 1 0 03:31 ? 00:00:01 redis-server 127.0.0.1:7003 [cluster]
root 5482 1 0 03:31 ? 00:00:01 redis-server 127.0.0.1:7004 [cluster]
root 5486 1 0 03:31 ? 00:00:01 redis-server 127.0.0.1:7005 [cluster]
root 5490 1 0 03:31 ? 00:00:01 redis-server 127.0.0.1:7006 [cluster]
root 5495 1 0 03:32 ? 00:00:01 redis-server 127.0.0.1:7007 [cluster]
root 5499 1 0 03:32 ? 00:00:01 redis-server 127.0.0.1:7008 [cluster]
root 5953 1 0 04:06 ? 00:00:00 redis-server 127.0.0.1:7009 [cluster]
root 5958 1 0 04:06 ? 00:00:00 redis-server 127.0.0.1:7010 [cluster]
root 5962 1 0 04:06 ? 00:00:00 redis-server 127.0.0.1:7011 [cluster]
root 5967 5935 0 04:07 pts/3 00:00:00 grep redis
登錄到7009的端口:
redis-cli -c -h 127.0.0.1 -p 7009
查看當前節點信息:
127.0.0.1:7009> info replication # Replication role:master connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
退出7009的端口,登錄7010、7011的端口,查看節點信息:
127.0.0.1:7009> quit
[root@localhost 7011]# redis-cli -c -h 127.0.0.1 -p 7010
127.0.0.1:7010> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:7010> quit
[root@localhost 7011]# redis-cli -c -h 127.0.0.1 -p 7011
127.0.0.1:7011> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:7011>
將7009主節點加入到Cluster集群
redis-trib add-node 127.0.0.1 7009 127.0.0.1 7000
添加后的信息:
[root@localhost 7011]# redis-trib add-node 127.0.0.1 7009 127.0.0.1 7000 [ERR] Wrong number of arguments for specified sub command [root@localhost 7011]# cd cd /data/cluster/ -bash: cd: cd: No such file or directory [root@localhost 7011]# cd /data/cluster/ [root@localhost cluster]# redis-trib add-node 127.0.0.1 7009 127.0.0.1 7000 [ERR] Wrong number of arguments for specified sub command [root@localhost cluster]# redis-trib add-node 127.0.0.1:7009 127.0.0.1:7000 >>> Adding node 127.0.0.1:7009 to cluster 127.0.0.1:7000 >>> Performing Cluster Check (using node 127.0.0.1:7000) M: 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 slots:0-5460 (5461 slots) master 2 additional replica(s) M: 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 2 additional replica(s) S: e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slots: (0 slots) slave replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba S: 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slots: (0 slots) slave replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba S: c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 M: cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 2 additional replica(s) S: ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 127.0.0.1:7009 to make it join the cluster. [OK] New node added correctly. [root@localhost cluster]#
注意:當添加新節點成功以后,新的節點不會有任何數據,因為他沒有分配任何的數據Slot(哈希slots),這一步需要手動操作
查看當前節點數:
CLUSTER info
127.0.0.1:7000> CLUSTER info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:10 原來是九個,現在變成十個了
cluster_size:3
cluster_current_epoch:9
cluster_my_epoch:1
cluster_stats_messages_sent:16601
cluster_stats_messages_received:16601
cluster nodes驗證:
127.0.0.1:7000> CLUSTER nodes
91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 master - 0 1557228003126 2 connected 5461-10922
e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557228003126 8 connected
5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slave 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 0 1557228002517 7 connected
30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slave 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 0 1557228003024 6 connected
c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557228001603 9 connected
90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557228002517 5 connected
cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 master - 0 1557228002111 3 connected 10923-16383
4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
c80912f49bbd3787067eb4d622cd06cac3397a13 127.0.0.1:7009 master - 0 1557228001908 0 connected
ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557228002111 4 connected
為7009Master主節點分配數據Slots,分配方法是從集群中知道任何一個主節點(因為只有Master主節點才有數據slots),然后對其進行重新分片工作
redis-trib reshard 127.0.0.1:7000
分配信息:
[root@localhost cluster]# redis-trib reshard 127.0.0.1:7000 >>> Performing Cluster Check (using node 127.0.0.1:7000) M: 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 slots:0-5460 (5461 slots) master 2 additional replica(s) M: 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 2 additional replica(s) S: e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slots: (0 slots) slave replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba S: 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slots: (0 slots) slave replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba S: c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 M: cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 2 additional replica(s) M: c80912f49bbd3787067eb4d622cd06cac3397a13 127.0.0.1:7009 slots: (0 slots) master 0 additional replica(s) S: ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 [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)?
輸入:
How many slots do you want to move (from 1 to 16384)? 1000 分配多少hash槽 What is the receiving node ID? c80912f49bbd3787067eb4d622cd06cac3397a13 待分配redis的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:all 選擇從哪些redis中抽取槽,輸入redis的id,all代表全部
如下:已分配完成
Resharding plan: Moving slot 5461 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5462 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5463 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5464 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5465 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5466 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5467 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5468 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5469 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5470 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5471 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5472 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5473 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba Moving slot 5474 from 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 。。。
輸入:yes 同意分配
CLUSTER nodes,查看7009已分配的哈希槽
127.0.0.1:7009> CLUSTER nodes e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557228755334 3 connected ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557228755334 1 connected 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 master - 0 1557228756346 1 connected 333-5460 c80912f49bbd3787067eb4d622cd06cac3397a13 127.0.0.1:7009 myself,master - 0 0 10 connected 0-332 5461-5794 10923-11255 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557228756854 1 connected c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557228756854 3 connected 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slave c80912f49bbd3787067eb4d622cd06cac3397a13 0 1557228757360 10 connected 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 master - 0 1557228755839 2 connected 5795-10922 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slave 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 0 1557228756346 2 connected cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 master - 0 1557228755233 3 connected 11256-16383
動態增加Slave從服務器節點
將7010、7011加入到集群中,但是並不分配hash槽。
[root@localhost cluster]# redis-trib add-node 127.0.0.1:7010 127.0.0.1:7000 >>> Adding node 127.0.0.1:7010 to cluster 127.0.0.1:7000 >>> Performing Cluster Check (using node 127.0.0.1:7000) M: 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 slots:333-5460 (5128 slots) master 2 additional replica(s) M: 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 slots:5795-10922 (5128 slots) master 1 additional replica(s) S: e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slots: (0 slots) slave replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba S: 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slots: (0 slots) slave replicates c80912f49bbd3787067eb4d622cd06cac3397a13 S: c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 M: cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 slots:11256-16383 (5128 slots) master 2 additional replica(s) M: c80912f49bbd3787067eb4d622cd06cac3397a13 127.0.0.1:7009 slots:0-332,5461-5794,10923-11255 (1000 slots) master 1 additional replica(s) S: ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 127.0.0.1:7010 to make it join the cluster. [OK] New node added correctly.
加入后,登錄到7009端口,為其指定主節點(master)
[root@localhost 7011]# redis-cli -c -h 127.0.0.1 -p 7010
127.0.0.1:7010> cluster replicate c80912f49bbd3787067eb4d622cd06cac3397a13(主節點7009的id)
OK
7011同理:
[root@localhost cluster]# redis-trib add-node 127.0.0.1:7011 127.0.0.1:7000 >>> Adding node 127.0.0.1:7011 to cluster 127.0.0.1:7000 >>> Performing Cluster Check (using node 127.0.0.1:7000) M: 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 slots:333-5460 (5128 slots) master 2 additional replica(s) M: 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 slots:5795-10922 (5128 slots) master 1 additional replica(s) S: e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slots: (0 slots) slave replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba S: 550255c17853778352ecf97f452c55cf5b267a5b 127.0.0.1:7010 slots: (0 slots) slave replicates c80912f49bbd3787067eb4d622cd06cac3397a13 S: 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slots: (0 slots) slave replicates c80912f49bbd3787067eb4d622cd06cac3397a13 S: c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 M: cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 slots:11256-16383 (5128 slots) master 2 additional replica(s) M: c80912f49bbd3787067eb4d622cd06cac3397a13 127.0.0.1:7009 slots:0-332,5461-5794,10923-11255 (1000 slots) master 2 additional replica(s) S: ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 127.0.0.1:7011 to make it join the cluster. [OK] New node added correctly. [root@localhost cluster]#
[root@localhost 7011]# redis-cli -c -h 127.0.0.1 -p 7011 127.0.0.1:7011> cluster replicate c80912f49bbd3787067eb4d622cd06cac3397a13 OK
添加完成后,查看集群信息:
127.0.0.1:7011> cluster nodes 550255c17853778352ecf97f452c55cf5b267a5b 127.0.0.1:7010 slave c80912f49bbd3787067eb4d622cd06cac3397a13 0 1557232681486 10 connected c80912f49bbd3787067eb4d622cd06cac3397a13 127.0.0.1:7009 master - 0 1557232680480 10 connected 0-332 5461-5794 10923-11255 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slave 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 0 1557232679977 2 connected ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557232681989 1 connected 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 master - 0 1557232681989 2 connected 5795-10922 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slave c80912f49bbd3787067eb4d622cd06cac3397a13 0 1557232681989 10 connected 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557232679977 1 connected cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 master - 0 1557232680983 3 connected 11256-16383 c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557232681486 3 connected 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 master - 0 1557232680480 1 connected 333-5460 e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557232680983 3 connected 472088b1f98e6da24824db7c9ce3373772e17b82 127.0.0.1:7011 myself,slave c80912f49bbd3787067eb4d622cd06cac3397a13 0 0 0 connected
Cluster集群刪除操作
Cluster集群模式中動態的刪除掉7009、7010、7011節點,即刪除一個主節點和其附屬的兩個從節點,精簡集群。刪除的順序是先刪除Slave從節點,然后在刪除Master主節點
1、動態刪除Slave從服務器節點
1.1、刪除7010從節點,輸入del-node命令,指定刪除節點的IP地址和Port端口號,同時還要提供該從節點ID名稱。
[root@localhost cluster]# redis-trib del-node 127.0.0.1:7010 550255c17853778352ecf97f452c55cf5b267a5b
刪除成功信息
>>> Removing node 550255c17853778352ecf97f452c55cf5b267a5b from cluster 127.0.0.1:7010 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node. [root@localhost cluster]#
1.1、刪除7011從節點,輸入del-node命令,指定刪除節點的IP地址和Port端口號,同時還要提供該從節點ID名稱。
[root@localhost cluster]# redis-trib del-node 127.0.0.1:7011 472088b1f98e6da24824db7c9ce3373772e17b82
刪除成功信息
>>> Removing node 472088b1f98e6da24824db7c9ce3373772e17b82 from cluster 127.0.0.1:7011 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.
查看當前集群節點,發現已經沒了7010、7011這兩個節點
[root@localhost 7011]# redis-cli -c -h 127.0.0.1 -p 7009 127.0.0.1:7009> cluster nodes e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557233568335 3 connected ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557233567832 1 connected 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 master - 0 1557233568838 1 connected 333-5460 c80912f49bbd3787067eb4d622cd06cac3397a13 127.0.0.1:7009 myself,master - 0 0 10 connected 0-332 5461-5794 10923-11255 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557233569341 1 connected c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557233569846 3 connected 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slave c80912f49bbd3787067eb4d622cd06cac3397a13 0 1557233568838 10 connected 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 master - 0 1557233569341 2 connected 5795-10922 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slave 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 0 1557233567832 2 connected cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 master - 0 1557233569341 3 connected 11256-16383 127.0.0.1:7009>
動態刪除Master主服務器節點
要想刪除Master主節點,可能要繁瑣一些。因為在Master主節點上有數據槽(slots),為了保證數據的不丟失,必須把這些數據槽遷移到其他Master主節點上,然后在刪除主節點。
不移除hash槽時直接刪除:
[root@localhost cluster]# redis-trib del-node 127.0.0.1:7009 c80912f49bbd3787067eb4d622cd06cac3397a13
>>> Removing node c80912f49bbd3787067eb4d622cd06cac3397a13 from cluster 127.0.0.1:7009
[ERR] Node 127.0.0.1:7009 is not empty! Reshard data away and try again. 報錯,必須先移出hash槽
重新分片,把要刪除的Master主節點的數據槽移動到其他Master主節點上,以免數據丟失。
[root@localhost cluster]# redis-trib reshard 127.0.0.1:7009
分片信息:
>>> Performing Cluster Check (using node 127.0.0.1:7009) M: c80912f49bbd3787067eb4d622cd06cac3397a13 127.0.0.1:7009 slots:0-332,5461-5794,10923-11255 (1000 slots) master 1 additional replica(s) S: e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 M: 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 slots:333-5460 (5128 slots) master 2 additional replica(s) S: 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slots: (0 slots) slave replicates 4381850849cd6bb3cae49494a08277c77bfa7720 S: c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slots: (0 slots) slave replicates cdf1c9036431e82e125c5fc87b91b425bccdf0dc S: 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slots: (0 slots) slave replicates c80912f49bbd3787067eb4d622cd06cac3397a13 M: 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 slots:5795-10922 (5128 slots) master 1 additional replica(s) S: 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slots: (0 slots) slave replicates 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba M: cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 slots:11256-16383 (5128 slots) master 2 additional replica(s) [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,這里也輸入1000
How many slots do you want to move (from 1 to 16384)? 1000 What is the receiving node ID? cdf1c9036431e82e125c5fc87b91b425bccdf0dc(接收hash槽的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:c80912f49bbd3787067eb4d622cd06cac3397a13 (移除槽的id這里是7009節點的id)可以一次性移出多個 Source node #2:done(沒有其他要移除的hash槽,輸入done執行) Ready to move 999 slots. Source nodes: M: c80912f49bbd3787067eb4d622cd06cac3397a13 127.0.0.1:7009 slots:0-332,5461-5794,10923-11255 (1000 slots) master 1 additional replica(s) Destination node: M: cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 slots:11256-16383 (5128 slots) master 2 additional replica(s) Resharding plan: Moving slot 0 from c80912f49bbd3787067eb4d622cd06cac3397a13 Moving slot 1 from c80912f49bbd3787067eb4d622cd06cac3397a13 Moving slot 2 from c80912f49bbd3787067eb4d622cd06cac3397a13 Moving slot 3 from c80912f49bbd3787067eb4d622cd06cac3397a13 Moving slot 4 from c80912f49bbd3787067eb4d622cd06cac3397a13 Moving slot 5 from c80912f49bbd3787067eb4d622cd06cac3397a13 Moving slot 6 from c80912f49bbd3787067eb4d622cd06cac3397a13Moving slot 11253 from c80912f49bbd3787067eb4d622cd06cac3397a13
...
Moving slot 11254 from c80912f49bbd3787067eb4d622cd06cac3397a13
Do you want to proceed with the proposed reshard plan (yes/no)? yes
輸入:yes,移除hash槽成功
Moving slot 11244 from 127.0.0.1:7009 to 127.0.0.1:7002: Moving slot 11245 from 127.0.0.1:7009 to 127.0.0.1:7002: Moving slot 11246 from 127.0.0.1:7009 to 127.0.0.1:7002: Moving slot 11247 from 127.0.0.1:7009 to 127.0.0.1:7002: Moving slot 11248 from 127.0.0.1:7009 to 127.0.0.1:7002: Moving slot 11249 from 127.0.0.1:7009 to 127.0.0.1:7002: Moving slot 11250 from 127.0.0.1:7009 to 127.0.0.1:7002: Moving slot 11251 from 127.0.0.1:7009 to 127.0.0.1:7002: Moving slot 11252 from 127.0.0.1:7009 to 127.0.0.1:7002: Moving slot 11253 from 127.0.0.1:7009 to 127.0.0.1:7002: Moving slot 11254 from 127.0.0.1:7009 to 127.0.0.1:7002: [root@localhost cluster]#
當前7009主節點已經沒有數據槽了,而7002增加了1000個槽
127.0.0.1:7000> cluster nodes 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 master - 0 1557234298666 2 connected 5795-10922 e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557234298666 11 connected 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slave 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 0 1557234296650 7 connected 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slave c80912f49bbd3787067eb4d622cd06cac3397a13 0 1557234298666 10 connected c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557234297155 11 connected 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557234298162 5 connected cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 master - 0 1557234296650 11 connected 0-332 5461-5794 10923-11254 11256-16383 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 myself,master - 0 0 1 connected 333-5460 c80912f49bbd3787067eb4d622cd06cac3397a13 127.0.0.1:7009 master - 0 1557234297155 10 connected 11255 ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557234297658 4 connected
然后,刪除節點即可,刪除7009主節點,提供要刪除節點的IP地址和Port端口,當然還有要刪除的節點的ID。
redis-trib del-node 127.0.0.1:7009 c80912f49bbd3787067eb4d622cd06cac3397a13
刪除成功:
>>> Removing node c80912f49bbd3787067eb4d622cd06cac3397a13 from cluster 127.0.0.1:7009 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.
查看集群節點:已經沒有7009節點了
[root@localhost 7011]# redis-cli -c -h 127.0.0.1 -p 7000 127.0.0.1:7000> cluster nodes 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 127.0.0.1:7001 master - 0 1557234776145 2 connected 5795-10922 e3c0e70a3546bad0e5e8fb9ec97fdb7ef15259ce 127.0.0.1:7007 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557234776647 11 connected 5fa3a168bf8315252e2da49aa626e9d723660645 127.0.0.1:7006 slave 91fd3b872ccb9ca1c975badbbadb92f8cdb6aeba 0 1557234776145 7 connected 30d747404f9da8d6b2ad49788b5238205a23c1f3 127.0.0.1:7005 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557234777151 11 connected c6218645bea714109b2c11a412ea995f671e14b1 127.0.0.1:7008 slave cdf1c9036431e82e125c5fc87b91b425bccdf0dc 0 1557234777151 11 connected 90658556651144ed4f46c4a4b52bc0f1b4a9b84f 127.0.0.1:7004 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557234777655 5 connected cdf1c9036431e82e125c5fc87b91b425bccdf0dc 127.0.0.1:7002 master - 0 1557234776647 11 connected 0-332 5461-5794 10923-16383 4381850849cd6bb3cae49494a08277c77bfa7720 127.0.0.1:7000 myself,master - 0 0 1 connected 333-5460 ffaa09343e8852e670c4b217a7f9d9400c04fa18 127.0.0.1:7003 slave 4381850849cd6bb3cae49494a08277c77bfa7720 0 1557234778159 4 connected
上面就操作完了,由於主從復制和哨兵模式這兩個集群模式由於不能動態擴容,而且主節點之間(有多個主節點的情況)數據完全一樣,導致了主節點的容量成了整個集群的瓶頸,如果想擴展集群容量,必須擴展主節點的容量。由於以上的問題,redis在3.0開始Cluster集群模式,這個模式在主節點之間數據是不一樣的,數據也可以根據需求自動轉向其他節點。這樣就可以實現橫向動態擴容,新增加的主從節點,用於存儲新的數據則可,對以前的節點的數據不會有任何影響,配置也很簡單,這才是我們所需要的集群模式。