redis應用之cluster(集羣)的安裝配置

1、redis cluster介紹:node

在redis3.0以前的版本中是沒有集羣功能的,只有master-slave模式,這種模式有個弊端是master主機掛掉,客戶端過來的請求就處理不了了。雖然能夠經過sentinel高可用來解決這一問題,可是當數據量很龐大的時候,也會成爲影響性能的瓶頸,因此能夠考慮配置redis cluster來提升性能。Redis集羣是一個提供在多個Redis節點間共享數據的程序集,它並不支持處理多個keys的命令,由於這須要在不一樣的節點間移動數據,從而達不到像Redis那樣的性能,在高負載的狀況下可能會致使不可預料的錯誤.集羣經過分區來提供必定程度的可用性,在實際環境中當某個節點宕機或者不可達的狀況下繼續處理命令.linux

一、Redis 集羣的優點:redis

a、自動分割數據到不一樣的節點上.
b、整個集羣的部分節點失敗或者不可達的狀況下可以繼續處理命令.

二、Redis集羣的數據分片數據庫

Redis集羣沒有使用一致性hash,而是引入了哈希槽的概念.Redis集羣有16384個哈希槽,每一個key經過CRC16校驗後對16384取模來決定放置哪一個槽.集羣的每一個節點負責一部分hash槽。舉個例子,好比當前集羣有3個節點,那麼:ruby

節點 A 包含0到5500號哈希槽.
節點 B 包含5501到11000號哈希槽.
節點 C 包含11001到16384號哈希槽.

這種結構很容易添加或者刪除節點,好比若是我想新添加個節點D, 我須要從節點 A, B, C中獲得部分槽到D上. 若是我想移除節點A,須要將A中的槽移到B和C節點上,而後將沒有任何槽的A節點從集羣中移除便可.因爲從一個節點將哈希槽移動到另外一個節點並不會中止服務,因此不管添加刪除或者改變某個節點的哈希槽的數量都不會形成集羣不可用的狀態.bash

三、Redis一致性保證服務器

Redis並不能保證數據的強一致性. 這意味着在實際中集羣在特定的條件下可能會丟失寫操做.網絡

a、第一個緣由是由於集羣是用了異步複製. 寫操做過程以下:架構

客戶端向主節點B寫入一條命令.app

主節點B向客戶端回覆命令狀態.

主節點將寫操做複製給它的從節點 B1, B2 和 B3.

主節點對命令的複製工做發生在返回命令回覆以後,由於若是每次處理命令請求都須要等待複製操做完成的話,那麼主節點處理命令請求的速度將極大地下降,因此必須在性能和一致性之間作出權衡。

注意:Redis 集羣可能會在未來提供同步寫的方法。

b、另一種可能會丟失命令的狀況是集羣出現了網絡分區,而且一個客戶端與至少包括一個主節點在內的少數實例被孤立。

舉個例子,假設集羣包含 A 、 B 、 C 、 A1 、 B1 、 C1 六個節點, 其中 A 、B 、C 爲主節點, A1 、B1 、C1 爲A,B,C的從節點,還有一個客戶端Z1。假設集羣中發生網絡分區,那麼集羣可能會分爲兩方,大部分的一方包含節點 A 、C 、A1 、B1 和 C1 ,小部分的一方則包含節點B和客戶端Z1。Z1仍然可以向主節點B中寫入, 若是網絡分區發生時間較短,那麼集羣將會繼續正常運做,若是分區的時間足夠讓大部分的一方將B1選舉爲新的master,那麼Z1寫入B中得數據便丟失了.

注意:在網絡分裂出現期間,客戶端Z1能夠向主節點B發送寫命令的最大時間是有限制的,這一時間限制稱爲節點超時時間(node timeout),是 Redis 集羣的一個重要的配置選項!

2、redis cluster 集羣架構

服務器環境:Centos 6.6 x86_64 redis版本3.0.7
服務器ip:   端口
10.0.18.145  7000
10.0.18.145  7001
10.0.18.146  7002
10.0.18.146  7003
10.0.18.147  7004
10.0.18.147  7005

注:在這三臺服務器上編譯安裝redis,能夠參考http://linuxg.blog.51cto.com/4410110/1862040。我這裏是使用3臺服務器,每臺服務器開啓2個進程,一共6個進程來模擬3主3從的cluster模式!若是是生產環境,至少要有6臺服務器來配置redis cluster!由於配置集羣依賴ruby庫,因此須要在3臺服務器上安裝ruby,以下:

#yum install ruby rubygems -y

3、redis cluster集羣配置過程

一、爲不一樣的端口提供redis配置文件

首先在10.0.18.145上操做:

