🎉

もうRedisClusterを作るのにRubyはいらないし、認証つけるのに複雑な操作は不要

2020/11/15に公開

Redis Cluster を簡単に作るのに Rubyが必要だった

Redis5 がリリースされるまでは、プリミティブな Cluster 構築用のコマンドは存在するものの、手順が非常に複雑でした。

そのため、公式から redis-trib.rb という Ruby 製の Redis Cluster 構築スクリプトが提供されていました。

Redis v5 以降から redis-cli に機能追加

Redis v5 より、 redis-cli 自体に Cluster 構築コマンド ( ほぼ redis-trib.rb 互換 ) が追加されました。
なお、 Redis 3/4 系にも、 Redis 5 系に同梱される redis-cli を利用して Cluster 操作が可能です。

試しに Cluster を組んでみる

今回は例として同じサーバーに別 Port で Redis を 6 Instance 起動させて Cluster を組んでみます。

事前準備

これから Redis を 6 Instance 分用意し、 redis.config をそれぞれ Cluster 用に書き換えます。
※ Redis 自体を用意するところは省略します。

Redis Instance ごとにディレクトリを用意。

$ mkdir 7000 7001 7002 7003 7004 7005

各 Redis Instance の config を入れておきます。

cp /etc/redis.conf 7000
cp /etc/redis.conf 7001
cp /etc/redis.conf 7002
cp /etc/redis.conf 7003
cp /etc/redis.conf 7004
cp /etc/redis.conf 7005
cp /etc/redis.conf 7006

コンフィグの内容をそれぞれ下記のように変更していきます。

※ 下記は port:7000 で起動させる Redis の Config 例です。

port 7000
pidfile "/var/run/redis_7000.pid"
logfile "/root/cluster-test/7000/redis.log"
dbfilename "dump-7000.rdb"
appendonly yes
appendfilename "appendonly-7000.aof"
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000

編集した Config を利用して Redis を起動させます。

$ redis-server 7000/redis.conf
$ redis-server 7001/redis.conf
$ redis-server 7002/redis.conf
$ redis-server 7003/redis.conf
$ redis-server 7004/redis.conf
$ redis-server 7005/redis.conf

Cluster 新規作成

この例では Master 数が 3 、 1Master あたりの Replica 数が 1 の 3Master-3Replica 構成を組みます。

$ redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 
--cluster-replicas 1

途中で良い感じに Master/Replica を組んで良いか?と聞かれるので yes と答えて、あとは待つだけです。

Can I set the above configuration? (type 'yes' to accept):

その他のコマンド

help で確認できます。

$ redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
  info           host:port
  fix            host:port
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>
  del-node       host:port node_id
  call           host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace
  help           

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

Appendix

redis-trib.rb で出来なかった認証付きもできる

redis-trib.rb can not use when nodes are auth · Issue #3389 · redis/redis
この Issue で説明されているように、 redis-trib.rb ではパッチを当てないと Redis に認証を追加できませんでした。

redis-cli の Cluster 構築機能では、 -a <password> オプションを利用するだけです。

$ redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 
--cluster-replicas 1 -a <password>

Discussion