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
不足之處,請多多指出!