#cd /usr/local/redis/conf
#cat cluster_7000.conf
bind 10.0.18.145 127.0.0.1
daemonize yes
pidfile /var/run/cluster_redis7000.pid
port 7000
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/usr/local/redis/log/cluster_redis7000.log"
databases 16
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump_7000.rdb
dir /usr/local/redis/
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes
appendfilename "appendonly_7000.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
cluster-enabled yes
cluster-config-file nodes_7000.conf
cluster-node-timeout 10000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
maxmemory 1024mb
maxmemory-policy volatile-lru
rename-command FLUSHALL "XSFLUSHALL"
rename-command FLUSHDB "XSFLUSHDB"
rename-command SHUTDOWN "XSSHUTDOWN"
rename-command DEBUG "XSDEBUG"
rename-command CONFIG "XSCONFIG"
rename-command SLAVEOF "XSSLAVEOF"
#cat cluster_7001.conf
注:cluster_7001.conf的內容除了如下幾項和cluster_7000.conf不一樣以外,其餘都同樣
pidfile /var/run/cluster_redis7001.pid
port 7001
logfile "/usr/local/redis/log/cluster_redis7001.log"
dbfilename dump_7001.rdb
appendfilename "appendonly_7001.aof"
cluster-config-file nodes_7001.conf
啓動7000和7001進程
#cd /usr/local/redis/
#nohup ./bin/redis-server ./conf/cluster_7000.conf &
#nohup ./bin/redis-server ./conf/cluster_7001.conf &
查看進程:
#ps aux | grep redis
root     14799  0.1  0.1 137452  2432 ?        Ssl  17:54   0:00 ./bin/redis-server 10.0.18.145:7000 [cluster]
root     14803  0.1  0.1 137452  2428 ?        Ssl  17:55   0:00 ./bin/redis-server 10.0.18.145:7001 [cluster]
root     14842  0.0  0.0 103252   840 pts/0    S+   18:06   0:00 grep redis
查看端口:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      4628/sshd           
tcp        0      0 127.0.0.1:7000              0.0.0.0:*                   LISTEN      14799/./bin/redis-s 
tcp        0      0 10.0.18.145:7000            0.0.0.0:*                   LISTEN      14799/./bin/redis-s 
tcp        0      0 127.0.0.1:7001              0.0.0.0:*                   LISTEN      14803/./bin/redis-s 
tcp        0      0 10.0.18.145:7001            0.0.0.0:*                   LISTEN      14803/./bin/redis-s 
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1101/master         
tcp        0      0 127.0.0.1:17000             0.0.0.0:*                   LISTEN      14799/./bin/redis-s 
tcp        0      0 10.0.18.145:17000           0.0.0.0:*                   LISTEN      14799/./bin/redis-s 
tcp        0      0 127.0.0.1:17001             0.0.0.0:*                   LISTEN      14803/./bin/redis-s 
tcp        0      0 10.0.18.145:17001           0.0.0.0:*                   LISTEN      14803/./bin/redis-s 
tcp        0      0 :::22                       :::*                        LISTEN      4628/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1101/master 
查看節點信息,以下:
#cat nodes_7000.conf 
2e2f563a1467c2515857d70d762c26b06faabbd4 :0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0
#cat nodes_7001.conf 
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 :0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0 
如今尚未建立集羣,因此是這種狀態!

其次在10.0.18.146上操做:

本臺服務器的cluster_7002.conf和cluster_7003.conf配置的內容和cluster_7000.conf同樣,除了如下幾項:

bind 10.0.18.146 127.0.0.1   #綁定ip爲本機地址
剩下的參數,須要將涉及到端口的部分修改成對應的7002和7003
啓動7002和7003進程
#cd /usr/local/redis/
#nohup ./bin/redis-server conf/cluster_7002.conf &
#nohup ./bin/redis-server conf/cluster_7003.conf &
查看進程:
#ps aux | grep redis
root     24102  0.1  0.1 137452  2468 ?        Ssl  18:16   0:00 ./bin/redis-server 10.0.18.146:7002 [cluster]
root     24106  0.0  0.1 137452  2464 ?        Ssl  18:16   0:00 ./bin/redis-server 10.0.18.146:7003 [cluster]
root     24110  0.0  0.0 103252   844 pts/0    S+   18:17   0:00 grep redis
查看端口:
#netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1402/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1103/master         
tcp        0      0 127.0.0.1:7002              0.0.0.0:*                   LISTEN      24102/./bin/redis-s 
tcp        0      0 10.0.18.146:7002            0.0.0.0:*                   LISTEN      24102/./bin/redis-s 
tcp        0      0 127.0.0.1:7003              0.0.0.0:*                   LISTEN      24106/./bin/redis-s 
tcp        0      0 10.0.18.146:7003            0.0.0.0:*                   LISTEN      24106/./bin/redis-s 
tcp        0      0 127.0.0.1:17002             0.0.0.0:*                   LISTEN      24102/./bin/redis-s 
tcp        0      0 10.0.18.146:17002           0.0.0.0:*                   LISTEN      24102/./bin/redis-s 
tcp        0      0 127.0.0.1:17003             0.0.0.0:*                   LISTEN      24106/./bin/redis-s 
tcp        0      0 10.0.18.146:17003           0.0.0.0:*                   LISTEN      24106/./bin/redis-s          
tcp        0      0 :::22                       :::*                        LISTEN      1402/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1103/master

