redis3.2.2單機集羣搭建


本文來自:http://blog.csdn.net/yulei_qq/article/details/51957463

作者:YL_小魚兒

1、下載最新的Redis版本

         本人下載的Redis版本是3.2.1版本,下載之後,解壓,編譯(make); 具體操作可以參考我的博文:Redis 學習筆記1:CentOS 6.7下安裝Redis

         編譯後的redis目錄在 /usr/local/redis-3.2.1

2、新建6個目錄

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 local]# mkdir 7000 7001 7002 7003 7004 7005  
 
 將 /usr/local/redis-3.2.1目錄下的redis文件依次複製到7000~ 7005 目錄當中。
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 local]# cp -rf  redis-3.2.1/*  7001  
  2. [root@itcast01 local]# cp -rf  redis-3.2.1/*  7001  
  3. [root@itcast01 local]# cp -rf  redis-3.2.1/*  7002  
  4. [root@itcast01 local]# cp -rf  redis-3.2.1/*  7003  
  5. [root@itcast01 local]# cp -rf  redis-3.2.1/*  7004  
  6. [root@itcast01 local]# cp -rf  redis-3.2.1/*  7005  

3、配置文件redis.conf 

新建一個文件,命名爲redis.conf ,內容如下:
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. port 7000  
  2. cluster-enabled yes  
  3. cluster-config-file nodes.conf  
  4. cluster-node-timeout 5000  
  5. appendonly yes  
將該配置文件覆蓋到到6個目錄當中,粘貼覆蓋時注意修改port端口,即7000目錄下的是7000,7001下的port=7001,以此類推.....
cluster-node-timeout 是集羣中各節點相互通訊時,允許"失聯"的最大毫秒數,上面的配置爲5秒,如果超過5秒某個節點沒向其它節點彙報成功,認爲該節點掛了。

4、依次啓動各個Redis服務

到各個目錄下的src目錄下,依次執行命令:./redis-serve r    ../redis.conf 
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-server ../redis.conf   


以上是7000的啓動,可以看到連接的端口是7000,其餘目錄的redis 服務連接的端口也是各自配置文件配置的端口.

5、安裝Redis 集羣需要的 Ruby 工具

         雖然步驟4把6個redis server啓動成功了,但是彼此之間是完全獨立的,需要藉助其它工具將其加入cluster,而這個工具就是redis提供的一個名爲redis-trib.rb的ruby腳本, 否則接下來的創建cluster將失敗。
在聯網狀態下安裝Ruby ,依次執行如下命令即可:
      
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# yum install ruby  
  2. [root@itcast01 src]# yum install rubygems  
  3. [root@itcast01 src]# gem install redis  

6、創建Redis cluster集羣

        仍然保持在每個目錄的src子目錄下,運行下面這段shell腳本,cluster就創建成功了,replicas 1的意思,就是每個節點創建1個副本(即:slave),所以最終的結果,就是後面的127.0.0.1:7000~127.0.0.1:7005中,會有3個會指定成master,而其它3個會指定成slave。
[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 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  
注:利用redis-trib創建cluster的操作,只需要一次即可,假設系統關機,把所有6個節點全關閉後,下次重啓後,即自動進入cluster模式,不用再次redis-trib.rb create。
用ps查看redis進程,可以看見每個進程後面添加了cluster字樣

如果想知道哪些端口的節點是master,哪些端口的節點是slave,可以用下面的命令:
[vb] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb check 127.0.0.1:7000  
輸出結果如下:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb  check 127.0.0.1:7000  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7000)  
  3. S: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000  
  4.    slots: (0 slots) slave  
  5.    replicates 88d693578dd0bdaca9e32422565c624790961bc9  
  6. S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004  
  7.    slots: (0 slots) slave  
  8.    replicates 20fbccf06841f7aa699b97bff72ece2f96599236  
  9. S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005  
  10.    slots: (0 slots) slave  
  11.    replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213  
  12. M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002  
  13.    slots:10923-16383 (5461 slots) master  
  14.    1 additional replica(s)  
  15. M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001  
  16.    slots:5461-10922 (5462 slots) master  
  17.    1 additional replica(s)  
  18. M: 88d693578dd0bdaca9e32422565c624790961bc9 127.0.0.1:7003  
  19.    slots:0-5460 (5461 slots) master  
  20.    1 additional replica(s)  
  21. [OK] All nodes agree about slots configuration.  
  22. >>> Check for open slots...  
  23. >>> Check slots coverage...  
  24. [OK] All 16384 slots covered.  
