Redis Clusterの構築メモ


## はじめに

基本的に、[Creating and using a Redis Cluster](http://redis.io/topics/cluster-tutorial#creating-and-using-a-redis-cluster)のまんま。

## 環境

* Ubuntu 14.04

### 最新版のビルドとインストール

[redis](https://github.com/antirez/redis)から最新版のソースコードをcloneして、ビルド&インストールする。

```bash
$ git clone https://github.com/antirez/redis.git
$ cd redis
$ make
$ sudo make install
```

### ノード用のディレクトリを用意する

```bash
$ 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プロセスが起動しているのがわかる。
この時点では、まだクラスタ構成になっていない。

```bash
$ 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`しておく。

以下は、チュートリアル通りのコマンドの実行結果である。

```bash
$ ./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`であれば、マスター・スレーブに関わらず接続可能である。

```bash
$ 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`は、独立したツールにならないものか。