はじめに
基本的に、Creating and using a Redis Clusterのまんま。
環境
- Ubuntu 14.04
最新版のビルドとインストール
redisから最新版のソースコードをcloneして、ビルド&インストールする。
$ git clone https://github.com/antirez/redis.git
$ cd redis
$ make
$ sudo make install
ノード用のディレクトリを用意する
$ mkdir 7000 7001 7002 7003 7004 7005
$ cat <<EOF > redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
$ for i in {0..5}; do cp -av redis.conf "700$i/"; sed -i -e "s/port 7000/port 700$i/g" "700$i/redis.conf"; done
ノードのプロセスを起動する
作成した各ディレクトリに移動し、それぞれのディレクトリでredis-server ./redis.con
する。ps
で見ると以下のような状態になり、計6プロセスが起動しているのがわかる。
この時点では、まだクラスタ構成になっていない。
$ ps auxw | egrep "redis" | grep -v egrep
hina 19028 0.7 0.3 43304 7868 pts/11 Sl+ 15:47 0:00 redis-server *:7000 [cluster]
hina 19031 0.3 0.3 43304 7872 pts/14 Sl+ 15:47 0:00 redis-server *:7001 [cluster]
hina 19034 0.2 0.3 43304 7868 pts/15 Sl+ 15:47 0:00 redis-server *:7002 [cluster]
hina 19037 0.2 0.3 43304 7872 pts/16 Sl+ 15:47 0:00 redis-server *:7003 [cluster]
hina 19040 0.2 0.3 43304 7872 pts/17 Sl+ 15:47 0:00 redis-server *:7004 [cluster]
hina 19043 0.2 0.3 43304 7872 pts/18 Sl+ 15:47 0:00 redis-server *:7005 [cluster]
クラスタ構成にする
クラスタ構成にするためには、redisのソースコードに付属しているsrc/redis-trib.rb
を使う。このツールは、redis
に依存しているので、予めgem install redis
しておく。
以下は、チュートリアル通りのコマンドの実行結果である。
$ ./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.0.1:7004 127.0.0.1:7005
>>> Creating cluster
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
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7004: OK
Connecting to node 127.0.0.1:7005: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: 93e53337037a3f9b1a5e0ae914e48aeca54a1d7b 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: d64dd6fd3e5cea7d0cf87acb278d94c7d1e02bca 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: 22bca92b78354dc995b35c815c54936f6efc28d4 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
S: f254c575fd2f06161905753f9e473c569ce4cdcf 127.0.0.1:7003
replicates 93e53337037a3f9b1a5e0ae914e48aeca54a1d7b
S: 590b0db9b2031254645be39104aafb865bc70d31 127.0.0.1:7004
replicates d64dd6fd3e5cea7d0cf87acb278d94c7d1e02bca
S: 5b889edfad0301cebb997bb92fe84f6e097e0ff8 127.0.0.1:7005
replicates 22bca92b78354dc995b35c815c54936f6efc28d4
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 93e53337037a3f9b1a5e0ae914e48aeca54a1d7b 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: d64dd6fd3e5cea7d0cf87acb278d94c7d1e02bca 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: 22bca92b78354dc995b35c815c54936f6efc28d4 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
M: f254c575fd2f06161905753f9e473c569ce4cdcf 127.0.0.1:7003
slots: (0 slots) master
replicates 93e53337037a3f9b1a5e0ae914e48aeca54a1d7b
M: 590b0db9b2031254645be39104aafb865bc70d31 127.0.0.1:7004
slots: (0 slots) master
replicates d64dd6fd3e5cea7d0cf87acb278d94c7d1e02bca
M: 5b889edfad0301cebb997bb92fe84f6e097e0ff8 127.0.0.1:7005
slots: (0 slots) master
replicates 22bca92b78354dc995b35c815c54936f6efc28d4
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
- 127.0.0.1:7000〜127.0.0.1:7005で待ち受けるノードを起動している。
- ノードの内訳は以下。
- マスター: 3
- スレーブ: 3
- マスターには、hash slotが以下のように割り当てられている。
- 93e53337037a3f9b1a5e0ae914e48aeca54a1d7b: 0-5460 (5461 slots)
- d64dd6fd3e5cea7d0cf87acb278d94c7d1e02bca: 5461-10922 (5462 slots)
- 22bca92b78354dc995b35c815c54936f6efc28d4: 10923-16383 (5461 slots)
ちなみに、redis-cli
で接続した際にはどう見えるかというと、以下のように見える。ポート番号に7000
を指定しているが、7000
〜7005
であれば、マスター・スレーブに関わらず接続可能である。
$ redis-cli -c -p 7000
127.0.0.1:7000> cluster nodes
d64dd6fd3e5cea7d0cf87acb278d94c7d1e02bca 127.0.0.1:7001 master - 0 1430982942619 2 connected 5461-10922
5b889edfad0301cebb997bb92fe84f6e097e0ff8 127.0.0.1:7005 slave 22bca92b78354dc995b35c815c54936f6efc28d4 0 1430982943628 6 connected
f254c575fd2f06161905753f9e473c569ce4cdcf 127.0.0.1:7003 slave 93e53337037a3f9b1a5e0ae914e48aeca54a1d7b 0 1430982943628 4 connected
590b0db9b2031254645be39104aafb865bc70d31 127.0.0.1:7004 slave d64dd6fd3e5cea7d0cf87acb278d94c7d1e02bca 0 1430982943125 5 connected
93e53337037a3f9b1a5e0ae914e48aeca54a1d7b 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
22bca92b78354dc995b35c815c54936f6efc28d4 127.0.0.1:7002 master - 0 1430982942115 3 connected 10923-16383
感想
redis-trib.rb
は、独立したツールにならないものか。