最後在10.0.18.147上操做,方法和18.146是同樣的,這裏不在贅述了,請確保端口能夠正常啓動!

二、建立集羣

在三臺服務器上均可以操做,這裏選擇在10.0.18.145上執行建立命令,以下:

#redis-trib.rb create --replicas 1 10.0.18.145:7000 10.0.18.145:7001 10.0.18.146:7002 10.0.18.146:7003 10.0.18.147:7004 10.0.18.147:7005
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
        from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from /usr/local/redis/bin/redis-trib.rb:25
能夠看到有報錯提示,根據提示找出緣由是:缺乏redis和ruby的接口,這裏使用gem安裝,以下:
#gem install redis     #在三臺redis服務器上都要安裝
Successfully installed redis-3.3.1
1 gem installed
Installing ri documentation for redis-3.3.1...
Installing RDoc documentation for redis-3.3.1...
注:若是redis服務器沒法訪問外網,能夠到一臺能夠訪問外網的服務器上執行gem install redis 而後
會在此服務器上找到/usr/lib/ruby/gems/1.8/cache/redis-3.3.1.gem,再將redis-3.3.1.gem複製到其
他沒法訪問外網的redis上安裝#gem install redis-3.3.1.gem
從新執行建立集羣命令:
#redis-trib.rb create --replicas 1 10.0.18.145:7000 10.0.18.145:7001 10.0.18.146:7002 10.0.18.146:7003 10.0.18.147:7004 10.0.18.147:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:     #能夠看到已經配置好了下面對應的主機端口爲masters
10.0.18.147:7004
10.0.18.146:7002
10.0.18.145:7000
Adding replica 10.0.18.146:7003 to 10.0.18.147:7004  #主從對應關係
Adding replica 10.0.18.147:7005 to 10.0.18.146:7002
Adding replica 10.0.18.145:7001 to 10.0.18.145:7000
M: 2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000
   slots:10923-16383 (5461 slots) master
S: b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001
   replicates 2e2f563a1467c2515857d70d762c26b06faabbd4
M: faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002
   slots:5461-10922 (5462 slots) master
S: 4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003
   replicates c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
M: c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004
   slots:0-5460 (5461 slots) master
S: 37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005
   replicates faee6763e5f591d9d63df8d841041255ae7992f3
Can I set the above configuration? (type 'yes' to accept): yes    #輸入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 10.0.18.145:7000)
M: 2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000
   slots:10923-16383 (5461 slots) master
M: b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001
   slots: (0 slots) master
   replicates 2e2f563a1467c2515857d70d762c26b06faabbd4
M: faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002
   slots:5461-10922 (5462 slots) master
M: 4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003
   slots: (0 slots) master
   replicates c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
M: c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004
   slots:0-5460 (5461 slots) master
M: 37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005
   slots: (0 slots) master
   replicates faee6763e5f591d9d63df8d841041255ae7992f3
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

查看10.0.18.145主機上的nodes信息,以下:

#cat nodes_7000.conf 
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476878663502 2 connected
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476878662501 5 connected 0-5460
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476878663502 6 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 myself,master - 0 0 1 connected 10923-16383
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476878662501 5 connected
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 master - 0 1476878661499 3 connected 5461-10922
vars currentEpoch 6 lastVoteEpoch 0
#cat nodes_7001.conf 
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476878662184 5 connected 0-5460
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476878663186 5 connected
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476878661181 6 connected
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 myself,slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 0 2 connected
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 master - 0 1476878660175 3 connected 5461-10922
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 master - 0 1476878659173 1 connected 10923-16383
vars currentEpoch 6 lastVoteEpoch 0
這些nodes_xxxx.conf中記錄了本機不一樣redis-server端口的角色信息!

能夠在命令行中查看羣的信息,在三臺服務器中的其中一臺查看,在10.0.18.145查看:

