Redis Cluster集羣

Redis Cluster集羣

一、redis-cluster設計

Redis集羣搭建的方式有多種,例如使用zookeeper等,但從redis 3.0之後版本支持redis-cluster集羣,Redis-Cluster採用無中心結構,每個節點保存數據和整個集羣狀態,每個節點都和其他所有 節點連接。其redis-cluster架構圖如下:

其結構特點:

     1、所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。
     2、節點的fail是通過集羣中超過半數的節點檢測失效時才生效。
     3、客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可。
     4、redis-cluster把所有的物理節點映射到[0-16383]slot上(不一定是平均分配),cluster 負責維護node<->slot<->value。

     5、Redis集羣預分好16384個桶,當需要在 Redis 集羣中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中。


   1、redis cluster節點分配


   現在我們是三個主節點分別是:A, B, C 三個節點,它們可以是一臺機器上的三個端口,也可以是三臺不同的服務器。那麼,採用哈希槽 (hash slot)的方式來分配16384個slot 的話,它們三個節點分別承擔的slot 區間是:


      節點A覆蓋0-5460;
      節點B覆蓋5461-10922;
      節點C覆蓋10923-16383.

    

     獲取數據:

      如果存入一個值,按照redis cluster哈希槽的算法: CRC16('key')%16384 = 6782。 那麼就會把這個key 的存儲分配到 B 上了。同樣,當我連接(A,B,C)任何一個節點想獲取'key'這個key時,也會這樣的算法,然後內部跳轉到B節點上獲取數據 

    

     新增一個主節點:

      新增一個節點D,redis cluster的這種做法是從各個節點的前面各拿取一部分slot到D上,我會在接下來的實踐中實驗。大致就會變成這樣:
  

    節點A覆蓋1365-5460
    節點B覆蓋6827-10922
    節點C覆蓋12288-16383
    節點D覆蓋0-1364,5461-6826,10923-12287


     同樣刪除一個節點也是類似,移動完成後就可以刪除這個節點了。


     2、Redis Cluster主從模式

          redis cluster 爲了保證數據的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證集羣不會掛掉。

      上面那個例子裏, 集羣有ABC三個主節點, 如果這3個節點都沒有加入從節點,如果B掛掉了,我們就無法訪問整個集羣了。A和C的slot也無法訪問。

     所以我們在集羣建立的時候,一定要爲每個主節點都添加了從節點, 比如像這樣, 集羣包含主節點A、B、C, 以及從節點A1、B1、C1, 那麼即使B掛掉系統也可以繼續正確工作。

     B1節點替代了B節點,所以Redis集羣將會選擇B1節點作爲新的主節點,集羣將會繼續正確地提供服務。 當B重新開啓後,它就會變成B1的從節點。

    不過需要注意,如果節點B和B1同時掛了,Redis集羣就無法繼續正確地提供服務了。


