Redis Clusterの操作を簡単にするredis-trib.rbの使い方

Redisは3.0から Redis Cluster というクラスタが組める機能が追加されました。 コマンドにも"cluster"から始まるコマンドが追加されています。 http://redis.io/commands#cluster

これらのコマンドを使えばクラスタの操作ができるわけなんですが、 今日はredis-trib.rbを紹介したいと思います。

redis-trib.rbは、redisに同梱されている(srcディレクトリの下にある)クラスタの操作をより簡単にするためのツールです。 たとえば

といったことが簡単にできます。

今回はその中でよく使うコマンドを紹介します。

create

redis-trib.rb create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

⇒全てマスタとしてクラスタ構築される

redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.01:7004 127.0.0.1:7005

⇒マスタとスレーブがそれぞれ1:1で構築される。上記だとマスタ3台にスレーブ3台がそれぞれのマスタに紐づくかたちで構築される。

check

redis-trib.rb check クラスタのとある1nodeのIP:port

例:

redis-trib.rb check 127.0.0.1:7000

クラスタの各ノードの状態、および各ノードがマスタなのかスレーブならどのマスタに紐付いているかを表示する。

add-node

redis-trib.rb 追加したいRedisインスタンスのIP:port クラスタのとある1nodeのIP:port

クラスタにマスタが追加される

redis-trib.rb --slave 追加したいRedisインスタンスのIP:port クラスタのとある1nodeのIP:port

クラスタにスレーブが追加される。どのマスタのスレーブになるかはredisに任される。

よく使うのが以下です。

redis-trib.rb add-node --slave --master-id マスターのnodeId 追加したいRedisインスタンスのIP:port クラスタのとある1nodeのIP:port

クラスタにスレーブが追加される。--master-idで指定したマスタのスレーブになる。

マスターのnodeIdはcluster nodesで表示される一番左の値です。

たとえば

$ redis-cli -p 7000 cluster nodes
89be06ecb22150256ec8d11ce6089c48060fba6b 127.0.0.1:7001 master - 0 1437419974749 2 connected 5461-10922
a475649fa0a3b8a85a8da68d8e8ba12f824745ab 127.0.0.1:7002 master - 0 1437419975764 3 connected 10923-16383
51518f3bb0c24af41096bc066f17c1df9fd378e9 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460

のように127.0.0.1:7000と127.0.0.1:7001と127.0.0.1:7002のマスターが構成されていて、 127.0.0.1:7003を127.0.0.1:7000のスレーブとして追加したい場合、以下のコマンドを実行します。

$ redis-trib.rb add-node --slave --master-id 51518f3bb0c24af41096bc066f17c1df9fd378e9 127.0.0.1:7003 127.0.0.1:7000
>>> Adding node 127.0.0.1:7003 to cluster 127.0.0.1:7000
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7002: OK
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 51518f3bb0c24af41096bc066f17c1df9fd378e9 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   0 additional replica(s)
M: 89be06ecb22150256ec8d11ce6089c48060fba6b 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   0 additional replica(s)
M: a475649fa0a3b8a85a8da68d8e8ba12f824745ab 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Connecting to node 127.0.0.1:7003: OK
>>> Send CLUSTER MEET to node 127.0.0.1:7003 to make it join the cluster.
Waiting for the cluster to join....
>>> Configure node as replica of 127.0.0.1:7000.
[OK] New node added correctly.

で、cluster nodesでクラスタの状態をみると以下のように127.0.0.1:7001に127.0.0.1:7003がスレーブとして追加されていることが分かります。

$ redis-cli -p 7000 cluster nodes
89be06ecb22150256ec8d11ce6089c48060fba6b 127.0.0.1:7001 master - 0 1437420057466 2 connected 5461-10922
a475649fa0a3b8a85a8da68d8e8ba12f824745ab 127.0.0.1:7002 master - 0 1437420055948 3 connected 10923-16383
51518f3bb0c24af41096bc066f17c1df9fd378e9 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
e4654fa6bd8365ba3fbb6a37763b4492319f82ec 127.0.0.1:7003 slave 51518f3bb0c24af41096bc066f17c1df9fd378e9 0 1437420056959 1 connected

del-node

redis-trib.rb del-node クラスタ中の1nodeのIP:port 削除したいnodeId

例:

redis-trib.rb del-node 127.0.0.1:7000 e4654fa6bd8365ba3fbb6a37763b4492319f82ec

注意点としては、スレーブはdel-node出来ますが、マスターの場合は入っているデータをflushallとか使って消さないとdel-nodeできません。

call

redis-trib.rb call クラスタ中の1nodeのIP:port 実行したいredisコマンド

例:

redis-trib.rb call 127.0.0.1:7000 DBSIZE

上記だとクラスタ内の各nodeに対してDBSIZEコマンドが実行されます。 マスタとスレーブでデータ数が一致しているか確認するときに便利です。


なお他にもredis-trib.rbにはfix, reshard, set-timeout, import コマンドがあります。 redis-trib.rbの詳細はあまりWeb上にないので、redis-trib.rbのソースを読むのが一番早いです。