環境描述:一臺機器啓動六個節點,3個主節點,3個從節點。
安裝:tar -zxvf redis-3.2.10.tar.gz
mv redis-3.2.10 /usr/local/redis
yum install gcc* tcl -y
make && make test
修改配置文件:vi /usr/local/redis/redis.conf
php
**要改的地方** daemonize yes port 7000 cluster-enabled yes cluster-config-file nodes-7000.conf . //這個編號最好是等於你的端口號 cluster-node-timeout 5000
mkdir /usr/local/cluster-test/ //同時複製配置文件,且修改端口及參數
node
**在/usr/local/cluster-test/下建立** mkdir 7000 mkdir 7001 mkdir 7002 mkdir 7003 mkdir 7004 mkdir 7005
啓動服務:linux
./redis-server /usr/local/cluster-test/7000/redis.conf ./redis-server /usr/local/cluster-test/7001/redis.conf ./redis-server /usr/local/cluster-test/7002/redis.conf ./redis-server /usr/local/cluster-test/7003/redis.conf ./redis-server /usr/local/cluster-test/7004/redis.conf ./redis-server /usr/local/cluster-test/7005/redis.conf
netstat -anput | grep redis
[root@localhost src]# ./redis-cli -h 127.0.0.1 -p 7000
web
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7000 127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7001 127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7002 127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7003 127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7004 127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7005 127.0.0.1:7000> CLUSTER NODES 127.0.0.1:7000> CLUSTER INFO . //cluter開始的時候是fail
給三個主節點分配槽點:redis
redis-cli -h 127.0.0.1 -p 7000 cluster addslots {0..5461} redis-cli -h 127.0.0.1 -p 7001 cluster addslots {5462..10922} redis-cli -h 127.0.0.1 -p 7002 cluster addslots {10923..16383}
設置從節點:[root@localhost src]# ./redis-cli -p 7003
127.0.0.1:7003> CLUSTER REPLICATE
8573e44492c6ba0713e36545202459974cc18cf7[root@localhost src]# ./redis-cli -p 7004
127.0.0.1:7004> CLUSTER REPLICATE
59d75c9a0b599265d0ac123cc99f18050df5afa3[root@localhost src]# ./redis-cli -p 7005
127.0.0.1:7005> CLUSTER REPLICATE
607f5472bdd9f581ad16b960244ee7ba18fb5a1f[root@localhost src]# ./redis-cli -p 7000
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:6 cluster_size:3 cluster_current_epoch:5 cluster_my_epoch:3 cluster_stats_messages_sent:7306 cluster_stats_messages_received:7306
環境描述:一臺機器啓動六個節點,3個主節點,3個從節點。
安裝:tar -zxvf redis-3.2.10.tar.gz
mv redis-3.2.10 /usr/local/redis
yum install gcc* tcl -y
make && make test
修改配置文件:vi /usr/local/redis/redis.conf
ruby
daemonize yes port 7000 cluster-enabled yes cluster-config-file nodes-7000.conf . //這個編號最好是等於你的端口號 cluster-node-timeout 5000 appendonly yes
mkdir /usr/local/cluster-test/ //同時複製配置文件,且修改端口及參數
服務器
mkdir 7000 mkdir 7001 mkdir 7002 mkdir 7003 mkdir 7004 mkdir 7005
啓動服務:app
redis-server /usr/local/cluster-test/7000/redis.conf redis-server /usr/local/cluster-test/7001/redis.conf redis-server /usr/local/cluster-test/7002/redis.conf redis-server /usr/local/cluster-test/7003/redis.conf redis-server /usr/local/cluster-test/7004/redis.conf redis-server /usr/local/cluster-test/7005/redis.conf
[root@localhost ~]#netstat -anput | grep redis
將6個節點連在一塊兒構成集羣
須要用到的命令就是redis-trib.rb,這是官方的一個用ruby寫的一個操做redis cluster的命
令,因此,你的機器上須要安裝ruby。咱們先試一下這個命令:[root@web3 7005]# yum -y install rpm-build openssl openssl-devel
[root@localhost ruby]# tar -zxvf ruby-2.3.1.tar.gz
[root@localhost ruby]#./configure --prefix=/usr/local/ruby
[root@localhost ruby]#make && make install
[root@localhost ruby]#ln -s /usr/local/ruby/bin/* /usr/local/bin/
[root@localhost ~]# ln /usr/local/redis/src/redis-trib.rb /usr/local/bin/
[root@localhost ~]#gem install redis-3.3.0.gem
[root@localhost ~]# gem list redis
由於咱們要新建集羣, 因此這裏使用create命令. --replicas 1 參數表示爲每一個主節點建立一
個從節點. 其餘參數是實例的地址集合。ide
[root@localhost src]# redis-trib.rb create --replicas 1 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
Creating cluster
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7004: OK
Connecting to node 127.0.0.1:7005: OK
Performing hash slots allocation on 6 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:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
S: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003
replicates 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4
S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004
replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c
S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005
replicates dfa0754c7854a874a6ebd2613b86140ad97701fc
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: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
M: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003
slots: (0 slots) master
replicates 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4
M: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004
slots: (0 slots) master
replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c
M: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005
slots: (0 slots) master
replicates dfa0754c7854a874a6ebd2613b86140ad97701fc
[OK] All nodes agree about slots configuration.
Check for open slots...
Check slots coverage...
[OK] All 16384 slots covered.
Redis-trib會提示你作了什麼配置, 輸入yes接受. 集羣就被配置和加入了, 意思是, 實例
會通過互相交流後啓動。
測試集羣的狀態:[root@localhost 7000]# redis-trib.rb check 127.0.0.1:7000
能夠看到有3個主節點,3個從節點。每一個節點都是成功的鏈接狀態
3個主節點[M]是:
7000 (3707debcbe7be66d4a1968eaf3a5ffaf4308efa4)
7001 (cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c)
7002 (dfa0754c7854a874a6ebd2613b86140ad97701fc)
3個從節點[S]是:
7003 (d2237fdcfbba672de766b913d1186cebcb6e1761)->7000
7004 (4b4aef8b48c427a3c903518339d53b6447c58b93)->7001
7005 (30858dbf483b61b9838d5c1f853a60beaa4e7afd) ->7002
測試鏈接集羣
剛纔集羣搭建成功了。按照redis cluster的特色,它是去中心化,每一個節點都是對等的,所
以,你鏈接哪一個節點均可以獲取和設置數據,咱們來試一下。 redis-cli是redis默認的客戶
端工具,啓動時加上-c參數,就能夠鏈接到集羣。 鏈接任意一個節點端口:[root@web3 7000]# redis-cli -c -p 7000
127.0.0.1:7000>
設置一個值:
127.0.0.1:7000> set my_name linux
-> Redirected to slot [12803] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get my_name
"linux"
127.0.0.1:7002>
前面理論知識咱們知道了,分配key的時候,它會使用CRC16('my_name')%16384算法,
來計算,將這個key放到哪一個節點,這裏分配到了12803 slot 就分配到了7002(10923-
16383)這個節點上。
Redirected to slot [12803] located at 127.0.0.1:7002
redis cluster 採用的方式很直接,它直接跳轉到7002節點了,而不是還在自身的7000節
點。 如今咱們鏈接7005這個從節點:[root@web3 7000]# redis-cli -c -p 7005
127.0.0.1:7005> get my_name -> Redirected to slot [12803] located at 127.0.0.1:7002 "linux" 127.0.0.1:7002> 咱們一樣是獲取my_name的值,它一樣也是跳轉到了7002上。 咱們再嘗試一些其餘的可 以: 127.0.0.1:7002> set age 123 -> Redirected to slot [741] located at 127.0.0.1:7000 OK 127.0.0.1:7000> set height 565 -> Redirected to slot [8223] located at 127.0.0.1:7001 OK 127.0.0.1:7001> set sex 1 -> Redirected to slot [2584] located at 127.0.0.1:7000 OK 127.0.0.1:7000> set home china -> Redirected to slot [10814] located at 127.0.0.1:7001 OK 127.0.0.1:7001> set city shanghai -> Redirected to slot [11479] located at 127.0.0.1:7002 OK 127.0.0.1:7002> set citylocate shanghaipudong OK 127.0.0.1:7001> set wsdwxzx hhh -> Redirected to slot [15487] located at 127.0.0.1:7002 OK 127.0.0.1:7002> zadd erew 333 rrr -> Redirected to slot [10576] located at 127.0.0.1:7001 (integer) 1 127.0.0.1:7000> zrange erew 0 -1 -> Redirected to slot [10576] located at 127.0.0.1:7001 1) "rrr" 127.0.0.1:7001> 128.~~~~ 能夠看出,數據都會在7000-7002 這3個主節點來跳轉存儲。 測試集羣中的節點掛掉 上面咱們創建來了一個集羣。3個主節點[7000-7002]提供數據存粗和讀取,3個從節點 [7003-7005]則是負責把[7000-7002]的數據同步到本身的節點上來,咱們來看一下 [7003-7005]的appendonly.aof的內容。看看是否是不這樣: `[root@web3 7005]# cd /usr/local/cluster-test/7003` `[root@web3 7003]# vi appendonly.aof` *2 $6 SELECT $1 0 *3 $3 set $3 age $3 123 *3 $3 set $3 sex $1 1 *3 $3 set $3 job $3 php 咱們看下,的確是從7000節點上同步過來的數據,7004,7005也是。 下面,咱們先來模擬其中一臺Master主服務器掛掉的狀況。 `[root@web3 7003]# ps -ef|grep redis` root 11380 1 0 07:37 ? 00:00:03 redis-server *:7000 [cluster] root 11384 1 0 07:37 ? 00:00:03 redis-server *:7001 [cluster] root 11388 1 0 07:37 ? 00:00:03 redis-server *:7002 [cluster] root 11392 1 0 07:37 ? 00:00:03 redis-server *:7003 [cluster] root 11396 1 0 07:37 ? 00:00:04 redis-server *:7004 [cluster] root 11400 1 0 07:37 ? 00:00:03 redis-server *:7005 [cluster] 好,安裝前面的理論,7000主節點掛掉了,那麼這個時候,7000的從節點只有7003一個, 確定7003就會被選舉稱Master節點了: `[root@web3 7003]# kill 11380` `[root@web3 7003]# redis-trib.rb check 127.0.0.1:7000` Connecting to node 127.0.0.1:7000: [ERR] Sorry, can't connect to node 127.0.0.1:7000 `[root@web3 7003]# redis-trib.rb check 127.0.0.1:7001` Connecting to node 127.0.0.1:7001: OK Connecting to node 127.0.0.1:7004: OK Connecting to node 127.0.0.1:7005: OK Connecting to node 127.0.0.1:7003: OK Connecting to node 127.0.0.1:7002: OK Performing Cluster Check (using node 127.0.0.1:7001) M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004 slots: (0 slots) slave replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005 slots: (0 slots) slave replicates dfa0754c7854a874a6ebd2613b86140ad97701fc M: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003 slots:0-5460 (5461 slots) master 0 additional replica(s) M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. Check for open slots... Check slots coverage... [OK] All 16384 slots covered. 看了下,上面有了三個M節點了,果然,7003被選取成了替代7000成爲主節點了。那咱們 來獲取原先存在7000節點的數據: `[root@web3 7003]# redis-cli -c -p 7001` 127.0.0.1:7001> get sex Redirected to slot [2584] located at 127.0.0.1:7003 "1" 127.0.0.1:7003> 數據果然沒有丟失,而是從7003上面獲取了。 咱們再來模擬 7000節點從新啓動了的狀況,那麼它還會自動加入到集羣中嗎?那麼,7000 這個節點上充當什麼角色呢? 咱們試一下: 從新啓動 7000 節點: [root@web3 7003]# cd ../7000 [root@web3 7000]# ll total 56 -rw-r--r-- 1 root root 114 Oct 17 08:16 appendonly.aof -rw-r--r-- 1 root root 43 Oct 17 08:37 dump.rdb -rw-r--r-- 1 root root 745 Oct 17 08:00 nodes.conf -rw-r--r-- 1 root root 41550 Oct 17 07:37 redis.conf [root@web3 7000]# redis-server redis.conf 啓動好了,如今,再來檢查一下集羣: redis-trib.rb check 127.0.0.1:7001 `[root@web3 7000]# redis-trib.rb check 127.0.0.1:7001` Connecting to node 127.0.0.1:7001: OK Connecting to node 127.0.0.1:7004: OK Connecting to node 127.0.0.1:7005: OK Connecting to node 127.0.0.1:7003: OK Connecting to node 127.0.0.1:7000: OK Connecting to node 127.0.0.1:7002: OK Performing Cluster Check (using node 127.0.0.1:7001) M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004 slots: (0 slots) slave replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005 slots: (0 slots) slave replicates dfa0754c7854a874a6ebd2613b86140ad97701fc M: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000 slots: (0 slots) slave replicates d2237fdcfbba672de766b913d1186cebcb6e1761 M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. Check for open slots... Check slots coverage... [OK] All 16384 slots covered. 你看,7000節點啓動起來了,它卻做爲了 7003 的從節點了。 ----- de 127.0.0.1:7000: OK Connecting to node 127.0.0.1:7002: OK Connecting to node 127.0.0.1:7005: OK Connecting to node 127.0.0.1:7003: OK Performing Cluster Check (using node 127.0.0.1:7006) M: efc3131fbdc6cf929720e0e0f7136cae85657481 127.0.0.1:7006 slots: (0 slots) master 0 additional replica(s) M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004 slots: (0 slots) slave replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c S: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000 slots: (0 slots) slave replicates d2237fdcfbba672de766b913d1186cebcb6e1761 M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005 slots: (0 slots) slave replicates dfa0754c7854a874a6ebd2613b86140ad97701fc M: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003 slots:0-5460 (5461 slots) master 1 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)? 它提示咱們須要遷移多少slot到7006上,咱們能夠算一下:16384/4 = 4096,也就是說, 爲了平衡分配起見,咱們須要移動4096個槽點到7006上。 那輸入4096: How many slots do you want to move (from 1 to 16384)? 4096 What is the receiving node ID? 它又提示咱們,接受的node ID是多少,7006的id 咱們經過上面就能夠看到是 efc3131fbdc6cf929720e0e0f7136cae85657481 : What is the receiving node ID? efc3131fbdc6cf929720e0e0f7136cae85657481 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: 接着, redis-trib 會向你詢問從新分片的源節點(source node), 也便是, 要從哪一個節 點中取出 4096 個哈希槽, 並將這些槽移動到7006節點上面。 若是咱們不打算從特定的節點上取出指定數量的哈希槽, 那麼能夠向 redis-trib 輸入 all , 這樣的話, 集羣中的全部主節點都會成爲源節點, redis-trib 將從各個源節點中各取出一 部分哈希槽, 湊夠 4096 個, 而後移動到7006節點上: Source node #1:all 接下來就開 始遷移了,而且會詢問你是否確認: Moving slot 1359 from d2237fdcfbba672de766b913d1186cebcb6e1761 Moving slot 1360 from d2237fdcfbba672de766b913d1186cebcb6e1761 Moving slot 1361 from d2237fdcfbba672de766b913d1186cebcb6e1761 Moving slot 1362 from d2237fdcfbba672de766b913d1186cebcb6e1761 Moving slot 1363 from d2237fdcfbba672de766b913d1186cebcb6e1761 Moving slot 1364 from d2237fdcfbba672de766b913d1186cebcb6e1761 Do you want to proceed with the proposed reshard plan (yes/no)? 輸入 yes 並使用按下回車以後, redis-trib 就會正式開始執行從新分片操做, 將指定的哈 希槽從源節點一個個地移動到7006節點上面。 遷移完畢以後,咱們來檢查下: [root@web3 7006]# redis-trib.rb check 127.0.0.1:7000 Connecting to node 127.0.0.1:7000: OK Connecting to node 127.0.0.1:7006: OK Connecting to node 127.0.0.1:7004: OK Connecting to node 127.0.0.1:7005: OK Connecting to node 127.0.0.1:7003: OK Connecting to node 127.0.0.1:7001: OK Connecting to node 127.0.0.1:7002: OK Performing Cluster Check (using node 127.0.0.1:7000) S: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000 slots: (0 slots) slave replicates d2237fdcfbba672de766b913d1186cebcb6e1761 M: efc3131fbdc6cf929720e0e0f7136cae85657481 127.0.0.1:7006 slots:0-1364,5461-6826,10923-12287 (4096 slots) master 0 additional replica(s) S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004 slots: (0 slots) slave replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005 slots: (0 slots) slave replicates dfa0754c7854a874a6ebd2613b86140ad97701fc M: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003 slots:1365-5460 (4096 slots) master 1 additional replica(s) M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001 slots:6827-10922 (4096 slots) master 1 additional replica(s) M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002 slots:12288-16383 (4096 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. Check for open slots... Check slots coverage... [OK] All 16384 slots covered. 咱們着重看7006: 0-1364,5461-6826,10923-12287 (4096 slots) 這些原來在其餘節點上 的slot唄遷移到了7006上。原來,它只是間隔的移動,並非銜接的總體移動,咱們看下 有數據了沒? [root@web3 7006]# redis-cli -c -p 7006 127.0.0.1:7006> keys * 1) "city" 2) "age" 3) "citylocate" 127.0.0.1:7006> get city "shanghai" 很是贊,已經有數據了。 新建一個 7007從節點,做爲7006的從節點 咱們再新建一個節點7007,步驟相似,就先省 略了。建好後,啓動起來,咱們看如何把它加入到集羣中的從節點中: [root@web3 7007]# redis-trib.rb add-node --slave 127.0.0.1:7007 127.0.0.1:7000 add-node的時候加上--slave表示是加入到從節點中,可是這樣加,是隨機的。這裏的命令 行徹底像咱們在添加一個新主服務器時使用的同樣,因此咱們沒有指定要給哪一個主服務器添 加副本。這種狀況下,redis-trib 會將7007做爲一個具備較少副本的隨機的主服務器的副 本。 那麼,它會做爲誰的從節點,應該是7006,由於7006尚未從節點。咱們運行下。 [root@web3 7007]# redis-trib.rb add-node --slave 127.0.0.1:7007 127.0.0.1:7000 ... ... [OK] All 16384 slots covered. Automatically selected master 127.0.0.1:7006 Connecting to node 127.0.0.1:7007: OK Send CLUSTER MEET to node 127.0.0.1:7007 to make it join the cluster. Waiting for the cluster to join. Configure node as replica of 127.0.0.1:7006. [OK] New node added correctly. 上面提示說,自動選擇了7006做爲master節點。而且成功了。咱們檢查下: [root@web3 7007]# redis-trib.rb check 127.0.0.1:7000 Connecting to node 127.0.0.1:7000: OK Connecting to node 127.0.0.1:7006: OK Connecting to node 127.0.0.1:7004: OK Connecting to node 127.0.0.1:7005: OK Connecting to node 127.0.0.1:7003: OK Connecting to node 127.0.0.1:7001: OK Connecting to node 127.0.0.1:7007: OK Connecting to node 127.0.0.1:7002: OK Performing Cluster Check (using node 127.0.0.1:7000) S: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000 slots: (0 slots) slave replicates d2237fdcfbba672de766b913d1186cebcb6e1761 M: efc3131fbdc6cf929720e0e0f7136cae85657481 127.0.0.1:7006 slots:0-1364,5461-6826,10923-12287 (4096 slots) master 1 additional replica(s) S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004 slots: (0 slots) slave replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005 slots: (0 slots) slave replicates dfa0754c7854a874a6ebd2613b86140ad97701fc M: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003 slots:1365-5460 (4096 slots) master 1 additional replica(s) M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001 slots:6827-10922 (4096 slots) master 1 additional replica(s) S: 86d05e7c2b197dc182b5e71069e791d033cf899e 127.0.0.1:7007 slots: (0 slots) slave replicates efc3131fbdc6cf929720e0e0f7136cae85657481 M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002 slots:12288-16383 (4096 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. Check for open slots... Check slots coverage... [OK] All 16384 slots covered. 果真,7007加入到了7006的從節點當中。 若是想指定一個主節點行不行?固然能夠。咱們再建一個7008節點。 redis-trib.rb add-node --slave --master-id efc3131fbdc6cf929720e0e0f7136cae85657481 127.0.0.1:7008 127.0.0.1:7000 --master-id表示指定的主節點node id。這裏指定的是 7006 這個主節點。 Configure node as replica of 127.0.0.1:7006. [OK] New node added correctly. 提示咱們已經做爲7006的附屬品,也就是加入到7006的從節點來了,照這麼說,7006就有 2個從節點了,咱們看一下: redis-cli -c -p 7008 cluster nodes |grep efc3131fbdc6cf929720e0e0f7136cae85657481 86d05e7c2b197dc182b5e71069e791d033cf899e 127.0.0.1:7007 slave efc3131fbdc6cf929720e0e0f7136cae85657481 0 1445089507786 8 connected efc3131fbdc6cf929720e0e0f7136cae85657481 127.0.0.1:7006 master - 0 1445089508289 8 connected 0-1364 5461-6826 10923-12287 44321e7d619410dc4e0a8745366610a0d06d2395 127.0.0.1:7008 myself,slave efc3131fbdc6cf929720e0e0f7136cae85657481 0 0 0 connected 咱們過濾了下看結果,果然,7007和7008是7006的從節點了。 咱們再作一個實驗,我把7006的殺掉,看7007和7008誰會變成主節點: [root@web3 7008]# ps -ef|grep redis root 11384 1 0 09:56 ? 00:00:16 redis-server *:7001 [cluster] root 11388 1 0 09:56 ? 00:00:16 redis-server *:7002 [cluster] root 11392 1 0 09:56 ? 00:00:16 redis-server *:7003 [cluster] root 11396 1 0 09:56 ? 00:00:15 redis-server *:7004 [cluster] root 11400 1 0 09:56 ? 00:00:15 redis-server *:7005 [cluster] root 12100 1 0 11:01 ? 00:00:11 redis-server *:7000 [cluster] root 12132 1 0 11:28 ? 00:00:11 redis-server *:7006 [cluster] root 12202 1 0 13:14 ? 00:00:02 redis-server *:7007 [cluster] root 12219 1 0 13:39 ? 00:00:00 redis-server *:7008 [cluster] root 12239 8259 0 13:49 pts/0 00:00:00 grep redis [root@web3 7008]# kill 12132 [root@web3 7008]# redis-cli -c -p 7008 127.0.0.1:7008> get ss5rtr Redirected to slot [1188] located at 127.0.0.1:7007 "66" 127.0.0.1:7007> cluster nodes efc3131fbdc6cf929720e0e0f7136cae85657481 127.0.0.1:7006 master,fail - 1445089780668 1445089779963 8 disconnected d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003 master - 0 1445089812195 7 connected 1365-5460 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005 slave dfa0754c7854a874a6ebd2613b86140ad97701fc 0 1445089813710 3 connected 86d05e7c2b197dc182b5e71069e791d033cf899e 127.0.0.1:7007 myself,master - 0 0 10 connected 0-1364 5461-6826 10923-12287 cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001 master - 0 1445089814214 2 connected 6827-10922 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004 slave cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 0 1445089812701 2 connected 44321e7d619410dc4e0a8745366610a0d06d2395 127.0.0.1:7008 slave 86d05e7c2b197dc182b5e71069e791d033cf899e 0 1445089814214 10 connected 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000 slave d2237fdcfbba672de766b913d1186cebcb6e1761 0 1445089813204 7 connected dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002 master - 0 1445089813204 3 connected 12288-16383 127.0.0.1:7007> 7007得到了成爲主節點的機會,7008就變成了7007的從節點。 那麼這個時候,重啓7006 節點,那麼他就會變成了一個7007的從節點了。 127.0.0.1:7008> cluster nodes 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005 slave dfa0754c7854a874a6ebd2613b86140ad97701fc 0 1445089986148 3 connected 86d05e7c2b197dc182b5e71069e791d033cf899e 127.0.0.1:7007 master - 0 1445089986652 10 connected 0-1364 5461-6826 10923-12287 d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003 master - 0 1445089986148 7 connected 1365-5460 cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001 master - 0 1445089987155 2 connected 6827-10922 efc3131fbdc6cf929720e0e0f7136cae85657481 127.0.0.1:7006 slave 86d05e7c2b197dc182b5e71069e791d033cf899e 0 1445089985644 10 connected 44321e7d619410dc4e0a8745366610a0d06d2395 127.0.0.1:7008 myself,slave 86d05e7c2b197dc182b5e71069e791d033cf899e 0 0 0 connected dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002 master - 0 1445089986652 3 connected 12288-16383 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004 slave cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 0 1445089987660 2 connected 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000 slave d2237fdcfbba672de766b913d1186cebcb6e1761 0 1445089985644 7 connected 127.0.0.1:7008> 移除一個主節點 有加確定有減,redis cluster一樣支持移除節點功能,一樣也是redistrib.rb的用法: redis-trib del-node 127.0.0.1:7000 `<node-id>` 和新加節點有點不一樣的是,移除須要節點的node-id。那咱們嘗試將7007這個主節點移 除: [root@web3 7006]# redis-trib.rb del-node 127.0.0.1:7000 86d05e7c2b197dc182b5e71069e791d033cf899e Removing node 86d05e7c2b197dc182b5e71069e791d033cf899e from cluster 127.0.0.1:7000 Connecting to node 127.0.0.1:7000: OK Connecting to node 127.0.0.1:7006: OK Connecting to node 127.0.0.1:7004: OK Connecting to node 127.0.0.1:7001: OK Connecting to node 127.0.0.1:7003: OK Connecting to node 127.0.0.1:7007: OK Connecting to node 127.0.0.1:7008: OK Connecting to node 127.0.0.1:7005: OK Connecting to node 127.0.0.1:7002: OK [ERR] Node 127.0.0.1:7007 is not empty! Reshard data away and try again. 報錯了,它提示咱們說,因爲7007裏面已經有數據了,不能被移除,要先將它的數據轉移 出去。也就是說得從新分片,用上面增長新節點後的分片方式同樣,用咱們再來一遍: redis-trib.rb reshard 127.0.0.1:7000 因爲中間太多內容,就省略不重要的,只簡單說明下關鍵的幾步: M: 86d05e7c2b197dc182b5e71069e791d033cf899e 127.0.0.1:7007 slots:0-1364,5461-6826,10923-12287 (4096 slots) master How many slots do you want to move (from 1 to 16384)? 提示,咱們要分多少個槽點,因爲7007上有4096個槽點,因此這裏填寫4096 How many slots do you want to move (from 1 to 16384)? 4096 What is the receiving node ID? 提示咱們,須要移動到哪一個id上,那就填7001的吧: What is the receiving node ID? cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 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: 這裏就是關鍵了,它要咱們從哪一個節點去轉移數據到7001,由於咱們是要刪除7007的,所 以,咱們就得7007的id了 Source node #1:86d05e7c2b197dc182b5e71069e791d033cf899e Source node #2:done Do you want to proceed with the proposed reshard plan (yes/no)? yes ok,這樣就遷移好了。咱們看看7007是否爲空了: [root@web3 7006]# redis-cli -c -p 7007 127.0.0.1:7007> keys * (empty list or set) 127.0.0.1:7007> cluster nodes 86d05e7c2b197dc182b5e71069e791d033cf899e 127.0.0.1:7007 myself,master - 0 0 10 connected 果真爲空了,好。如今再進行移除節點操做: [root@web3 7006]# redis-trib.rb del-node 127.0.0.1:7000 86d05e7c2b197dc182b5e71069e791d033cf899e Removing node 86d05e7c2b197dc182b5e71069e791d033cf899e from cluster 127.0.0.1:7000 Connecting to node 127.0.0.1:7000: OK Connecting to node 127.0.0.1:7006: OK Connecting to node 127.0.0.1:7004: OK Connecting to node 127.0.0.1:7001: OK Connecting to node 127.0.0.1:7003: OK Connecting to node 127.0.0.1:7007: OK Connecting to node 127.0.0.1:7008: OK Connecting to node 127.0.0.1:7005: OK Connecting to node 127.0.0.1:7002: OK Sending CLUSTER FORGET messages to the cluster... 127.0.0.1:7006 as replica of 127.0.0.1:7001 127.0.0.1:7008 as replica of 127.0.0.1:7001 SHUTDOWN the node. 刪除成功。 咱們再檢查一下:7007 已經移除,連不上了。 [root@web3 7006]# redis-trib.rb check 127.0.0.1:7007 Connecting to node 127.0.0.1:7007: [ERR] Sorry, can't connect to node 127.0.0.1:7007 [root@web3 7006]# redis-trib.rb check 127.0.0.1:7008 Connecting to node 127.0.0.1:7008: OK Connecting to node 127.0.0.1:7005: OK Connecting to node 127.0.0.1:7003: OK Connecting to node 127.0.0.1:7001: OK Connecting to node 127.0.0.1:7006: OK Connecting to node 127.0.0.1:7002: OK Connecting to node 127.0.0.1:7004: OK Connecting to node 127.0.0.1:7000: OK >>> Performing Cluster Check (using node 127.0.0.1:7008) S: 44321e7d619410dc4e0a8745366610a0d06d2395 127.0.0.1:7008 slots: (0 slots) slave replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005 slots: (0 slots) slave replicates dfa0754c7854a874a6ebd2613b86140ad97701fc M: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003 slots:1365-5460 (4096 slots) master 1 additional replica(s) M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001 slots:0-1364,5461-12287 (8192 slots) master 3 additional replica(s) S: efc3131fbdc6cf929720e0e0f7136cae85657481 127.0.0.1:7006 slots: (0 slots) slave replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002 slots:12288-16383 (4096 slots) master 1 additional replica(s) S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004 slots: (0 slots) slave replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c S: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000 slots: (0 slots) slave replicates d2237fdcfbba672de766b913d1186cebcb6e1761 [OK] All nodes agree about slots configuration. Check for open slots... Check slots coverage... [OK] All 16384 slots covered. 7006和7008果真也成功加入到了7001集羣。 移除一個從節點 移除一個從節點就簡單的多了,由於不須要考慮數據的遷移,咱們7008給 移除: [root@web3 7006]# redis-trib.rb del-node 127.0.0.1:7008 44321e7d619410dc4e0a8745366610a0d06d2395 Removing node 44321e7d619410dc4e0a8745366610a0d06d2395 from cluster 127.0.0.1:7005 Connecting to node 127.0.0.1:7005: OK Connecting to node 127.0.0.1:7001: OK Connecting to node 127.0.0.1:7002: OK Connecting to node 127.0.0.1:7004: OK Connecting to node 127.0.0.1:7000: OK Connecting to node 127.0.0.1:7006: OK Connecting to node 127.0.0.1:7008: OK Connecting to node 127.0.0.1:7003: OK Sending CLUSTER FORGET messages to the cluster... SHUTDOWN the node. [root@web3 7006]# redis-trib.rb check 127.0.0.1:7008 Connecting to node 127.0.0.1:7008: [ERR] Sorry, can't connect to node 127.0.0.1:7008 移除成功。