從上面的輸出,可以看出7002、70001、7003 是master,而7000、7004、 7005 是slave ,除了check參數,還有一個常用的參數info.
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb  info  127.0.0.1:7000  
  2. 127.0.0.1:7002 (fbcce8fb...) -> 10 keys | 5461 slots | 1 slaves.  
  3. 127.0.0.1:7001 (20fbccf0...) -> 6 keys | 5462 slots | 1 slaves.  
  4. 127.0.0.1:7003 (88d69357...) -> 6 keys | 5461 slots | 1 slaves.  
  5. [OK] 22 keys in 3 masters.  
它會把所有的master信息輸出,包括這個master上有幾個緩存key,幾個salve ,所有master上的key合計,以及平均每個slot上有多少個key.

若想了解更多redis-trib的使用,可以使用如下參數:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb help  
輸出如下:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb help  
  2. Usage: redis-trib <command> <options> <arguments ...>  
  3.   
  4.   call            host:port command arg arg .. arg  
  5.   del-node        host:port node_id  
  6.   set-timeout     host:port milliseconds  
  7.   rebalance       host:port  
  8.                   --threshold <arg>  
  9.                   --use-empty-masters  
  10.                   --simulate  
  11.                   --auto-weights  
  12.                   --weight <arg>  
  13.                   --pipeline <arg>  
  14.                   --timeout <arg>  
  15.   help            (show this help)  
  16.   reshard         host:port  
  17.                   --slots <arg>  
  18.                   --from <arg>  
  19.                   --to <arg>  
  20.                   --pipeline <arg>  
  21.                   --timeout <arg>  
  22.                   --yes  
  23.   create          host1:port1 ... hostN:portN  
  24.                   --replicas <arg>  
  25.   info            host:port  
  26.   import          host:port  
  27.                   --from <arg>  
  28.                   --copy  
  29.                   --replace  
  30.   fix             host:port  
  31.                   --timeout <arg>  
  32.   add-node        new_host:new_port existing_host:existing_port  
  33.                   --master-id <arg>  
  34.                   --slave  
  35.   check           host:port  
  36.   
  37. For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.  

上面多次出現slot這個詞,下面略做解釋下:

如上圖,redis-cluster把整個集羣的存儲空間劃分爲16384個slot(譯爲:插槽?),當6個節點分爲3主3從時,相當於整個cluster中有3組HA的節點,3個master會平均分攤所有slot,每次向cluster中的key做操作時(比如:讀取/寫入緩存),redis會對key值做CRC32算法處理,得到一個數值,然後再對16384取模,通過餘數判斷該緩存項應該落在哪個slot上,

7、redis-cli 客戶端操作

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-cli -c -h localhost -p 7000  
注意 -c 參數,表示進入cluster集羣模式,隨便添加一個緩存試試。
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-cli -c -h localhost -p 7000  
  2. localhost:7000> set cc 123  
  3. -> Redirected to slot [700] located at 127.0.0.1:7003  
  4. OK  
  5. 127.0.0.1:7003>   
注意第二行的輸出,表示cc這個緩存通過計算後,落在700這個slot,最終定位在7003這個端口對應的節點上 (注:因爲7000是slave,7003是master,只有master才能寫入)如果是在7003上面重複上面的操作時,不會出現上面的操作。

8、FailOver測試

先用redis-cli查看當前的主從情況

[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb  check 127.0.0.1:7000  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7000)  
  3. S: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000  
  4.    slots: (0 slots) slave  
  5.    replicates 88d693578dd0bdaca9e32422565c624790961bc9  
  6. S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004  
  7.    slots: (0 slots) slave  
  8.    replicates 20fbccf06841f7aa699b97bff72ece2f96599236  
  9. S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005  
  10.    slots: (0 slots) slave  
  11.    replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213  
  12. M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002  
  13.    slots:10923-16383 (5461 slots) master  
  14.    1 additional replica(s)  
  15. M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001  
  16.    slots:5461-10922 (5462 slots) master  
  17.    1 additional replica(s)  
  18. M: 88d693578dd0bdaca9e32422565c624790961bc9 127.0.0.1:7003  
  19.    slots:0-5460 (5461 slots) master  
  20.    1 additional replica(s)  
  21. [OK] All nodes agree about slots configuration.  
  22. >>> Check for open slots...  
  23. >>> Check slots coverage...  
  24. [OK] All 16384 slots covered.  