#redis-cli -h 10.0.18.145 -p 7000 cluster nodes
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476879080657 2 connected
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476879077649 5 connected 0-5460
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476879078652 6 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 myself,master - 0 0 1 connected 10923-16383
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476879080657 5 connected
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 master - 0 1476879079654 3 connected 5461-10922

在10.0.18.146查看:

 #./bin/redis-cli -h 10.0.18.146 -p 7003 cluster nodes
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476879258036 6 connected
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476879259039 5 connected 0-5460
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476879258036 2 connected
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 myself,slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 0 4 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 master - 0 1476879260041 1 connected 10923-16383
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 master - 0 1476879257033 3 connected 5461-10922
#./bin/redis-cli -h 10.0.18.146 -p 7002 cluster nodes
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476879264453 6 connected
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 myself,master - 0 0 3 connected 5461-10922
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476879262447 5 connected 0-5460
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476879261444 5 connected
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476879263449 2 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 master - 0 1476879261444 1 connected 10923-16383

能夠看到查看的端口不一樣,顯示信息的順序和格式也不一樣!

三、手動設置key-values

在10.0.18.146上操做
#./bin/redis-cli -h 10.0.18.146 -p 7002 -c  #進入集羣的7002端口
10.0.18.146:7002> set name kobe    #設置一個鍵值
OK
10.0.18.146:7002> get name         #查看值
"kobe"
到18.145上查看:
#redis-cli -h 10.0.18.145 -p 7000 -c
10.0.18.145:7000> get name
-> Redirected to slot [5798] located at 10.0.18.146:7002
"kobe"       #會提示你這個鍵在10.0.18.146的7002進程
在18.147上查看:
#./bin/redis-cli -h 10.0.18.147 -p 7004 -c
10.0.18.147:7004> get name
-> Redirected to slot [5798] located at 10.0.18.146:7002
"kobe"      #也會提示你這個鍵在10.0.18.146的7002進程

4、redis cluster使用過程當中遇到的一些問題

一、集羣擴展:

有時候會遇到這種狀況,前期規劃的redis集羣隨着業務的增長,數據量也在不斷增大,須要擴展redis cluster集羣,由原來的3主3從,擴展爲4主4從,或者更多,那麼就須要擴展redis cluster集羣!

我這裏是在10.0.18.147服務器上再開啓兩個端口7006和7007,操做以下:

#cd /usr/local/redis/conf
#cp cluster_7005.conf  cluster_7006.conf
#cp cluster_7005.conf  cluster_7007.conf
修改對應配置文件中的端口
#sed -i 's/7005/7006/g' cluster_7006.conf 
#sed -i 's/7005/7007/g' cluster_7007.conf 
而後啓動
#cd /usr/local/redis/
#nohup bin/redis-server conf/cluster_7006.conf  &
#nohup bin/redis-server conf/cluster_7007.conf  &
查看啓動端口:
#ps aux| grep redis
root     25805  0.1  0.1 137452  2756 ?        Ssl  Oct19   2:07 ./bin/redis-server 10.0.18.147:7004 [cluster]
root     25809  0.1  0.1 137452  2724 ?        Ssl  Oct19   2:00 ./bin/redis-server 10.0.18.147:7005 [cluster]
root     26115  0.0  0.1 137452  2472 ?        Ssl  13:56   0:00 bin/redis-server 10.0.18.147:7006 [cluster]
root     26119  0.0  0.1 137452  2464 ?        Ssl  13:56   0:00 bin/redis-server 10.0.18.147:7007 [cluster]
root     26123  0.0  0.0 103252   844 pts/0    S+   13:57   0:00 grep redis

開始將新結點添加到集羣中:

在介紹添加新節點到集羣以前,先介紹add-node的用法,以下:

add-node命令能夠將新節點加入集羣,節點能夠爲master,也能夠爲某個master節點的slave。
用法:
add-node  new_host:new_port existing_host:existing_port
          --slave
          --master-id <arg>
add-node 有兩個可選參數:
--slave:設置該參數,則新節點以slave的角色加入集羣
--master-id:這個參數須要設置了--slave才能生效,--master-id用來指定新節點的master節點,若是不設置該參數,則會隨機爲節點選擇master節點。

開始添加節點:在10.0.18.145服務器上操做,不過在另外2臺上操做也是能夠的!

#redis-trib.rb add-node 10.0.18.147:7006 10.0.18.145:7000
>>> Adding node 10.0.18.147:7006 to cluster 10.0.18.145:7000
>>> Performing Cluster Check (using node 10.0.18.145:7000)
M: 2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001
   slots: (0 slots) slave
   replicates 2e2f563a1467c2515857d70d762c26b06faabbd4
