1. 程式人生 > >Redis進階實踐之十二 Redis的Cluster叢集動態擴容

Redis進階實踐之十二 Redis的Cluster叢集動態擴容

一、引言

      上一篇文章我們一步一步的教大家搭建了Redis的Cluster叢集環境,形成了3個主節點和3個從節點的Cluster的環境。當然,大家可以使用 Cluster info 命令檢視Cluster叢集的狀態,也可以使用Cluster Nodes 命令來詳細瞭解Cluster叢集每個節點的詳細資訊和關係。我們可以在主節點上增加資料、操作資料,也可以在從節點上讀取資料,這些操作當然都沒有問題。我們今天這篇文章主要是講解一下如何在不停掉Cluster叢集環境的情況下,動態的往叢集環境中增加主、從節點和動態的從叢集環境中刪除節點。好了,廢話不多說,開始我們今天的講解。在開始之前,先要說明一下,因為redis的動態擴容操作都是通過redis-trib.rb指令碼檔案來完成的,所以我們先來看看對這個指令碼檔案的說明,效果如圖:

    [[email protected] redis] # ruby redis-trib.rb

    

二、Cluster叢集增加操作

       現在正好開始我們的操作,我把增加節點和刪除節點分開來寫,並且增加或者刪除節點,我都分了兩個方面來說,一個方面是主節點的操作,另一個方面是從節點的操作,因為主、從節點在操作上會有差異,所以分來來說。增加節點的順序是先增加Master主節點,然後在增加Slave從節點。當然這篇文章是在上一篇文章所講的Cluster叢集模式的基礎之上來講的,那就讓我們先來看看上一篇文章所建立的Cluster叢集模式的詳細資訊。效果如圖:

       



      

      1、動態增加Master主伺服器節點

            1.1、建立目錄7006(Master主節點資料夾)和7007(Slave從節點資料夾),並從以前Cluster叢集節點7000-7005任一節點中拷貝配置檔案redis.conf到7006和7007目錄下。

複製程式碼

                [[email protected] redis-cluster]# pwd
                [[email protected] redis-cluster]# /root/application/program/redis-cluster/

                [
[email protected]
redis-cluster]# mkdir 7006 7007       [[email protected] redis-cluster]# ls      7000 7001 7002 7003 7004 7005 7006 7007 [[email protected] redis-cluster]# cp 7000/redis.conf 7006 [[email protected] redis-cluster]# cp 7000/redis.conf 7007

複製程式碼


                  1、建立目錄:

              

             2、拷貝配置檔案:

              

            1.2、修改配置檔案,將7006和7007目錄下面的redis.conf配置檔案的埠進行相應修改,與自己的目錄名稱保持一致,修改專案如下:(在linux環境下可以執行如下命令進行全域性替換::%s/7000/7006/g,%s/7000/7007/g,儲存並退出則可)

                  1.2.1、7006節點的配置檔案:redis.conf

複製程式碼

                      bind 192.168.127.130

                      port 7006
    
                      daemonize yes

                      pidfile /var/run/redis-7006.pid

                      logfile /root/application/program/redis-cluster/7006/redis.log
    
                      dir /root/application/program/redis-cluster/7006/

                      cluster-enabled yes

                      cluster-config-file nodes-7006.conf


                      cluster-node-timeout 15000

                      appendonly yes

                      appendfsync always

複製程式碼


                  1.2.2、7007節點的配置檔案:redis.conf

複製程式碼

                      bind 192.168.127.130

                      port 7007

                      daemonize yes

                      pidfile /var/run/redis-7007.pid

                      logfile /root/application/program/redis-cluster/7007/redis.log
    
                      dir /root/application/program/redis-cluster/7007/

                      cluster-enabled yes

                      cluster-config-file nodes-7007.conf


                      cluster-node-timeout 15000

                      appendonly yes

                      appendfsync always

複製程式碼


           1.3、啟動7006和7007目錄下Redis例項,並檢視效果。

複製程式碼

                [[email protected] redis]# pwd
                [[email protected] redis]# /root/application/program/redis/


                [[email protected] redis]# redis-server ../redis-cluster/7006/redis.conf
                [[email protected] redis]# redis-server ../redis-cluster/7007/redis.conf

