1. 程式人生 > >redis cluster原始碼研究--create cluster

redis cluster原始碼研究--create cluster

   create cluster是指建立或搭建redis叢集。
   這裡以搭建六個節點的redis叢集(redis cluster最少節點為六個節點)為例進行分析。
一、建立步驟:
(1)節點配置需開啟cluster配置項,最小關注配置為如下:
    port 7000
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
(2)在六臺機分別啟動redis節點:
    $ ./redis-server ./redis.conf 
(3)最後使用運維工具redis-trib.rb建立叢集,命令如下:
    $ ./redis-trib.rb create --replicas 1 192.168.0.1:7000 192.168.0.2:7000 192.168.0.3:7000 192.168.0.4:7000 192.168.0.5:7000 192.168.0.6:7000
    其中--replicas 1表示每個主節點必須有一個從節點,剩下的引數是需要加入叢集的節點地址。


(4)接著有節點配置(主從關係和負責雜湊槽)提示:
    Performing hash slots allocation on 16384 nodes..
    ....
    ....
(5)如果覺得配置沒問題,則輸入“yes”,否則退出建立程式;
(6)如果輸入yes,則等待建立結束,結果要麼建立成功,要麼建立失敗(會提示失改原因)。


二、實現原理
   通過上面步驟可知,真正執行建立工作是第三步執行redis-trib.rb create命令。故對該命令進行分析,得知它由以下幾個步驟組成:
(1)檢查引數合法性;
(2)生成主從關係,並給主節點分配雜湊槽,直到這步還沒有真正發命令給redis節點進行配置;
(3)如果滿意第(2)步的配置,則開始進行真正地配置,轉到(4),否則退出程式;
(4)重新整理每個節點配置。對從節點則設定cluster replicate命令,配置主從關係;對主節點則設定cluster addslots命令,新增負責的雜湊槽。這裡因為從節點還不知道主節點的存在,所以執行cluster replicate命令是失敗的,不過這裡會忽略這個失敗;
(5)給每個節點分配不同的EpochConfig值(遞增的),通過cluster set-config-epoch命令設定EpochConfig值,因為(4)對雜湊槽進行更新了,故要更新EpochConfig來保證雜湊槽配置在全域性是一致的(在之前的配置一致性文章裡有說明);
(6)通過cluster meet命令相互認識對方。這裡通過介紹(用cluster meet命令介紹)第一個節點向其他五個節點來達到相互認識的目的。
(7)因為相互認識對方有一定遲延,故這裡需要等待相互認識工作完成。這裡通過每個節點的主節點負責雜湊槽配置是否一樣來判斷是否相互認識工作完成。
(8)再執行第(4)步工作,與(4)不同的是,這裡對cluster replicate命令執行會成功,因為從節點知道主節點的存在了;
(9)最後檢查叢集配置是否正常。檢查下面三項:
       a、主節點負責雜湊槽配置是否每個節點一樣
       b、是否有importing或migrating slots
       c、所有雜湊槽是否都有一個主節點負責


三、總結
    create cluster其實就是通過redis-trib.rb create命令將毫不相干的redis節點組合成redis叢集。