二、redis集羣的搭建

    集羣中至少應該有奇數個節點,所以至少有三個節點,每個節點至少有一個備份節點,所以下面使用6節點(主節點、備份節點由redis-cluster集羣確定)。

   

     下面使用redis-3.2.0安裝,下載地址   

     1、安裝redis節點指定端口

         解壓redis壓縮包,編譯安裝

         

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-3.2.0]# tar xzf redis-3.2.0.tar.gz  
  2. [root@localhost redis-3.2.0]# cd redis-3.2.0  
  3. [root@localhost redis-3.2.0]# make  
  4. [root@localhost redis01]# make install PREFIX=/usr/andy/redis-cluster  


        在redis-cluster下 修改bin文件夾爲redis01,複製redis.conf配置文件

       

     配置redis的配置文件redis.conf


         daemonize yes #後臺啓動

        port 7001 #修改端口號,從7001到7006

        cluster-enabled yes #開啓cluster,去掉註釋

        cluster-config-file nodes.conf

        cluster-node-timeout 15000

        appendonly yes



        複製六份,修改對應的端口號

        


     2、安裝redis-trib所需的 ruby腳本

          複製redis解壓文件src下的redis-trib.rb文件到redis-cluster目錄

          

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# cp /usr/andy/redis/redis-3.2.0/src/redis-trib.rb ./  


         安裝ruby環境:

          

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# yum install ruby  
  2. [root@localhost redis-cluster]# yum install rubygems  


        安裝redis-trib.rb運行依賴的ruby的包redis-3.2.2.gem,下載

        

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# gem install redis-3.2.2.gem  


     3、啓動所有的redis節點

       可以寫一個命令腳本start-all.sh

       

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. cd redis01  
  2. ./redis-server redis.conf  
  3. cd ..  
  4. cd redis02  
  5. ./redis-server redis.conf  
  6. cd ..  
  7. cd redis03  
  8. ./redis-server redis.conf  
  9. cd ..  
  10. cd redis04  
  11. ./redis-server redis.conf  
  12. cd ..  
  13. cd redis05  
  14. ./redis-server redis.conf  
  15. cd ..  
  16. cd redis06  
  17. ./redis-server redis.conf  
  18. cd ..  


     設置權限啓動

     

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# chmod 777 start-all.sh   
  2. [root@localhost redis-cluster]# ./start-all.sh   


       查看redis進程啓動狀態

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ps -ef | grep redis  
  2.   
  3. root       4547      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7001 [cluster]  
  4. root       4551      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7002 [cluster]  
  5. root       4555      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7003 [cluster]  
  6. root       4559      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7004 [cluster]  
  7. root       4563      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7005 [cluster]  
  8. root       4567      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7006 [cluster]  
  9. root       4840   4421  0 23:26 pts/1    00:00:00 grep --color=auto redis  

   

  可以看到redis的6個節點已經啓動成功

   

    殺死全部的幾點:

     

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# pkill -9 redis  


     4、使用redis-trib.rb創建集羣

      

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006  


       使用create命令 --replicas 1 參數表示爲每個主節點創建一個從節點,其他參數是實例的地址集合。

      

       

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006  
  2. >>> Creating cluster  
  3. >>> Performing hash slots allocation on 6 nodes...  
  4. Using 3 masters:  
  5. 127.0.0.1:7001  
  6. 127.0.0.1:7002  
  7. 127.0.0.1:7003  
  8. Adding replica 127.0.0.1:7004 to 127.0.0.1:7001  
  9. Adding replica 127.0.0.1:7005 to 127.0.0.1:7002  
  10. Adding replica 127.0.0.1:7006 to 127.0.0.1:7003  
  11. M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7001  
  12.    slots:0-5460 (5461 slots) master  
  13. M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7002  
  14.    slots:5461-10922 (5462 slots) master  
  15. M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7003  
  16.    slots:10923-16383 (5461 slots) master  
  17. S: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7004  
  18.    replicates dfd510594da614469a93a0a70767ec9145aefb1a  
  19. S: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7005  
  20.    replicates e02eac35110bbf44c61ff90175e04d55cca097ff  
  21. S: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7006  
  22.    replicates 4385809e6f4952ecb122dbfedbee29109d6bb234  
  23. Can I set the above configuration? (type 'yes' to accept): yes  
  24. >>> Nodes configuration updated  
  25. >>> Assign a different config epoch to each node  
  26. >>> Sending CLUSTER MEET messages to join the cluster  
  27. Waiting for the cluster to join......  
  28. >>> Performing Cluster Check (using node 127.0.0.1:7001)  
  29. M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7001  
  30.    slots:0-5460 (5461 slots) master  
  31. M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7002  
  32.    slots:5461-10922 (5462 slots) master  
  33. M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7003  
  34.    slots:10923-16383 (5461 slots) master  
  35. M: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7004  
  36.    slots: (0 slots) master  
  37.    replicates dfd510594da614469a93a0a70767ec9145aefb1a  
  38. M: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7005  
  39.    slots: (0 slots) master  
  40.    replicates e02eac35110bbf44c61ff90175e04d55cca097ff  
  41. M: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7006  
  42.    slots: (0 slots) master  
  43.    replicates 4385809e6f4952ecb122dbfedbee29109d6bb234  
  44. [OK] All nodes agree about slots configuration.  
  45. >>> Check for open slots...  
  46. >>> Check slots coverage...  
  47. [OK] All 16384 slots covered.  


       上面顯示創建成功,有3個主節點,3個從節點,每個節點都是成功連接狀態。


       3個主節點[M]以及分配的哈希卡槽如下:

  M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7001
       slots:0-5460 (5461 slots) master
  M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7002
       slots:5461-10922 (5462 slots) master
  M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7003
       slots:10923-16383 (5461 slots) master

      

          3個從節點[S]以及附屬的主節點如下:

          S: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7004
             replicates dfd510594da614469a93a0a70767ec9145aefb1a
          S: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7005
             replicates e02eac35110bbf44c61ff90175e04d55cca097ff
          S: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7006
             replicates 4385809e6f4952ecb122dbfedbee29109d6bb234


        以上集羣安裝成功了,如果安裝未成功報如下錯誤
       >>> Creating cluster
       [ERR] Sorry, can't connect to node  ....

          需要安裝最新的ruby源碼,下載

           

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# tar -zxvf ruby-2.3.1.tar.gz   
  2. [root@localhost redis-cluster]# cd    
  3. [root@localhost redis-cluster]# ./configure --prefix=/usr/local/ruby-2.3.1    
  4. [root@localhost redis-cluster]# make && make install       
  5. [root@localhost redis-cluster]#gem install redis    

         還有一種情況是,在VMware做測試的時間(都在一臺服務器時),ip應該使用127.0.0.1,如果使用局域網ip,也會報節點創建失敗。

        


三、redis集羣的測試

     1、測試存取值

         客戶端連接集羣redis-cli需要帶上 -c ,redis-cli -c -p 端口號

     

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis01]# ./redis-cli -c -p 7001  
  2. 127.0.0.1:7001> set name andy  
  3. -> Redirected to slot [5798] located at 127.0.0.1:7002  
  4. OK  
  5. 127.0.0.1:7002> get name  
  6. "andy"  
  7. 127.0.0.1:7002>   


        根據redis-cluster的key值分配,name應該分配到節點7002[5461-10922]上,上面顯示redis cluster自動從7001跳轉到了7002節點。

       我們可以測試一下7006從節點獲取name值

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis06]# ./redis-cli -c -p 7006  
  2. 127.0.0.1:7006> get name  
  3. -> Redirected to slot [5798] located at 127.0.0.1:7002  
  4. "andy"  
  5. 127.0.0.1:7002>   



        7006位7003的從節點,從上面也是自動跳轉至7002獲取值,這也是redis cluster的特點,它是去中心化,每個節點都是對等的,連接哪個節點都可以獲取和設置數據。