複製程式碼


                          效果如圖:

          
      
          

             1.4、將7006主節點加入到Cluster叢集。

                [[email protected] redis]# pwd
                [[email protected] redis]# /root/application/program/redis/

                [[email protected] redis]# ruby redis-trib.rb add-node 192.168.127.130:7006 192.168.127.130:7000

                  注意:當新增新節點成功以後,新的節點不會有任何資料,因為他沒有分配任何的資料Slot(雜湊slots),這一步需要手動操作。

                   1.4.1、增加7006:(192.168.127.130:7006,截圖地址錯誤,埠號是7006,不是9006)
            

           1.4.2、節點增加成功。

            

          1.4.3、cluster info 驗證:

            

         1.4.4、cluster nodes驗證:

          

             1.5、為7006Master主節點分配資料Slots,分配方法是從叢集中知道任何一個主節點(因為只有Master主節點才有資料slots),然後對其進行重新分片工作。

                [[email protected] redis]# pwd
                [[email protected] redis]# /root/application/program/redis/

                [[email protected] redis]# ruby redis-trib.rb reshard 192.168.127.130:7000

                  1.5.1、分配資料槽:

            

                  1.5.2、選擇接收資料槽的節點和資料槽產生的方式:
          

                  1.5.3、執行分配計劃:
          

                  1.5.4、資料槽分配成功:
          
            
      2、動態增加Slave從伺服器節點

              在增加主節點7006的時候,前面的3步是共有的,也就是從1.1-1.3,之後才是建立主節點的內容,前面的3步驟針對從節點7007也是必須的,我只是把這些步驟寫到了建立主節點7006的步驟裡,大家請知曉。

              2.1、將7007節點增加到叢集中

                  [[email protected] redis]# pwd
                  [[email protected] redis]# /root/application/program/redis/

                  [[email protected] redis]# ruby redis-trib.rb add-node 192.168.127.130:7007 192.168.127.130:7000


                效果如圖:

          

              2.2、指定7007節點作為7006的從節點,實現主從的配置。

複製程式碼

                  [[email protected] redis]# pwd
                  [[email protected] redis]# /root/application/program/redis/

                  [[email protected] redis]# redis-cli -c -h 192.168.127.130 -p 7007  //登陸7007
                  192.168.127.130::7007>cluster replicate 71ecd970838e9b400a2a6a15cd30a94ab96203bf(主節點的ID,這裡是7006)
                  192.168.127.130::7007>OK

複製程式碼

                  效果如圖:
           


三、Cluster叢集刪除操作

        由於我們在上面的步驟裡面建立7006和7007兩個主從的節點,下面接下來的操作,我就是從這個Cluster叢集模式中動態的刪除掉這兩個節點。刪除的順序是先刪除Slave從節點,然後在刪除Master主節點,最後還原到我們上一篇文章建立的Cluster叢集模式,也就是3個主節點和3個從節點。現在是4個主節點和4個從節點。效果如圖:

      
    
      1、動態刪除Slave從伺服器節點

            1.1、刪除7007從節點,輸入del-node命令,指定刪除節點的IP地址和Port埠號,同時還要提供該從節點ID名稱。

                [[email protected] redis]# pwd
                [[email protected] redis]# /root/application/program/redis/

                [[email protected] redis]# ruby redis-trib.rb del-node 192.168.127.130:7007 991ed242102aaa08873eb9404a18e0618a4e37bd


                  刪除成功如圖:        
          

                 刪除前如圖:
          

                 刪除後如圖:
          

      2、動態刪除Master主伺服器節點

              要想刪除Master主節點,可能要繁瑣一些。因為在Master主節點上有資料槽(slots),為了保證資料的不丟失,必須把這些資料槽遷移到其他Master主節點上,然後在刪除主節點。

              2.1、重新分片,把要刪除的Master主節點的資料槽移動到其他Master主節點上,以免資料丟失。

              [[email protected] redis]# pwd
              [[email protected] redis]# /root/application/program/redis/

              [[email protected] redis]# ruby redis-trib.rb reshard 192.168.127.130:7006


                    2.1.1、移除多少槽如圖:建立輸入200,這裡要輸入199,因為計數是從0開始的,切記。

                        

                    2.1.2、接受槽的Master主節點ID:這個節點可以是任意一個主節點都可以,我選擇7002,ID是:3b025b3ecfa65f462de639c7a412be443cf1dd1c
                        

                   2.1.3、從哪個主節點移除,該主節點是7006,ID是:71ecd970838e9b400a2a6a15cd30a94ab96203bf
             

                   2.1.4、執行分割槽計劃,選擇yes。分割槽完成,效果如圖:
                              

                   2.1.5、當前7006主節點已經沒有資料槽了。
                        

              2.2、刪除7006主節點,提供要刪除節點的IP地址和Port埠,當然還有要刪除的節點的ID名稱。

                  [[email protected] redis]# pwd
                  [[email protected] redis]# /root/application/program/redis/

                  [[email protected] redis]# ruby redis-trib.rb del-node 192.168.127.130:7006 71ecd970838e9b400a2a6a15cd30a94ab96203bf


                    2.2.1、刪除成功
                        

                    2.2.2、檢視節點效果
                        


四、總結

      今天就寫到這裡了,做一個小小的總結。主從複製和哨兵模式這兩個叢集模式由於不能動態擴容,而且主節點之間(有多個主節點的情況)資料完全一樣,導致了主節點的容量成了整個叢集的瓶頸,如果想擴充套件叢集容量,必須擴充套件主節點的容量。由於以上的問題,redis在3.0開始Cluster叢集模式,這個模式在主節點之間資料是不一樣的,資料也可以根據需求自動轉向其他節點。這樣就可以實現橫向動態擴容,新增加的主從節點,用於儲存新的資料則可,對以前的節點的資料不會有任何影響。再者說,配置也很簡單,這才是我們所需要的叢集模式。