從輸出上看出,7000是7003(88d693578dd0bdaca9e32422565c624790961bc9)的slave  ,現在我們人工把7003的redis進程給kill掉,然後觀察7000的終端輸出:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. 3342:S 21 Jul 09:43:39.831 * Connecting to MASTER 127.0.0.1:7003  
  2. 3342:S 21 Jul 09:43:39.831 * MASTER <-> SLAVE sync started  
  3. 3342:S 21 Jul 09:43:39.831 # Error condition on socket for SYNC: Connection refused  
  4. 3342:S 21 Jul 09:43:40.135 * Marking node 88d693578dd0bdaca9e32422565c624790961bc9 as failing (quorum reached).  
  5. 3342:S 21 Jul 09:43:40.135 # Start of election delayed for 720 milliseconds (rank #0, offset 2241).  
  6. 3342:S 21 Jul 09:43:40.135 # Cluster state changed: fail  
  7. 3342:S 21 Jul 09:43:40.841 * Connecting to MASTER 127.0.0.1:7003  
  8. 3342:S 21 Jul 09:43:40.841 * MASTER <-> SLAVE sync started  
  9. 3342:S 21 Jul 09:43:40.841 # Error condition on socket for SYNC: Connection refused  
  10. 3342:S 21 Jul 09:43:40.942 # Starting a failover election for epoch 10.  
  11. 3342:S 21 Jul 09:43:40.965 # Failover election won: I'm the new master.  
  12. 3342:S 21 Jul 09:43:40.965 # configEpoch set to 10 after successful failover  
  13. 3342:M 21 Jul 09:43:40.965 * Discarding previously cached master state.  
  14. 3342:M 21 Jul 09:43:40.966 # Cluster state changed: ok  
第6行表明由於70003宕機,cluster狀態已經切換到fail狀態 ,第5行表示發起枚舉 , 第11行表示7000端口對應的節點當選爲新的master,用redis-cli check一下:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb  check 127.0.0.1:7000  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7000)  
  3. M: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000  
  4.    slots:0-5460 (5461 slots) master  
  5.    0 additional replica(s)  
  6. S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004  
  7.    slots: (0 slots) slave  
  8.    replicates 20fbccf06841f7aa699b97bff72ece2f96599236  
  9. S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005  
  10.    slots: (0 slots) slave  
  11.    replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213  
  12. M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002  
  13.    slots:10923-16383 (5461 slots) master  
  14.    1 additional replica(s)  
  15. M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001  
  16.    slots:5461-10922 (5462 slots) master  
  17.    1 additional replica(s)  
  18. [OK] All nodes agree about slots configuration.  
  19. >>> Check for open slots...  
  20. >>> Check slots coverage...  

9、cluster擴容

業務規模擴大後,集羣需要擴容.下面演示如何再添加兩個節點 。跟原先一樣,新建兩個目錄7006,7007,將下載的redis文件各複製一份到這兩個目錄當中.
並更改其中的redis-conf文件.
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 local]# mkdir 7006 7007  
  2. [root@itcast01 local]# cp -rf  redis-3.2.1/*  7006  
  3. [root@itcast01 local]# cp -rf  redis-3.2.1/*  7007  
做完這些後,啓動7006,7007這兩個redis節點,此時這兩個新節點與cluster沒有任何關係,可以用下面的命令將7006作爲master添加到cluster中。
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000  
注:第一個參數爲新節點的“”ip:端口“”,第二個參數爲集羣中的任一有效的節點。一切順利的話,輸出如下:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000  
  2. >>> Adding node 127.0.0.1:7006 to cluster 127.0.0.1:7000  
  3. >>> Performing Cluster Check (using node 127.0.0.1:7000)  
  4. M: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000  
  5.    slots:0-5460 (5461 slots) master  
  6.    1 additional replica(s)  
  7. S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004  
  8.    slots: (0 slots) slave  
  9.    replicates 20fbccf06841f7aa699b97bff72ece2f96599236  
  10. S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005  
  11.    slots: (0 slots) slave  
  12.    replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213  
  13. M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002  
  14.    slots:10923-16383 (5461 slots) master  
  15.    1 additional replica(s)  
  16. M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001  
  17.    slots:5461-10922 (5462 slots) master  
  18.    1 additional replica(s)  
  19. S: 88d693578dd0bdaca9e32422565c624790961bc9 127.0.0.1:7003  
  20.    slots: (0 slots) slave  
  21.    replicates 9d81b0624b5080e5304165b07c2ef69a011ec28e  
  22. [OK] All nodes agree about slots configuration.  
  23. >>> Check for open slots...  
  24. >>> Check slots coverage...  
  25. [OK] All 16384 slots covered.  
  26. >>> Send CLUSTER MEET to node 127.0.0.1:7006 to make it join the cluster.  
  27. [OK] New node added correctly.  