M: c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005
   slots: (0 slots) slave
   replicates faee6763e5f591d9d63df8d841041255ae7992f3
S: 4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003
   slots: (0 slots) slave
   replicates c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
M: faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002
   slots:5461-10922 (5462 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.
>>> Send CLUSTER MEET to node 10.0.18.147:7006 to make it join the cluster.
[OK] New node added correctly.
根據提示信息能夠看出已經添加OK了,而後查看集羣狀態
#redis-cli -h 10.0.18.145 -p 7000 cluster nodes
5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006 master - 0 1476945360520 0 connected #新添加的節點被分爲master節點,可是沒有slot的,一下子爲其分配slot
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476945356508 2 connected
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476945359516 5 connected 0-5460
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476945357509 6 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 myself,master - 0 0 1 connected 10923-16383
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476945359516 5 connected
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 master - 0 1476945358513 3 connected 5461-10922

注意:新節點如今已經鏈接上了集羣,成爲集羣的一份子,而且能夠對客戶端的命令請求進行轉向了,可是和其餘主節點相比, 新節點還有兩點區別:

a、新節點沒有包含任何數據,由於它沒有包含任何哈希槽.

b、儘管新節點沒有包含任何哈希槽,但它仍然是一個主節點,因此在集羣須要將某個從節點升級爲新的主節點時,這個新節點不會被選中。.

接下來,只要使用redis-trib程序,將集羣中的某些哈希桶移動到新節點裏面 新節點就會成爲真正的主節點了,這裏涉及到一個概念是reshard,這裏簡單介紹一下:

reshard命令能夠在線把集羣的一些slot從集羣原來slot負責節點遷移到新的節點,利用reshard能夠完成集羣的在線橫向擴容和縮容。
reshard的參數不少,下面進行介紹:
reshard         host:port
                --from <arg>
                --to <arg>
                --slots <arg>
                --yes
                --timeout <arg>
                --pipeline <arg>
host:port:這個是必傳參數,用來從一個節點獲取整個集羣信息,至關於獲取集羣信息的入口。
--from <arg>:須要從哪些源節點上遷移slot,可從多個源節點完成遷移,以逗號隔開,傳遞的是節點的node id,還能夠直接傳遞--from all,這樣源節點就是集羣的全部節點,不傳遞該參數的話,則會在遷移過程當中提示用戶輸入。
--to <arg>:slot須要遷移的目的節點的node id,目的節點只能填寫一個,不傳遞該參數的話,則會在遷移過程當中提示用戶輸入。
--slots <arg>:須要遷移的slot數量,不傳遞該參數的話,則會在遷移過程當中提示用戶輸入。
--yes:設置該參數,能夠在打印執行reshard計劃的時候,提示用戶輸入yes確認後再執行reshard。
--timeout <arg>:設置migrate命令的超時時間。
--pipeline <arg>:定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值爲10。

在10.0.18.145上操做以下:

#redis-trib.rb reshard 10.0.18.147:7006   #指定爲哪一個節點分配slot,當時咱們這裏是新添加的節點
………………
>>> Performing Cluster Check (using node 10.0.18.147:7006)
M: 5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006
   slots:  (0 slots) master       #新的7006實例的slot爲0,沒有任何槽位
   0 additional replica(s)
M: faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001
   slots: (0 slots) slave
   replicates 2e2f563a1467c2515857d70d762c26b06faabbd4
S: 37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005
   slots: (0 slots) slave
   replicates faee6763e5f591d9d63df8d841041255ae7992f3
M: c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004
   slots:0-5460 (5460 slots) master
   1 additional replica(s)
S: 4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003
   slots: (0 slots) slave
   replicates c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
[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)?  500     #輸入要給新節點分配的slot數量,
What is the receiving node ID? 5cbec92f52fbe9da7cd643cd34e87055c5358018  #輸入新節點7006實例的node 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: c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b      #輸入從哪個node id 分離出1000個slot,我這裏選擇10.0.18.147:7004 master
Source node #2:done                                           #輸入done
……………………
    Moving slot 487 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 488 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 489 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 490 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 491 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 492 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 493 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 494 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 495 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 496 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 497 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 498 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 499 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
Do you want to proceed with the proposed reshard plan (yes/no)? yes   #輸入yes
…………
Moving slot 492 from 10.0.18.147:7004 to 10.0.18.147:7006: 
Moving slot 493 from 10.0.18.147:7004 to 10.0.18.147:7006: 
Moving slot 494 from 10.0.18.147:7004 to 10.0.18.147:7006: 
Moving slot 495 from 10.0.18.147:7004 to 10.0.18.147:7006: 
Moving slot 496 from 10.0.18.147:7004 to 10.0.18.147:7006: 
Moving slot 497 from 10.0.18.147:7004 to 10.0.18.147:7006: 
Moving slot 498 from 10.0.18.147:7004 to 10.0.18.147:7006: 
Moving slot 499 from 10.0.18.147:7004 to 10.0.18.147:7006:
結束以後,從新查看集羣狀態:
#redis-cli -h 10.0.18.145 -p 7000 cluster nodes
5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006 master - 0 1476946198888 7 connected 0-499    #能夠看到新加入的節點有了0-499個slot
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476946196884 2 connected
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476946197886 5 connected 500-5460 #7004這個節點的500個slot已經被分配走了
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476946199892 6 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 myself,master - 0 0 1 connected 10923-16383
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476946198888 5 connected
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 master - 0 1476946199892 3 connected 5461-10922

以上咱們將10.0.18.147:7006添加到了集羣中,被默認設置爲master,那麼如何將一個新節點添加到一個master節點下面呢,下面來演示一下:

將10.0.18.147 7007 節點做爲slave添加到10.0.18.147 7006 master節點下
#redis-trib.rb add-node --slave --master-id 5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7007 10.0.18.147:7006
>>> Adding node 10.0.18.147:7007 to cluster 10.0.18.147:7006
>>> Performing Cluster Check (using node 10.0.18.147:7006)
M: 5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006
   slots:0-499 (500 slots) master
   0 additional replica(s)
S: b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001
   slots: (0 slots) slave
   replicates 2e2f563a1467c2515857d70d762c26b06faabbd4
M: c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004
   slots:500-5460 (4961 slots) master
   1 additional replica(s)
S: 4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003
   slots: (0 slots) slave
   replicates c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
M: 2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005
   slots: (0 slots) slave
   replicates faee6763e5f591d9d63df8d841041255ae7992f3
M: faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002
   slots:5461-10922 (5462 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.
[ERR] Node 10.0.18.147:7007 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
報錯了,也就是沒有添加成功,網上看到的解決方法:
1)、將須要新增的節點下aof、rdb等本地備份文件刪除;
2)、同時將新Node的集羣配置文件刪除,即:刪除你redis.conf裏面cluster-config-file所對應的文件;
3)、再次添加新節點若是仍是報錯,則登陸新Node執行./redis-cli -h x -p對數據庫進行清除:
127.0.0.1:7001>  flushdb      #清空當前數據庫
我這裏是這樣解決的:
刪除appendonly_7007.aof和nodes_7007.conf文件;而後停掉7007這個redis-server進程;最後重啓7007這個進程
從新執行上面的命令,就OK了,以下:
#redis-trib.rb add-node --slave --master-id 5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7007 10.0.18.147:7006
>>> Adding node 10.0.18.147:7007 to cluster 10.0.18.147:7006
>>> Performing Cluster Check (using node 10.0.18.147:7006)
M: 5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006
   slots:0-499 (500 slots) master
   0 additional replica(s)
