1. 程式人生 > >Redis叢集增加節點和刪除節點

Redis叢集增加節點和刪除節點

  本文主要是承接上一篇文章Redis叢集的離線安裝成功以後,我們如何進行給叢集增加新的主從節點(叢集擴容)以及如何從叢集中刪除節點(叢集縮容),也就是叢集的伸縮,叢集伸縮的原理是控制虛擬槽和資料在節點之間進行移動,通過實際操作來整理一下叢集的伸縮。
  上篇文章中搭建好的叢集為三主三從,埠號為7000、7001、7002、7003、7004、7005。

  檢視叢集啟動情況:ps -ef | grep redis 

檢視叢集的slots分配情況以及節點之間的主從關係:

  首先登陸節點7000:redis-cli -p 7000 -h 192.168.182.132 -c   //注意不要丟了-c

  cluster nodes 檢視叢集節點資訊

  在本例中我們先增加兩個節點:主節點7006和從節點7007,並給7006分配4096個slots,設定7007為7006的從節點,然後再將這兩個節點從叢集中刪除,一定要先刪除主節點,再刪除從節點,要不然故障轉移會生效。

  一、叢集的擴容
  1.準備新的節點

    在叢集目錄redis_cluster目錄下增加redis7006和redis7007目錄

    mkdir  redis7006

    mkdir redis7007

    增加完成後的目錄

   複製埠7000的redis.conf配置檔案到redis7006和redis7007目錄下,並修改配置檔案中的埠為對應目錄的埠號。

  例如redis7006下的redis.conf檔案的內容為:

port 7006
bind 192.168.182.132  //本機IP
daemonize yes    //設定為後臺執行
pidfile /var/run/redis-7006.pid
cluster-enabled yes  //開啟叢集
cluster-config-file node-7006.conf
cluster-node-timeout 15000
appendonly yes

  準備完成後,啟動兩個新的redis節點:

redis-server  redis7006/redis.conf

redis-server  redis7007/redis.conf

ps -ef | grep  redis   //檢視新的redis節點是否啟動成功

  啟動以後登入7006檢視節點情況:

  

redis-cli -p 7006 -h 192.168.182.132 -c

cluster nodes

 

  2.新增主節點

  (1)向叢集中新增節點7006,注意一定要保證節點裡面沒有新增過任何資料,不然新增會報錯。

 cd /usr/local/redis/redis/src

./redis-trib.rb add-node 192.168.182.132:7006  192.168.182.132:7000
 //第一次節點為新增的節點  第二個節點為叢集中的節點

  新增成功:

    可以看到使用addnode命令來新增節點,第一個引數是新節點的地址,第二個引數是任意一個已經存在的節點的IP和埠. 我們可以看到新的節點已經新增到叢集中:

  新節點7006現在已經連線上了叢集, 成為叢集的一份子, 並且可以對客戶端的命令請求進行轉向了, 但是和其他主節點相比, 新節點還有兩點區別:

  • 新節點沒有包含任何資料, 因為它沒有包含任何雜湊槽.
  • 儘管新節點沒有包含任何雜湊槽, 但它仍然是一個主節點, 所以在叢集需要將某個從節點升級為新的主節點時, 這個新節點不會被選中。

    接下來, 只要使用 redis-trib 程式, 將叢集中的某些雜湊桶移動到新節點裡面, 新節點就會成為真正的主節點了。

    (2)為主節點7006分配虛擬槽

cd /usr/local/redis/redis/src

./redis-trib.rb reshard 192.168.182.132:7001  //可以為任意的節點 在此登入的7001只是作為客戶端去訪問的

  執行後:

  因為我們增加7006為主節點後,一共存在四個主節點,為了平均分配我們需要給7006分配16384除以4等於4096個節點,所以我們輸入4096,按enter繼續:

  輸入7006的節點ID,按enter繼續:

  從哪些主節點抽取槽到新節點中:all為所有主節點,done:指定節點,在這裡我們輸入all,按enter繼續:

  輸入yes後按enter開始給7006分配虛擬槽,分配完成後:

 

 

     登入叢集檢視一下叢集的狀態:

redis-cli -p 7000 -h 192.168.182.132 -c

cluster nodes

    至此主節點已經新增完畢了,我們的叢集由三主三從變成了四主三從。

  3.新增從節點7007

   (1)使用add-node新增新節點

 cd /usr/local/redis/redis/src

./redis-trib.rb add-node 192.168.182.132:7007  192.168.182.132:7000
 //第一次節點為新增的節點  第二個節點為叢集中的節點

  加入叢集成功,登入到叢集中檢視一下叢集狀態:

  7007還是一個Master節點,而且沒有擁有自己的slot槽。那麼我們接下來要讓它變成從節點。

  (2)將7007變為7006的 從節點

   使用CLUSTER REPLICATE 命令改變一個從節點的主節點。

redis-cli -p 7007 -h 192.168.182.132

cluster replicate 52d169e7011ccdf10f99c1d83f92409dcc37ab55  //後面的字串為節點7006的節點ID

  設定成功後檢視一下:

    叢集的從節點7007新增成功。

  二、叢集的縮容

  只要使用 del-node 命令即可:

./redis-trib del-node 127.0.0.1:7000 <node-id>
第一個引數是任意一個節點的地址,第二個節點是你想要移除的節點地址。

使用同樣的方法移除主節點,不過在移除主節點前,需要確保這個主節點是空的. 如果不是空的,需要將這個節點的資料重新分片到其他主節點上.

替代移除主節點的方法是手動執行故障恢復,被移除的主節點會作為一個從節點存在,不過這種情況下不會減少叢集節點的數量,也需要重新分片資料.

  1.刪除從節點

   刪除節點用del-node命令。此命令需要制定刪除節點的ip和埠,以及節點的id。

cd  /usr/local/redis/redis/src

./redis-trib.rb del-node 192.168.182.132:7007 7007節點ID

  刪除成功後:

  刪除後我們再次檢視叢集的節點資訊,如下所示,7007從節點已經被移除掉。

  2.刪除主節點

   (1)將主節點7006的slots分配到其他主節點上

  cd  /usr/local/redis/redis/src

  ./redis-trib.rb reshard 192.168.182.132:7006

    

    選擇完這幾項以後,回車繼續:

    輸入yes,表示接受這個計劃,然後回車,完成7006節點的槽的移除。

    登入叢集檢視當前叢集情況:

 

 

     節點7006上沒有任何槽。

  (2)使用del-node命令來刪除7006主節點。

cd  /usr/local/redis/redis/src

./redis-trib.rb del-node 192.168.182.132:7006  52d169e7011ccdf10f99c1d83f92409dcc37ab55

  刪除成功:

 

   最後登入檢視叢集又恢復到了三主三從的結構了,只是從剛開始的均勻分配變成了7000埠的主節點多了4096個slot