四、集羣節點選舉

         現在模擬將7002節點掛掉,按照redis-cluster原理會選舉會將 7002的從節點7005選舉爲主節點。

        

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ps -ef | grep redis  
  2. root       7950      1  0 12:50 ?        00:00:28 ./redis-server 127.0.0.1:7001 [cluster]  
  3. root       7952      1  0 12:50 ?        00:00:29 ./redis-server 127.0.0.1:7002 [cluster]  
  4. root       7956      1  0 12:50 ?        00:00:29 ./redis-server 127.0.0.1:7003 [cluster]  
  5. root       7960      1  0 12:50 ?        00:00:29 ./redis-server 127.0.0.1:7004 [cluster]  
  6. root       7964      1  0 12:50 ?        00:00:29 ./redis-server 127.0.0.1:7005 [cluster]  
  7. root       7966      1  0 12:50 ?        00:00:29 ./redis-server 127.0.0.1:7006 [cluster]  
  8. root      11346  10581  0 14:57 pts/2    00:00:00 grep --color=auto redis  
  9. [root@localhost redis-cluster]# kill 7952  


        在查看集羣中的7002節點

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]#   
  2. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7002  
  3. [ERR] Sorry, can't connect to node 127.0.0.1:7002  
  4. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7005  
  5. >>> Performing Cluster Check (using node 127.0.0.1:7005)  
  6. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  7.    slots:5461-10922 (5462 slots) master  
  8.    0 additional replica(s)  
  9. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  10.    slots: (0 slots) slave  
  11.    replicates dd19221c404fb2fc4da37229de56bab755c76f2b  
  12. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  13.    slots:10923-16383 (5461 slots) master  
  14.    1 additional replica(s)  
  15. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  16.    slots:0-5460 (5461 slots) master  
  17.    1 additional replica(s)  
  18. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  19.    slots: (0 slots) slave  
  20.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  21. [OK] All nodes agree about slots configuration.  
  22. >>> Check for open slots...  
  23. >>> Check slots coverage...  
  24. [OK] All 16384 slots covered.  
  25. [root@localhost redis-cluster]#   


      可以看到集羣連接不了7002節點,而7005有原來的S轉換爲M節點,代替了原來的7002節點。我們可以獲取name值:

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis01]# ./redis-cli -c -p 7001  
  2. 127.0.0.1:7001> get name  
  3. -> Redirected to slot [5798] located at 127.0.0.1:7005  
  4. "andy"  
  5. 127.0.0.1:7005>   
  6. 127.0.0.1:7005>   


   從7001節點連入,自動跳轉到7005節點,並且獲取name值。


    現在我們將7002節點恢復,看是否會自動加入集羣中以及充當的M還是S節點。

      

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# cd redis02  
  2. [root@localhost redis02]# ./redis-server redis.conf   
  3. [root@localhost redis02]#   


     在check一下7002節點

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7002  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7002)  
  3. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  4.    slots: (0 slots) slave  
  5.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  6. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  7.    slots:10923-16383 (5461 slots) master  
  8.    1 additional replica(s)  
  9. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  10.    slots:5461-10922 (5462 slots) master  
  11.    1 additional replica(s)  
  12. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  13.    slots: (0 slots) slave  
  14.    replicates dd19221c404fb2fc4da37229de56bab755c76f2b  
  15. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  16.    slots: (0 slots) slave  
  17.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  18. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  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.  
  25. [root@localhost redis-cluster]#   


    可以看到7002節點變成了a5db243087d8bd423b9285fa8513eddee9bb59a6 7005的從節點。