我們用redis-tirb check確認下狀態
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]#  ./redis-trib.rb check 127.0.0.1:7000  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7000)  
  3. M: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000  
  4.    slots:0-5460 (5461 slots) master  
  5.    1 additional replica(s)  
  6. S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004  
  7.    slots: (0 slots) slave  
  8.    replicates 20fbccf06841f7aa699b97bff72ece2f96599236  
  9. S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005  
  10.    slots: (0 slots) slave  
  11.    replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213  
  12. M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002  
  13.    slots:10923-16383 (5461 slots) master  
  14.    1 additional replica(s)  
  15. M: 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc 127.0.0.1:7006  
  16.    slots: (0 slots) master  
  17.    0 additional replica(s)  
  18. M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001  
  19.    slots:5461-10922 (5462 slots) master  
  20.    1 additional replica(s)  
  21. S: 88d693578dd0bdaca9e32422565c624790961bc9 127.0.0.1:7003  
  22.    slots: (0 slots) slave  
  23.    replicates 9d81b0624b5080e5304165b07c2ef69a011ec28e  
  24. [OK] All nodes agree about slots configuration.  
  25. >>> Check for open slots...  
  26. >>> Check slots coverage...  
  27. [OK] All 16384 slots covered.  
上面的輸出已經說明7006是新的master節點了,繼續添加新節點。 用下面的命令把7007當成slave加入.
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb add-node --slave --master-id 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc 127.0.0.1:7007 127.0.0.1:7000  
輸出如下:


check 一下:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]#  ./redis-trib.rb check 127.0.0.1:7000  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7000)  
  3. M: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000  
  4.    slots:0-5460 (5461 slots) master  
  5.    1 additional replica(s)  
  6. S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004  
  7.    slots: (0 slots) slave  
  8.    replicates 20fbccf06841f7aa699b97bff72ece2f96599236  
  9. S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005  
  10.    slots: (0 slots) slave  
  11.    replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213  
  12. M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002  
  13.    slots:10923-16383 (5461 slots) master  
  14.    1 additional replica(s)  
  15. S: bf84939e7e6b066d3d9caf7aae1e1b8e7ca2522c 127.0.0.1:7007  
  16.    slots: (0 slots) slave  
  17.    replicates 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc  
  18. M: 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc 127.0.0.1:7006  
  19.    slots: (0 slots) master  
  20.    1 additional replica(s)  
  21. M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001  
  22.    slots:5461-10922 (5462 slots) master  
  23.    1 additional replica(s)  
  24. S: 88d693578dd0bdaca9e32422565c624790961bc9 127.0.0.1:7003  
  25.    slots: (0 slots) slave  
  26.    replicates 9d81b0624b5080e5304165b07c2ef69a011ec28e  
  27. [OK] All nodes agree about slots configuration.  
  28. >>> Check for open slots...  
  29. >>> Check slots coverage...  
  30. [OK] All 16384 slots covered.  
說明7007已經是7006的slave.

10、reshared 重新劃分slot.

增減新的節點之後,問題就來了,16384個slot已經被其它3組節點分完了,新節點沒有slot,沒辦法存放緩存,所以需要將slot重新分佈.
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]#  ./redis-trib.rb info 127.0.0.1:7000  
  2. 127.0.0.1:7000 (9d81b062...) -> 8 keys | 5461 slots | 1 slaves.  
  3. 127.0.0.1:7002 (fbcce8fb...) -> 11 keys | 5461 slots | 1 slaves.  
  4. 127.0.0.1:7006 (8e35ebeb...) -> 0 keys | 0 slots | 1 slaves.  
  5. 127.0.0.1:7001 (20fbccf0...) -> 7 keys | 5462 slots | 1 slaves.  
  6. [OK] 26 keys in 4 masters.  
  7. 0.00 keys per slot on average.  
