Redis Cluster構築

# はじめに 
他のRedis構築に関するページは以下をご参考ください。
[Redis構築のまとめ](https://qiita.com/ono-soic/items/d63ac849ebccee68b5bc)

◯そもそもRedis Clusterとは
・Redis Clusterマニュアル（翻訳してくれているものです。）
https://gist.github.com/key-amb/c641947a2139fdd81684

今回は最小構成の6台で構築する
Redisのインストールに関しては[Redisインストール〜起動](https://qiita.com/ono-soic/items/efbbf56fbbc8d4b44a07)までを参照

## 環境
CentOS 6.8
Redis 3.2.5
Ruby 2.3.2

## 構成
| IPアドレス | ポート番号 | 役割 |
|:--|:--|:--|
| 192.168.56.111 | 6379 | Master |
| 192.168.56.112 | 6379 | Master |
| 192.168.56.113 | 6379 | Master |
| 192.168.56.114 | 6379 | Slave |
| 192.168.56.115 | 6379 | Slave |
| 192.168.56.116 | 6379 | Slave |
※役割は構築時、Masterサーバが落ちた場合SlaveがフェールオーバしてMasterになる。

### 1. redis.confを編集する(redis.confファイルの設定内容参照)

```
$ vim /usr/local/redis-3.2.5/redis.conf

--------redis.conf--------
port 6379
bind xxx.xxx.xx.xxx 127.0.0.1 # 現在のサーバのIPアドレス
cluster-enabled yes # クラスター有効
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000 #milliseconds
appendonly yes
loglevel notice
 
logfile "/var/log/redis/6379.log"
``` 

### 2. redis-trib.rbの編集
クラスターの管理ツールである、redis-trib.rbを利用してクラスターの追加などを行う。
src配下にファイルがあります。
自分が構築した際は必要なさそうだったので編集しませんでした。
ちなみに自分の場合はパスはここ。
/usr/local/redis-3.2.5/src/redis-trib.rb

### 3. redis-trib.rbを実行してクラスターを構築する
・IP:PORT指定にあたり、各サーバでポートを開けておく(redisでデフォルトの6379+10000のポート番号も開けなければいけないみたいです)

```
$ iptables -I INPUT -p tcp -m tcp --dport 6379 --syn -j ACCEPT
$ iptables -I INPUT -p tcp -m tcp --dport 16379 --syn -j ACCEPT
$ service iptables save
$ service iptables restart
```
・下のコマンドで各サーバを起動

```
# /usr/local/bin/redis-server ./redis.conf --pidfile ./redis.pid --logfile ./redis.log --cluster-config-file ./node.conf&
```

・rbファイルを実行するためにrubyのインストールが必要です。
参考)http://centos.bungu-do.jp/archives/34

現在の安定板(現状2.3.2)

```
# 依存パッケージのインストール
$ yum -y install gcc zlib-devel openssl-devel sqlite sqlite-devel mysql-devel readline-devel libffi-devel
$ cd /usr/local
$ wget http://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.2.tar.gz
$ tar zxvf ruby-2.3.2.tar.gz
$ cd ruby-2.3.2
$ ./configure
$ make
$ make install
``` 

・Redis Cluster構築

```
./redis-trib.rb create --replicas 1 192.168.56.111:6379 192.168.56.112:6379 192.168.56.113:6379 192.168.56.114:6379 192.168.56.115:6379 192.168.56.116:6379
```
上記のコマンドを成功させるまででいろいろ詰まった。
[Redis Cluster構築時のエラーまとめ](https://qiita.com/ono-soic/items/d064f4db0e66249f7c85)

(もしもうまくいかない場合は一回全サーバのredisのpidをkillして再度起動するといいかもしれない)

```
[OK] All 16384 slots covered.
```
こうなれば成功！

### 4. 試しに動かしてみる
試しにいくつかコマンドを使用してどのような挙動をするのか確認してみる

#### set/get

```
$ redis-cli -h 192.168.56.111 -c

192.168.56.111:6379>set num1 1
-> Redirected to slot [8983] located at 192.168.56.112:6379
OK
192.168.56.112:6379> set num3 3
-> Redirected to slot [13110] located at 192.168.56.113:6379
OK
192.168.56.113:6379> get num1
-> Redirected to slot [4980] located at 192.168.56.111:6379
1
```
サーバが移動していることが確認できたらOK
※-cはクラスタを使用する場合につけるオプション

#### CLUSTER NODES
cluster nodesコマンドでクラスターのノード情報が見れる

```
192.168.56.112:6379>cluster nodes
da39a504948ffc76ccdcc41a7d10488ff9b1c853 192.168.56.115:6379 slave 0262fe1bfdffb5e676e66692ea38294fc06babe0 0 1481517866357 5 connected
6f3f250b16fc4e45d2dbbfaf571800855be8f2be 192.168.56.111:6379 master,fail - 1481517410876 1481517408055 1 disconnected
0262fe1bfdffb5e676e66692ea38294fc06babe0 192.168.56.112:6379 master - 0 1481517872397 2 connected 5461-10922
06e2050e602e1674d3fd9de4392ebc7c1b59d53d 192.168.56.116:6379 slave bf7381283c9cf39b5d30915256f312d9704c654c 0 1481517870384 6 connected
bf7381283c9cf39b5d30915256f312d9704c654c 192.168.56.113:6379 master - 0 1481517871390 3 connected 10923-16383
f3789c2816647d78b4fded10d4cfd23f559ac20e 192.168.56.114:6379 myself,master - 0 0 7 connected 0-5460
```

3.MSET/MGET
Redis Cluster利用時はMSETなどのMultiple Keysについて注意が必要

```
192.168.56.111:6379> MSET key1 value1 key2 value2
(error) CROSSSLOT Keys in request don't hash to the same slot
192.168.56.111:6379> MSET {key}1 value1 {key}2 value2
-> Redirected to slot [12539] located at 192.168.56.113:6379
OK
```

上記の通り、通常通りMSETを実行するとエラーになる。 hash tags を利用することによってMSETが実行可能になる。MGETも同様