五、集羣節點添加

   節點新增包括新增主節點、從節點兩種情況。以下分別做一下測試:

    1、新增主節點

       新增一個節點7007作爲主節點修改配置文件

       

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# cp -r  redis01 redis07  
  2. [root@localhost redis-cluster]# cd redis07/  
  3. [root@localhost redis07]# sed -i "s/7001/7007/g" ./redis.conf   


      啓動7007redis服務


 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis07]# ./redis-server redis.conf   
  2. [root@localhost redis07]# netstat -anp | grep 7007  
  3. tcp        0      0 127.0.0.1:17007         0.0.0.0:*               LISTEN      13441/./redis-serve   
  4. tcp        0      0 127.0.0.1:7007          0.0.0.0:*               LISTEN      13441/./redis-serve   
  5. [root@localhost redis07]#   


  上面可以看到,7007已經啓動,現在加入集羣中。添加使用redis-trib.rb的add-node命令


 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. ./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7002  


    add-node是加入集羣節點,127.0.0.1:7007爲要加入的節點,127.0.0.1:7002 表示加入的集羣的一個節點,用來辨識是哪個集羣,理論上那個集羣的節點都可以。

    執行以下add-node

      

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7002  
  2. >>> Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7002  
  3. >>> Performing Cluster Check (using node 127.0.0.1:7002)  
  4. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  5.    slots: (0 slots) slave  
  6.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  7. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  8.    slots:10923-16383 (5461 slots) master  
  9.    1 additional replica(s)  
  10. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  11.    slots:5461-10922 (5462 slots) master  
  12.    1 additional replica(s)  
  13. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  14.    slots: (0 slots) slave  
  15.    replicates dd19221c404fb2fc4da37229de56bab755c76f2b  
  16. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  17.    slots: (0 slots) slave  
  18.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  19. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  20.    slots:0-5460 (5461 slots) master  
  21.    1 additional replica(s)  
  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:7007 to make it join the cluster.  
  27. [OK] New node added correctly.  
  28. [root@localhost redis-cluster]#   


     可以看到7007加入這個Cluster,併成爲一個新的節點。

     可以check以下7007節點狀態

      

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7007  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7007)  
  3. M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007  
  4.    slots: (0 slots) master  
  5.    0 additional replica(s)  
  6. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  7.    slots: (0 slots) slave  
  8.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  9. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  10.    slots:0-5460 (5461 slots) master  
  11.    1 additional replica(s)  
  12. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  13.    slots:10923-16383 (5461 slots) master  
  14.    1 additional replica(s)  
  15. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  16.    slots: (0 slots) slave  
  17.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  18. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  19.    slots:5461-10922 (5462 slots) master  
  20.    1 additional replica(s)  
  21. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  22.    slots: (0 slots) slave  
  23.    replicates dd19221c404fb2fc4da37229de56bab755c76f2b  
  24. [OK] All nodes agree about slots configuration.  
  25. >>> Check for open slots...  
  26. >>> Check slots coverage...  
  27. [OK] All 16384 slots covered.  
  28. [root@localhost redis-cluster]#   


  M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007
   slots: (0 slots) master
   0 additional replica(s)

  上面信息可以看到有4個M節點,3個S節點,7007成爲了M主節點,它沒有附屬的從節點,而且Cluster並未給7007分配哈希卡槽(0 slots)。

    

   可以從客戶端連接集羣查看一下,集羣節點的連接情況

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# cd redis07/  
  2. [root@localhost redis07]# ./redis-cli -c -p 7007  
  3. 127.0.0.1:7007> cluster nodes  
  4. 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006 slave f9886c71e98a53270f7fda961e1c5f730382d48f 0 1462955393326 3 connected  
  5. dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001 master - 0 1462955388247 1 connected 0-5460  
  6. ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007 myself,master - 0 0 0 connected  
  7. f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003 master - 0 1462955390270 3 connected 10923-16383  
  8. 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002 slave a5db243087d8bd423b9285fa8513eddee9bb59a6 0 1462955394334 7 connected  
  9. a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005 master - 0 1462955392309 7 connected 5461-10922  
  10. 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004 slave dd19221c404fb2fc4da37229de56bab755c76f2b 0 1462955389663 1 connected  
  11. 127.0.0.1:7007>   


     redis-cluster在新增節點時並未分配卡槽,需要我們手動對集羣進行重新分片遷移數據,需要重新分片命令 reshard

    

              redis-trib.rb reshard 127.0.0.1:7005


     這個命令是用來遷移slot節點的,後面的127.0.0.1:7005是表示是哪個集羣,端口填[7000-7007]都可以,執行結果如下:

    

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb reshard 127.0.0.1:7005  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7005)  
  3. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  4.    slots:5461-10922 (5462 slots) master  
  5.    1 additional replica(s)  
  6. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  7.    slots: (0 slots) slave  
  8.    replicates dd19221c404fb2fc4da37229de56bab755c76f2b  
  9. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  10.    slots:10923-16383 (5461 slots) master  
  11.    1 additional replica(s)  
  12. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  13.    slots: (0 slots) slave  
  14.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  15. M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007  
  16.    slots: (0 slots) master  
  17.    0 additional replica(s)  
  18. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  19.    slots:0-5460 (5461 slots) master  
  20.    1 additional replica(s)  
  21. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  22.    slots: (0 slots) slave  
  23.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  24. [OK] All nodes agree about slots configuration.  
  25. >>> Check for open slots...  
  26. >>> Check slots coverage...  
  27. [OK] All 16384 slots covered.  
  28. How many slots do you want to move (from 1 to 16384)?   


      它提示我們需要遷移多少slot到7007上,我們平分16384個哈希槽給4個節點:16384/4 = 4096,我們需要移動4096個槽點到7007上。

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [OK] All 16384 slots covered.  
  2. How many slots do you want to move (from 1 to 16384)? 4096  
  3. What is the receiving node ID?   


     需要輸入7007的節點id,ee3efb90e5ac0725f15238a64fc60a18a71205d7

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. Please enter all the source node IDs.  
  2.   Type 'all' to use all the nodes as source nodes for the hash slots.  
  3.   Type 'done' once you entered all the source nodes IDs.  
  4. Source node #1:  


      redis-trib 會向你詢問重新分片的源節點(source node),即,要從特點的哪個節點中取出 4096 個哈希槽,還是從全部節點提取4096個哈希槽, 並將這些槽移動到7007節點上面。

     如果我們不打算從特定的節點上取出指定數量的哈希槽,那麼可以向redis-trib輸入 all,這樣的話, 集羣中的所有主節點都會成爲源節點,redis-trib從各個源節點中各取出一部分哈希槽,湊夠4096個,然後移動到7007節點上:

     

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. Source node #1:all  


    然後開始從別的主節點遷移哈希槽,並且確認。

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1.     Moving slot 1343 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  2.     Moving slot 1344 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  3.     Moving slot 1345 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  4.     Moving slot 1346 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  5.     Moving slot 1347 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  6.     Moving slot 1348 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  7.     Moving slot 1349 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  8.     Moving slot 1350 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  9.     Moving slot 1351 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  10.     Moving slot 1352 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  11.     Moving slot 1353 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  12.     Moving slot 1354 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  13.     Moving slot 1355 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  14.     Moving slot 1356 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  15.     Moving slot 1357 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  16.     Moving slot 1358 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  17.     Moving slot 1359 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  18.     Moving slot 1360 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  19.     Moving slot 1361 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  20.     Moving slot 1362 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  21.     Moving slot 1363 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  22.     Moving slot 1364 from dd19221c404fb2fc4da37229de56bab755c76f2b  
  23. Do you want to proceed with the proposed reshard plan (yes/no)? yes  


     確認之後,redis-trib就開始執行分片操作,將哈希槽一個一個從源主節點移動到7007目標主節點。

     重新分片結束後我們可以check以下節點的分配情況。

     

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7001  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7001)  
  3. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  4.    slots:1365-5460 (4096 slots) master  
  5.    1 additional replica(s)  
  6. M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007  
  7.    slots:0-1364,5461-6826,10923-12287 (4096 slots) master  
  8.    0 additional replica(s)  
  9. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  10.    slots:6827-10922 (4096 slots) master  
  11.    1 additional replica(s)  
  12. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  13.    slots: (0 slots) slave  
  14.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  15. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  16.    slots:12288-16383 (4096 slots) master  
  17.    1 additional replica(s)  
  18. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  19.    slots: (0 slots) slave  
  20.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  21. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  22.    slots: (0 slots) slave  
  23.    replicates dd19221c404fb2fc4da37229de56bab755c76f2b  
  24. [OK] All nodes agree about slots configuration.  
  25. >>> Check for open slots...  
  26. >>> Check slots coverage...  
  27. [OK] All 16384 slots covered.  
  28. [root@localhost redis-cluster]#   


   slots:0-1364,5461-6826,10923-12287 (4096 slots) master

   可以看到7007節點分片的哈希槽片不是連續的,間隔的移動。

   

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# cd redis07/  
  2. [root@localhost redis07]# ./redis-cli -c 7007  
  3. Could not connect to Redis at 127.0.0.1:6379: Connection refused  
  4. [root@localhost redis07]# ./redis-cli -c -p 7007  
  5. 127.0.0.1:7007> keys *  
  6. 1) "name"  
  7. 2) "age"  
  8. 127.0.0.1:7007>   
  9. 127.0.0.1:7007>   


    可以看到將7001的age[741]和name[5798]移動到7007節點上,

    主節點7007添加成功。


    2、新增從節點

       新增一個節點7008節點,使用add-node --slave命令。

       

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# cp -r redis01/ redis08  
  2. [root@localhost redis-cluster]# cd redis08/  
  3. [root@localhost redis08]# sed -i "s/7001/7008/g" ./redis.conf  
  4. [root@localhost redis08]# ./redis-server redis.conf   


   redis-trib增加從節點的命令爲:

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. ./redis-trib.rb add-node --slave --master-id $[nodeid] 127.0.0.1:7008 127.0.0.1:7000  

 

    nodeid爲要加到master主節點的node id,127.0.0.1:7008爲新增的從節點,127.0.0.1:7000爲集羣的一個節點(集羣的任意節點都行),用來辨識是哪個集羣;如果沒有給定那個主節點--master-id的話,redis-trib將會將新增的從節點隨機到從節點較少的主節點上。


    現在我們添加一下7008,看是否會自動加到沒有從節點的7007主節點上。

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb add-node --slave 127.0.0.1:7008 127.0.0.1:7001>>> Adding node 127.0.0.1:7008 to cluster 127.0.0.1:7001  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7001)  
  3. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  4.    slots:1365-5460 (4096 slots) master  
  5.    1 additional replica(s)  
  6. M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007  
  7.    slots:0-1364,5461-6826,10923-12287 (4096 slots) master  
  8.    0 additional replica(s)  
  9. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  10.    slots:6827-10922 (4096 slots) master  
  11.    1 additional replica(s)  
  12. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  13.    slots: (0 slots) slave  
  14.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  15. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  16.    slots:12288-16383 (4096 slots) master  
  17.    1 additional replica(s)  
  18. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  19.    slots: (0 slots) slave  
  20.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  21. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  22.    slots: (0 slots) slave  
  23.    replicates dd19221c404fb2fc4da37229de56bab755c76f2b  
  24. [OK] All nodes agree about slots configuration.  
  25. >>> Check for open slots...  
  26. >>> Check slots coverage...  
  27. [OK] All 16384 slots covered.  
  28. Automatically selected master 127.0.0.1:7007  
  29. >>> Send CLUSTER MEET to node 127.0.0.1:7008 to make it join the cluster.  
  30. Waiting for the cluster to join.  
  31. >>> Configure node as replica of 127.0.0.1:7007.  
  32. [OK] New node added correctly.  
  33. [root@localhost redis-cluster]#   


     可以看到自動選擇了127.0.0.1:7007爲master主節點,並且添加成功。

     可以check一下7008:

      

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7008  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7008)  
  3. S: 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5 127.0.0.1:7008  
  4.    slots: (0 slots) slave  
  5.    replicates ee3efb90e5ac0725f15238a64fc60a18a71205d7  
  6. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  7.    slots:6827-10922 (4096 slots) master  
  8.    1 additional replica(s)  
  9. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  10.    slots:1365-5460 (4096 slots) master  
  11.    1 additional replica(s)  
  12. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  13.    slots: (0 slots) slave  
  14.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  15. M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007  
  16.    slots:0-1364,5461-6826,10923-12287 (4096 slots) master  
  17.    1 additional replica(s)  
  18. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  19.    slots: (0 slots) slave  
  20.    replicates dd19221c404fb2fc4da37229de56bab755c76f2b  
  21. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  22.    slots:12288-16383 (4096 slots) master  
  23.    1 additional replica(s)  
  24. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  25.    slots: (0 slots) slave  
  26.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  27. [OK] All nodes agree about slots configuration.  
  28. >>> Check for open slots...  
  29. >>> Check slots coverage...  
  30. [OK] All 16384 slots covered.  
  31. [root@localhost redis-cluster]#   


       可以看到7008作爲了7007的從節點。

        

       再測試一下指定主節點添加從節點,給7007增加7009從節點。

        

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# cp -r redis01/ redis09  
  2. [root@localhost redis-cluster]# cd redis09  
  3. [root@localhost redis09]# sed -i "s/7001/7009/g" ./redis.conf  
  4. [root@localhost redis09]# ./redis-server redis.conf   


       添加7007主節點上

       

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb add-node --slave --master-id ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7009 127.0.0.1:7001  
  2. >>> Adding node 127.0.0.1:7009 to cluster 127.0.0.1:7001  
  3. >>> Performing Cluster Check (using node 127.0.0.1:7001)  
  4. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  5.    slots:1365-5460 (4096 slots) master  
  6.    1 additional replica(s)  
  7. S: 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5 127.0.0.1:7008  
  8.    slots: (0 slots) slave  
  9.    replicates ee3efb90e5ac0725f15238a64fc60a18a71205d7  
  10. M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007  
  11.    slots:0-1364,5461-6826,10923-12287 (4096 slots) master  
  12.    1 additional replica(s)  
  13. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  14.    slots:6827-10922 (4096 slots) master  
  15.    1 additional replica(s)  
  16. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  17.    slots: (0 slots) slave  
  18.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  19. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  20.    slots:12288-16383 (4096 slots) master  
  21.    1 additional replica(s)  
  22. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  23.    slots: (0 slots) slave  
  24.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  25. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  26.    slots: (0 slots) slave  
  27.    replicates dd19221c404fb2fc4da37229de56bab755c76f2b  
  28. [OK] All nodes agree about slots configuration.  
  29. >>> Check for open slots...  
  30. >>> Check slots coverage...  
  31. [OK] All 16384 slots covered.  
  32. >>> Send CLUSTER MEET to node 127.0.0.1:7009 to make it join the cluster.  
  33. Waiting for the cluster to join.  
  34. >>> Configure node as replica of 127.0.0.1:7007.  
  35. [OK] New node added correctly.  
  36. [root@localhost redis-cluster]#   


     顯示從節點7009節點添加到7007主節點,可以看一下7007的從節點,如下:

 

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# cd ./redis07  
  2. [root@localhost redis07]# ./redis-cli -c -p 7007 cluster nodes | grep ee3efb90e5ac0725f15238a64fc60a18a71205d7   
  3. 1f51443ede952b98724fea2a12f61fe710ab6cb1 127.0.0.1:7009 slave ee3efb90e5ac0725f15238a64fc60a18a71205d7 0 1462962710266 8 connected  
  4. ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007 myself,master - 0 0 8 connected 0-1364 5461-6826 10923-12287  
  5. 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5 127.0.0.1:7008 slave ee3efb90e5ac0725f15238a64fc60a18a71205d7 0 1462962711607 8 connected  
  6. [root@localhost redis07]#   


     maser 7007有2個slave 7008,7009。


     我們測試一下7007節點掛掉,看7008和7009那個成爲主節點。

   

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ps -ef | grep redis  
  2. root       7950      1  0 12:50 ?        00:02:05 ./redis-server 127.0.0.1:7001 [cluster]  
  3. root       7956      1  0 12:50 ?        00:02:11 ./redis-server 127.0.0.1:7003 [cluster]  
  4. root       7960      1  0 12:50 ?        00:01:47 ./redis-server 127.0.0.1:7004 [cluster]  
  5. root       7964      1  0 12:50 ?        00:02:07 ./redis-server 127.0.0.1:7005 [cluster]  
  6. root       7966      1  0 12:50 ?        00:01:46 ./redis-server 127.0.0.1:7006 [cluster]  
  7. root      12070      1  0 15:14 ?        00:01:08 ./redis-server 127.0.0.1:7002 [cluster]  
  8. root      13441      1  0 16:09 ?        00:01:25 ./redis-server 127.0.0.1:7007 [cluster]  
  9. root      15939      1  0 17:41 ?        00:00:20 ./redis-server 127.0.0.1:7008 [cluster]  
  10. root      16623      1  0 18:07 ?        00:00:10 ./redis-server 127.0.0.1:7009 [cluster]  
  11. root      17295  10581  0 18:37 pts/2    00:00:00 grep --color=auto redis  
  12. [root@localhost redis-cluster]# kill -9 13441  
  13. [root@localhost redis-cluster]# cd ./redis08  
  14. [root@localhost redis08]# ./redis-cli -c -p 7008  
  15. 127.0.0.1:7008> get name  
  16. -> Redirected to slot [5798] located at 127.0.0.1:7009  
  17. "andy"  
  18. 127.0.0.1:7009> cluster nodes  
  19. ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007 master,fail - 1462963082317 1462963080194 8 disconnected  
  20. 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004 slave dd19221c404fb2fc4da37229de56bab755c76f2b 0 1462963170968 1 connected  
  21. f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003 master - 0 1462963168525 3 connected 12288-16383  
  22. dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001 master - 0 1462963164466 1 connected 1365-5460  
  23. 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5 127.0.0.1:7008 slave 1f51443ede952b98724fea2a12f61fe710ab6cb1 0 1462963167508 9 connected  
  24. 1f51443ede952b98724fea2a12f61fe710ab6cb1 127.0.0.1:7009 myself,master - 0 0 9 connected 0-1364 5461-6826 10923-12287  
  25. 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002 slave a5db243087d8bd423b9285fa8513eddee9bb59a6 0 1462963170564 7 connected  
  26. 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006 slave f9886c71e98a53270f7fda961e1c5f730382d48f 0 1462963167915 3 connected  
  27. a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005 master - 0 1462963169538 7 connected 6827-10922  
  28. 127.0.0.1:7009>   


      可以看到7009代替7007成了主節點。

       重啓7007之後,會自動變成7009的從節點。

       

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# cd redis07  
  2. [root@localhost redis07]# ./redis-server redis.conf   
  3. [root@localhost redis07]# cd ../  
  4. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7007  
  5. >>> Performing Cluster Check (using node 127.0.0.1:7007)  
  6. S: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007  
  7.    slots: (0 slots) slave  
  8.    replicates 1f51443ede952b98724fea2a12f61fe710ab6cb1  
  9. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  10.    slots: (0 slots) slave  
  11.    replicates dd19221c404fb2fc4da37229de56bab755c76f2b  
  12. M: 1f51443ede952b98724fea2a12f61fe710ab6cb1 127.0.0.1:7009  
  13.    slots:0-1364,5461-6826,10923-12287 (4096 slots) master  
  14.    2 additional replica(s)  
  15. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  16.    slots: (0 slots) slave  
  17.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  18. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  19.    slots:1365-5460 (4096 slots) master  
  20.    1 additional replica(s)  
  21. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  22.    slots:6827-10922 (4096 slots) master  
  23.    1 additional replica(s)  
  24. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  25.    slots: (0 slots) slave  
  26.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  27. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  28.    slots:12288-16383 (4096 slots) master  
  29.    1 additional replica(s)  
  30. S: 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5 127.0.0.1:7008  
  31.    slots: (0 slots) slave  
  32.    replicates 1f51443ede952b98724fea2a12f61fe710ab6cb1  
  33. [OK] All nodes agree about slots configuration.  
  34. >>> Check for open slots...  
  35. >>> Check slots coverage...  
  36. [OK] All 16384 slots covered.  
  37. [root@localhost redis-cluster]#   


    驗證了之前的測試。