S: b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001
   slots: (0 slots) slave
   replicates 2e2f563a1467c2515857d70d762c26b06faabbd4
M: c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004
   slots:500-5460 (4961 slots) master
   1 additional replica(s)
S: 4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003
   slots: (0 slots) slave
   replicates c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
M: 2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005
   slots: (0 slots) slave
   replicates faee6763e5f591d9d63df8d841041255ae7992f3
M: faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002
   slots:5461-10922 (5462 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.
>>> Send CLUSTER MEET to node 10.0.18.147:7007 to make it join the cluster.
Waiting for the cluster to join.
>>> Configure node as replica of 10.0.18.147:7006.
[OK] New node added correctly.
查看集羣信息,以下:
#redis-cli -h 10.0.18.145 -p 7000 cluster nodes
5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006 master - 0 1476951249203 7 connected 0-499
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476951250206 2 connected
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476951250206 5 connected 500-5460
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476951249203 6 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 myself,master - 0 0 1 connected 10923-16383
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476951251208 5 connected
e80b8f454affd7e8149dc5bd4f6f3cf1ef3872a1 10.0.18.147:7007 slave 5cbec92f52fbe9da7cd643cd34e87055c5358018 0 1476951251209 7 connected  #新添加的slave節點
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 master - 0 1476951248200 3 connected 5461-10922
注:在18.146和18.147上查看的集羣節點信息也是同樣的!

二、刪除集羣中的某個節點

若是想縮小集羣中節點的數量,能夠選擇刪除某些節點,可是要刪除slave節點,再刪除master節點。這裏先介紹一下del-node的用法:

del-node 能夠把某個節點從集羣中刪除,del-node只能刪除沒有分配slot的節點,刪除命令傳遞兩個參數:
host:port:從該節點獲取集羣信息。
node_id:  須要刪除的節點id
用法:redis-trib.rb del-node host:port node_id

將10.0.18.147:7007這個slave節點刪除,以下,在10.0.18.146上操做

#./bin/redis-trib.rb del-node 10.0.18.147:7007 e80b8f454affd7e8149dc5bd4f6f3cf1ef3872a1
>>> Removing node e80b8f454affd7e8149dc5bd4f6f3cf1ef3872a1 from cluster 10.0.18.147:7007
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
/usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis/client.rb:121:in `call': ERR unknown command 'shutdown' (Redis::CommandError)
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis.rb:306:in `shutdown'
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis/client.rb:293:in `with_reconnect'
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis.rb:304:in `shutdown'
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis.rb:58:in `synchronize'
        from /usr/lib/ruby/1.8/monitor.rb:242:in `mon_synchronize'
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis.rb:58:in `synchronize'
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis.rb:303:in `shutdown'
        from ./bin/redis-trib.rb:1389:in `delnode_cluster_cmd'
        from ./bin/redis-trib.rb:1695:in `send'
        from ./bin/redis-trib.rb:1695
注:不知道爲啥會拋出這麼多from 信息,不影響刪除slave節點。
查看
#./bin/redis-cli -h 10.0.18.146 -p 7002 cluster nodes
5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006 master - 0 1476955092868 7 connected 0-499
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476955091865 6 connected
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 myself,master - 0 0 3 connected 5461-10922
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476955093871 5 connected 500-5460
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476955094872 5 connected
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476955094872 2 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 master - 0 1476955095874 1 connected 10923-16383
能夠看到10.0.18.147:7007這個slave節點已經刪除掉了!

將10.0.18.147:7006這個master節點刪除,以下:

#./bin/redis-trib.rb del-node 10.0.18.147:7006 5cbec92f52fbe9da7cd643cd34e87055c5358018
>>> Removing node 5cbec92f52fbe9da7cd643cd34e87055c5358018 from cluster 10.0.18.147:7006
[ERR] Node 10.0.18.147:7006 is not empty! Reshard data away and try again.
提示信息告知刪除失敗,由於這個master節點不是空的,有slot存在!因此須要將此節點的slot轉移給其餘master節點

將10.1.18.147:7006這個master節點的slot轉移到10.0.18.147:7004上,以下:

./bin/redis-trib.rb reshard 10.0.18.147:7006   (這個是搞砸的,不要按照這個操做!)
>>> Performing Cluster Check (using node 10.0.18.147:7006)
M: 5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006
   slots:0-499 (500 slots) master   #10.0.18.147:7006節點的slot數量是500
   0 additional replica(s)
S: b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001
   slots: (0 slots) slave
   replicates 2e2f563a1467c2515857d70d762c26b06faabbd4
M: c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004
   slots:500-5460 (4961 slots) master
   1 additional replica(s)
S: 4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003
   slots: (0 slots) slave
   replicates c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
M: 2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005
   slots: (0 slots) slave
   replicates faee6763e5f591d9d63df8d841041255ae7992f3
M: faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002
   slots:5461-10922 (5462 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)? 500  #輸入500
What is the receiving node ID? 5cbec92f52fbe9da7cd643cd34e87055c5358018 #輸入10.0.18.147:7006節點的node 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:c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b    #接收這500個slot的主節點是10.0.18.147:7004
Source node #2:done  #輸入done
………………
    Moving slot 993 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 994 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 995 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 996 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 997 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 998 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
    Moving slot 999 from c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
Do you want to proceed with the proposed reshard plan (yes/no)? yes
………………
Moving slot 996 from 10.0.18.147:7004 to 10.0.18.147:7006: 
Moving slot 997 from 10.0.18.147:7004 to 10.0.18.147:7006: 
Moving slot 998 from 10.0.18.147:7004 to 10.0.18.147:7006: 
Moving slot 999 from 10.0.18.147:7004 to 10.0.18.147:7006: 
搞砸了,原本是想將10.0.18.147:7006的500個slot轉移到10.0.18.147:7004的,結果搞反掉了,入下:
#./bin/redis-cli -h 10.0.18.146 -p 7002 cluster nodes
5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006 master - 0 1476956724238 7 connected 0-999
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476956726241 6 connected
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 myself,master - 0 0 3 connected 5461-10922
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476956724237 5 connected 1000-5460
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476956727243 5 connected
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476956725239 2 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 master - 0 1476956726241 1 connected 10923-16383
請原諒個人失誤!再來一次:
#./bin/redis-trib.rb reshard 10.0.18.147:7006
>>> Performing Cluster Check (using node 10.0.18.147:7006)
M: 5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006
   slots:0-999 (1000 slots) master  #如今18.147:7006節點有1000個slot了
   0 additional replica(s)
S: b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001
   slots: (0 slots) slave
   replicates 2e2f563a1467c2515857d70d762c26b06faabbd4
M: c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003
   slots: (0 slots) slave
   replicates c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b
M: 2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005
   slots: (0 slots) slave
   replicates faee6763e5f591d9d63df8d841041255ae7992f3
M: faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002
   slots:5461-10922 (5462 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)? 1000  #輸入1000
What is the receiving node ID? c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b  #輸入10.0.18.147:7004節點的node id,由於接收這1000個slot的節點是10.0.18.147:7004
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:5cbec92f52fbe9da7cd643cd34e87055c5358018  #輸入10.0.18.147:7006節點的node id,由於是要今後節點轉移slot。
Source node #2:done  #輸入done
…………
    Moving slot 996 from 5cbec92f52fbe9da7cd643cd34e87055c5358018
    Moving slot 997 from 5cbec92f52fbe9da7cd643cd34e87055c5358018
    Moving slot 998 from 5cbec92f52fbe9da7cd643cd34e87055c5358018
    Moving slot 999 from 5cbec92f52fbe9da7cd643cd34e87055c5358018
Do you want to proceed with the proposed reshard plan (yes/no)? yes  #輸入yes
………………
Moving slot 996 from 10.0.18.147:7006 to 10.0.18.147:7004: 
Moving slot 997 from 10.0.18.147:7006 to 10.0.18.147:7004: 
Moving slot 998 from 10.0.18.147:7006 to 10.0.18.147:7004: 
Moving slot 999 from 10.0.18.147:7006 to 10.0.18.147:7004: 
查看集羣信息:
#./bin/redis-cli -h 10.0.18.146 -p 7002 cluster nodes
5cbec92f52fbe9da7cd643cd34e87055c5358018 10.0.18.147:7006 master - 0 1476957466206 7 connected
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476957469212 6 connected
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 myself,master - 0 0 3 connected 5461-10922
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476957467206 8 connected 0-5460
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476957469211 8 connected
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476957468209 2 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 master - 0 1476957470214 1 connected 10923-16383
如今能夠刪除10.0.18.147:7006這個master節點了,以下:
#./bin/redis-trib.rb del-node 10.0.18.147:7006 5cbec92f52fbe9da7cd643cd34e87055c5358018
>>> Removing node 5cbec92f52fbe9da7cd643cd34e87055c5358018 from cluster 10.0.18.147:7006
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
/usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis/client.rb:121:in `call': ERR unknown command 'shutdown' (Redis::CommandError)
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis.rb:306:in `shutdown'
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis/client.rb:293:in `with_reconnect'
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis.rb:304:in `shutdown'
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis.rb:58:in `synchronize'
        from /usr/lib/ruby/1.8/monitor.rb:242:in `mon_synchronize'
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis.rb:58:in `synchronize'
        from /usr/lib/ruby/gems/1.8/gems/redis-3.3.1/lib/redis.rb:303:in `shutdown'
        from ./bin/redis-trib.rb:1389:in `delnode_cluster_cmd'
        from ./bin/redis-trib.rb:1695:in `send'
        from ./bin/redis-trib.rb:1695
刪除以後再次查看節點信息:
#./bin/redis-cli -h 10.0.18.146 -p 7002 cluster nodes
37ea68d5cfd3953bde636656dd2250d5f6a7029d 10.0.18.147:7005 slave faee6763e5f591d9d63df8d841041255ae7992f3 0 1476957619621 6 connected
faee6763e5f591d9d63df8d841041255ae7992f3 10.0.18.146:7002 myself,master - 0 0 3 connected 5461-10922
c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 10.0.18.147:7004 master - 0 1476957618620 8 connected 0-5460
4eeee08df0ee4ee0db34b39bf6922a24edb356d8 10.0.18.146:7003 slave c1ea9a2adaa3f9790ccf29227293c9bafc6efb7b 0 1476957619621 8 connected
b3798ae7f13e4fca57e7a505eca0dae1f19ce4c3 10.0.18.145:7001 slave 2e2f563a1467c2515857d70d762c26b06faabbd4 0 1476957616615 2 connected
2e2f563a1467c2515857d70d762c26b06faabbd4 10.0.18.145:7000 master - 0 1476957618620 1 connected 10923-16383
能夠看到10.0.18.147:7006這個master節點已經不存在了!

參考連接:http://blog.csdn.net/huwei2003/article/details/50973967

不足之處,請多多指出!

相關文章
相關標籤/搜索