用下面的命令可以重新分配slot
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb reshard 127.0.0.1:7000  
reshard後面的IP:port,只要是在cluster中的有效節點即可。
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb reshard 127.0.0.1:7000  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7000)  
  3.   
  4. ....  
  5.   
  6. M: 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc 127.0.0.1:7006  
  7.    slots: (0 slots) master  
  8.    1 additional replica(s)  
  9.    ....  
  10.      
  11. >>> Check for open slots...  
  12. >>> Check slots coverage...  
  13. [OK] All 16384 slots covered.  
  14. How many slots do you want to move (from 1 to 16384)? 1000  #這裏輸入要移動多少slot  
  15. What is the receiving node ID? 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc   #這裏輸入目標節點的ID  
  16. Please enter all the source node IDs.  
  17.   Type 'all' to use all the nodes as source nodes for the hash slots.  
  18.   Type 'done' once you entered all the source nodes IDs.  
  19. Source node #1:all   # 將所有node當做源節點  
  20.     Moving slot 6455 from 20fbccf06841f7aa699b97bff72ece2f96599236  
  21.     Moving slot 6456 from 20fbccf06841f7aa699b97bff72ece2f96599236  
  22.     Moving slot 6457 from 20fbccf06841f7aa699b97bff72ece2f96599236  
  23.     Moving slot 6458 from 20fbccf06841f7aa699b97bff72ece2f96599236  
  24.     Moving slot 6459 from 20fbccf06841f7aa699b97bff72ece2f96599236  
  25.     Moving slot 6460 from 20fbccf06841f7aa699b97bff72ece2f96599236  
  26. Do you want to proceed with the proposed reshard plan (yes/no)? yes   #確認執行  
  27.   
  28. ....  
  29. Moving slot 12191 from 127.0.0.1:7002 to 127.0.0.1:7006:   
  30. Moving slot 12192 from 127.0.0.1:7002 to 127.0.0.1:7006:   
  31. Moving slot 12193 from 127.0.0.1:7002 to 127.0.0.1:7006:   
  32. Moving slot 12194 from 127.0.0.1:7002 to 127.0.0.1:7006:   
注:第一個交互詢問,填寫多少slot移動時,要好好想想,如果填成16384,則將所有slot都移動到一個固定節點上,會導致更加不均衡!建議每次移動500~1000,這樣對線上的影響比較小。
reshard可以多次操作,直到達到期望的分佈爲止(注:個人覺得redis的reshard這裏有點麻煩,要移動多少slot需要人工計算,如果能提供一個參數之類,讓16384個slot自動平均分配就好了),調整完成後,可以再看看分佈情況:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]#  ./redis-trib.rb info 127.0.0.1:7000    
  2. 127.0.0.1:7000 (9d81b062...) -> 12 keys | 7005 slots | 1 slaves.  
  3. 127.0.0.1:7002 (fbcce8fb...) -> 8 keys | 4189 slots | 1 slaves.  
  4. 127.0.0.1:7006 (8e35ebeb...) -> 3 keys | 1000 slots | 1 slaves.  
  5. 127.0.0.1:7001 (20fbccf0...) -> 3 keys | 4190 slots | 1 slaves.  

11、刪除節點

有擴容,就有刪除,刪除節點的命令如下:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb del-node 127.0.0.1:7006 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc  
del-node後面的ip:port只要是cluster中有效節點即可,最後一個參數爲目標節點的id
注:只有slave節點和空的master節點可以刪除,如果master非空,先用reshard把上面的slot移動到其它node後再刪除,如果有一組master-slave節點,將master上所有slot移到其它節點,然後將master刪除,剩下的slave會另尋他主,變成其它master的slave。
master非空的話,刪除報如下錯誤:

如下是刪除slave 節點7007 ,輸出如下:
[plain] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. [root@itcast01 src]# ./redis-trib.rb del-node 127.0.0.1:7006 bf84939e7e6b066d3d9caf7aae1e1b8e7ca2522c  
  2. >>> Removing node bf84939e7e6b066d3d9caf7aae1e1b8e7ca2522c from cluster 127.0.0.1:7006  
  3. >>> Sending CLUSTER FORGET messages to the cluster...  
  4. >>> SHUTDOWN the node.  
刪除節點後,也會關閉對應的redis服務.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章