六、節點的移除

   和節點添加一樣,移除節點也有移除主節點,從節點。

   1、移除主節點

       移除節點使用redis-trib的del-node命令,

        

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. redis-trib del-node 127.0.0.1:7002  ${node-id}  

 

    127.0.0.1:7002位集羣節點,node-id爲要刪除的主節點。 和添加節點不同,移除節點node-id是必需的,測試刪除7001主節點:

   

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb del-node 127.0.0.1:7001 <span style="font-size: 14px;">dd19221c404fb2fc4da37229de56bab755c76f2b</span>  
  2. >>> Removing node <span style="font-size: 14px;">dd19221c404fb2fc4da37229de56bab755c76f2b</span> from cluster 127.0.0.1:7002  
  3. [ERR] Node 127.0.0.1:7001 is not empty! Reshard data away and try again.  
  4. [root@localhost redis-cluster]#   


  redis cluster提示7001已經有數據了,不能夠被刪除,需要將他的數據轉移出去,也就是和新增主節點一樣需重新分片。

        

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb reshard 127.0.0.1:7002  


  執行以後會提示我們移除的大小,因爲7001佔用了4096個槽點

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. >>> Check for open slots...  
  2. >>> Check slots coverage...  
  3. [OK] All 16384 slots covered.  
  4. How many slots do you want to move (from 1 to 16384)?   


  輸入4096

  提示移動的node id,填寫7009的node id。

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. How many slots do you want to move (from 1 to 16384)? 4096  
  2. What is the receiving node ID?   

   

   需要移動到全部主節點上還是單個主節點

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. Please enter all the source node IDs.  
  2.   Type 'all' to use all the nodes as source nodes for the hash slots.  
  3.   Type 'done' once you entered all the source nodes IDs.  
  4. Source node #1:  


   將4096個槽點移動到7009上,填寫7001的node id :dd19221c404fb2fc4da37229de56bab755c76f2b

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. Source node #1:dd19221c404fb2fc4da37229de56bab755c76f2b  
  2. Source node #2:done  
  3. Do you want to proceed with the proposed reshard plan (yes/no)? yes  


   確認之後會一個一個將7001的卡槽移到到7009上。

   

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7009  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7009)  
  3. M: 1f51443ede952b98724fea2a12f61fe710ab6cb1 127.0.0.1:7009  
  4.    slots:0-6826,10923-12287 (8192 slots) master  
  5.    3 additional replica(s)  
  6. S: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007  
  7.    slots: (0 slots) slave  
  8.    replicates 1f51443ede952b98724fea2a12f61fe710ab6cb1  
  9. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  10.    slots: (0 slots) slave  
  11.    replicates 1f51443ede952b98724fea2a12f61fe710ab6cb1  
  12. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  13.    slots:12288-16383 (4096 slots) master  
  14.    1 additional replica(s)  
  15. M: dd19221c404fb2fc4da37229de56bab755c76f2b 127.0.0.1:7001  
  16.    slots: (0 slots) master  
  17.    0 additional replica(s)  
  18. S: 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5 127.0.0.1:7008  
  19.    slots: (0 slots) slave  
  20.    replicates 1f51443ede952b98724fea2a12f61fe710ab6cb1  
  21. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  22.    slots: (0 slots) slave  
  23.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  24. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  25.    slots: (0 slots) slave  
  26.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  27. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  28.    slots:6827-10922 (4096 slots) master  
  29.    1 additional replica(s)  
  30. [OK] All nodes agree about slots configuration.  
  31. >>> Check for open slots...  
  32. >>> Check slots coverage...  
  33. [OK] All 16384 slots covered.  
  34. [root@localhost redis-cluster]#   


     可以看到7001有0個卡槽,而7009有8192個卡槽。


     在執行移除操作

     

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb del-node 127.0.0.1:7002 dd19221c404fb2fc4da37229de56bab755c76f2b  
  2. >>> Removing node dd19221c404fb2fc4da37229de56bab755c76f2b from cluster 127.0.0.1:7002  
  3. >>> Sending CLUSTER FORGET messages to the cluster...  
  4. >>> SHUTDOWN the node.  
  5. [root@localhost redis-cluster]#   


    已經刪除了7001節點。

  

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7001  
  2. [ERR] Sorry, can't connect to node 127.0.0.1:7001  
  3. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7009  
  4. >>> Performing Cluster Check (using node 127.0.0.1:7009)  
  5. M: 1f51443ede952b98724fea2a12f61fe710ab6cb1 127.0.0.1:7009  
  6.    slots:0-6826,10923-12287 (8192 slots) master  
  7.    3 additional replica(s)  
  8. S: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007  
  9.    slots: (0 slots) slave  
  10.    replicates 1f51443ede952b98724fea2a12f61fe710ab6cb1  
  11. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  12.    slots: (0 slots) slave  
  13.    replicates 1f51443ede952b98724fea2a12f61fe710ab6cb1  
  14. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  15.    slots:12288-16383 (4096 slots) master  
  16.    1 additional replica(s)  
  17. S: 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5 127.0.0.1:7008  
  18.    slots: (0 slots) slave  
  19.    replicates 1f51443ede952b98724fea2a12f61fe710ab6cb1  
  20. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  21.    slots: (0 slots) slave  
  22.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  23. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  24.    slots: (0 slots) slave  
  25.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  26. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  27.    slots:6827-10922 (4096 slots) master  
  28.    1 additional replica(s)  
  29. [OK] All nodes agree about slots configuration.  
  30. >>> Check for open slots...  
  31. >>> Check slots coverage...  
  32. [OK] All 16384 slots covered.  
  33. [root@localhost redis-cluster]#   


  可以看到7001已經連接不了;而7001的從節點7004自動分配到了7009主節點中,7009現在3個從節點。


 2、移除從節點

     比如刪除7009的7008節點:

      

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb del-node 127.0.0.1:7009 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5  
  2. >>> Removing node 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5 from cluster 127.0.0.1:7009  
  3. >>> Sending CLUSTER FORGET messages to the cluster...  
  4. >>> SHUTDOWN the node.  
  5. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7008  
  6. [ERR] Sorry, can't connect to node 127.0.0.1:7008  
  7. [root@localhost redis-cluster]#   


     刪除從節點比較方便,現在redis-cluster中有3個主節點,4個從節點,如下:

