1. 程式人生 > >redis Cluster 命令 redis-trib.rb 命令

redis Cluster 命令 redis-trib.rb 命令

如果 移除新增-節點,建議用 redis-trib.rb 命令,用 cluster 命令 有時會造成 叢集建配置 不一致
CLUSTER info:列印叢集的資訊。
CLUSTER nodes:列出叢集當前已知的所有節點(node)的相關資訊。
CLUSTER meet <ip> <port>:將ip和port所指定的節點新增到叢集當中。
CLUSTER addslots <slot> [slot ...]:將一個或多個槽(slot)指派(assign)給當前節點。
CLUSTER delslots <slot> [slot ...]:移除一個或多個槽對當前節點的指派。
CLUSTER slots:列出槽位、節點資訊。
CLUSTER slaves 
<node_id>:列出指定節點下面的從節點資訊。 CLUSTER replicate <node_id>:將當前節點設定為指定節點的從節點。 CLUSTER saveconfig:手動執行命令儲存儲存叢集的配置檔案,叢集預設在配置修改的時候會自動儲存配置檔案。 CLUSTER keyslot <key>:列出key被放置在哪個槽上。 CLUSTER flushslots:移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。 CLUSTER countkeysinslot <slot>:返回槽目前包含的鍵值對數量。 CLUSTER getkeysinslot
<slot> <count>:返回count個槽中的鍵。 CLUSTER setslot <slot> node <node_id> 將槽指派給指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽,然後再進行指派。 CLUSTER setslot <slot> migrating <node_id> 將本節點的槽遷移到指定的節點中。 CLUSTER setslot <slot> importing <node_id> 從 node_id 指定的節點中匯入槽 slot 到本節點。 CLUSTER setslot
<slot> stable 取消對槽 slot 的匯入(import)或者遷移(migrate)。 CLUSTER failover:手動進行故障轉移。 CLUSTER forget <node_id>:從叢集中移除指定的節點,這樣就無法完成握手,過期時為60s,60s後兩節點又會繼續完成握手。 CLUSTER reset [HARD|SOFT]:重置叢集資訊,soft是清空其他節點的資訊,但不修改自己的id,hard還會修改自己的id,不傳該引數則使用soft方式。 CLUSTER count-failure-reports <node_id>:列出某個節點的故障報告的長度。 CLUSTER SET-CONFIG-EPOCH:設定節點epoch,只有在節點加入叢集前才能設定。

redis-trib.rb用法(不帶任何引數執行redis-trib.rb即顯示用法):

$ ./redis-trib.rb

Usage: redis-trib <command> <options> <arguments ...>

  rebalance       host:port

                  --auto-weights

                  --timeout <arg>

                  --pipeline <arg>

                  --use-empty-masters

                  --weight <arg>

                  --threshold <arg>

                  --simulate

  add-node        new_host:new_port existing_host:existing_port

                  --slave

                  --master-id <arg>

  reshard         host:port

                  --timeout <arg>

                  --pipeline <arg>

                  --yes

                  --slots <arg>

                  --to <arg>

                  --from <arg>

  check           host:port

  set-timeout     host:port milliseconds

  call            host:port command arg arg .. arg

  fix             host:port

                  --timeout <arg>

  info            host:port

  create          host1:port1 ... hostN:portN

                  --replicas <arg>

  import          host:port

                  --replace

                  --copy

                  --from <arg>

  help            (show this help)

  del-node        host:port node_id

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

可以看到redis-trib.rb具有以下功能:
1、create:建立叢集
2、check:檢查叢集
3、info:檢視叢集資訊
4、fix:修復叢集
5、reshard:線上遷移slot
6、rebalance:平衡叢集節點slot數量
7、add-node:將新節點加入叢集
8、del-node:從叢集中刪除節點
9、set-timeout:設定叢集節點間心跳連線的超時時間
10、call:在叢集全部節點上執行命令
11、import:將外部redis資料匯入叢集
下面從redis-trib.rb使用和原始碼的角度詳細介紹redis-trib.rb的每個功能。

redis-trib.rb主要有兩個類:ClusterNode和RedisTrib。ClusterNode儲存了每個節點的資訊,RedisTrib則是redis-trib.rb各個功能的實現。

ClusterNode物件

先分析ClusterNode原始碼。ClusterNode有下面幾個成員變數(ruby的類成員變數是以@開頭的):

@r:執行redis命令的客戶端物件。
@info:儲存了該節點的詳細資訊,包括cluster nodes命令中自己這行的資訊和cluster info的資訊。
@dirty:節點資訊是否需要更新,如果為true,我們需要把記憶體的節點更新資訊到節點上。
@friends:儲存了叢集其他節點的info資訊。其資訊為通過cluster nodes命令獲得的其他節點資訊。
ClusterNode有下面一些成員方法:

initialize:ClusterNode的構造方法,需要傳入節點的地址資訊。
friends:返回@friends物件。
slots:返回該節點負責的slots資訊。
has_flag?:判斷節點info資訊的的flags中是否有給定的flag。
to_s:類似java的toString方法,返回節點的地址資訊。
connect:連線redis節點。
assert_cluster:判斷節點開啟了叢集配置。
assert_empty:確定節點目前沒有跟任何其他節點握手,同時自己的db資料為空。
load_info:通過cluster info和cluster nodes匯入節點資訊。
add_slots:給節點增加slot,該操作只是在記憶體中修改,並把dirty設定成true,等待flush_node_config將記憶體中的資料同步在節點執行。
set_as_replica:slave設定複製的master地址。dirty設定成true。
flush_node_config:將記憶體的資料修改同步在叢集節點中執行。
info_string:簡單的info資訊。
get_config_signature:用來驗證叢集節點見的cluster nodes資訊是否一致。該方法返回節點的簽名信息。
info:返回@info物件,包含詳細的info資訊。
is_dirty?:判斷@dirty。
r:返回執行redis命令的客戶端物件。
有了ClusterNode物件,在處理叢集操作的時候,就獲得了叢集的資訊,可以進行叢集相關操作。在此先簡單介紹下redis-trib.rb指令碼的使用,以create為例:

create host1:port1 ... hostN:portN
       --replicas <arg>
host1:port1 ... hostN:portN表示子引數,這個必須在可選引數之後,--replicas <arg>是可選引數,帶的表示後面必須填寫一個引數,像--slave這樣,後面就不帶引數,掌握了這個基本規則,就能從help命令中獲得redis-trib.rb的使用方法。

其他命令大都需要傳遞host:port,這是redis-trib.rb為了連線叢集,需要選擇叢集中的一個節點,然後通過該節點獲得整個叢集的資訊。