[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. [root@localhost redis-cluster]# ./redis-trib.rb check 127.0.0.1:7009  
  2. >>> Performing Cluster Check (using node 127.0.0.1:7009)  
  3. M: 1f51443ede952b98724fea2a12f61fe710ab6cb1 127.0.0.1:7009  
  4.    slots:0-6826,10923-12287 (8192 slots) master  
  5.    2 additional replica(s)  
  6. S: ee3efb90e5ac0725f15238a64fc60a18a71205d7 127.0.0.1:7007  
  7.    slots: (0 slots) slave  
  8.    replicates 1f51443ede952b98724fea2a12f61fe710ab6cb1  
  9. S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 127.0.0.1:7004  
  10.    slots: (0 slots) slave  
  11.    replicates 1f51443ede952b98724fea2a12f61fe710ab6cb1  
  12. M: f9886c71e98a53270f7fda961e1c5f730382d48f 127.0.0.1:7003  
  13.    slots:12288-16383 (4096 slots) master  
  14.    1 additional replica(s)  
  15. S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 127.0.0.1:7002  
  16.    slots: (0 slots) slave  
  17.    replicates a5db243087d8bd423b9285fa8513eddee9bb59a6  
  18. S: 8bb3ede48319b46d0015440a91ab277da9353c8b 127.0.0.1:7006  
  19.    slots: (0 slots) slave  
  20.    replicates f9886c71e98a53270f7fda961e1c5f730382d48f  
  21. M: a5db243087d8bd423b9285fa8513eddee9bb59a6 127.0.0.1:7005  
  22.    slots:6827-10922 (4096 slots) master  
  23.    1 additional replica(s)  
  24. [OK] All nodes agree about slots configuration.  
  25. >>> Check for open slots...  
  26. >>> Check slots coverage...  
  27. [OK] All 16384 slots covered.  
  28. [root@localhost redis-cluster]#   


   ok,測試到這兒吧。

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