Redis 5でのCluster構築

# Redis 5でのCluster構築

ElastiCacheなんて便利なものがあるんですが、ローカルでフェイルオーバーなどの検証を行おうとしたところ、
構築構築のまとまった情報が少なかったため備忘録を残します。


## 環境

OS: CentOS 7
Master Node: 3個
Slave Node: 3個

1OS上にMaster1個、Slave1個という形で構築します。

あとMaster2個で作ろうとしたら怒られたので3個にしてます。
ElastiCacheだと2シャードいけるのに。


## 前提条件

- firewalldが止まってるか、6379、6380、16379、16380が解放されいる
- selinuxが無効になっている


## インストール

デフォルトのyumリポジトリにはRedis 5はないため、epelとremiのリポジトリを追加します。

```sh
yum -y install epel-release
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

redisパッケージのバージョンを確認します。
Versionが5以上になっていれば大丈夫です。

```sh
yum info redis --enablerepo=remi
```


そしてインストール。


```sh
yum -y install redis --enablerepo=remi
```


## 設定

1サーバー上に2つのredisを立ち上げるため、設定ファイルを2つ用意します。

```sh
mkdir -p /opt/redis/6379 /opt/redis/6380

cp -p /etc/redis.conf /opt/redis/6379/
cp -p /etc/redis.conf /opt/redis/6380/
```


6380ポートで実行できるように設定を上書きします。

```sh
sed -i 's/6379/6380/g' /opt/redis/6380/redis.conf
```


cluster modeをon、listenするネットワークポートの変更を行います。

```sh
sed -i 's/# cluster-enabled yes/cluster-enabled yes/g' /opt/redis/6379/redis.conf
sed -i 's/# cluster-enabled yes/cluster-enabled yes/g' /opt/redis/6380/redis.conf
sed -i 's/# cluster-config-file/cluster-config-file/g' /opt/redis/6379/redis.conf
sed -i 's/# cluster-config-file/cluster-config-file/g' /opt/redis/6380/redis.conf

sed -i 's/bind 127.0.0.1/bind {{ listenするIPアドレス }} 127.0.0.1/g' /opt/redis/6379/redis.conf
sed -i 's/bind 127.0.0.1/bind {{ listenするIPアドレス }} 127.0.0.1/g' /opt/redis/6380/redis.conf
```

必要であればmaxmemoryも設定してください。


## 起動

特筆することはありません。
systemdで起動のコントロールをしたい人は別の記事を見てください。

```sh
redis-server /opt/redis/6379/redis.conf &
redis-server /opt/redis/6380/redis.conf &
```



## クラスターの構築

### Masterの構築

まずはMaster Nodeを構築します。
4まではredis-trib.rbを使って構築していたようですが、5からはredis-cliでやります。

```
redis-cli --cluster create 192.168.10.1:6379 192.168.10.2:6379 192.168.10.3:6379
```

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

とでたらyesと入力します。


### 状態の確認

現在の状況を確認します。cluster nodesコマンドで3行返却されれば大丈夫です。

```
redis-cli cluster nodes
b4134b8ae3d45099b89e80f723ffbd6f92802e9d 192.168.10.3:6379@16379 master - 0 1548208242137 3 connected 10923-16383
6db9b1aac4d272849300bb48d63ecd95c4c1ec94 192.168.10.2:6379@16379 master - 0 1548208241129 2 connected 5461-10922
237bbdb084091869e837a3ddf90e10f59f31ee64 192.168.10.1:6379@16379 myself,master - 0 1548208240000 1 connected 0-5460
```

### Slaveの登録

続いてSlaveを登録します。
今回は下記のようにせってします。

192.168.10.1:6379 → 192.168.10.2:6380
192.168.10.2:6379 → 192.168.10.3:6380
192.168.10.3:6379 → 192.168.10.1:6380


```
redis-cli --cluster add-node 192.168.10.2:6380 192.168.10.1:6379 --cluster-slave
redis-cli --cluster add-node 192.168.10.3:6380 192.168.10.2:6379 --cluster-slave
redis-cli --cluster add-node 192.168.10.1:6380 192.168.10.3:6379 --cluster-slave
```


## 状態の確認

もう一度、クラスターの状態を確認します。

```
redis-cli cluster nodes
237bbdb084091869e837a3ddf90e10f59f31ee64 192.168.10.1:6379@16379 master - 0 1548208917915 1 connected 0-5460
f0255000fa18959cb273e1a1555eb84884e261e9 192.168.10.3:6380@16380 slave 6db9b1aac4d272849300bb48d63ecd95c4c1ec94 0 1548208918921 2 connected
b4134b8ae3d45099b89e80f723ffbd6f92802e9d 192.168.10.3:6379@16379 master - 0 1548208916000 3 connected 10923-16383
6ff367f62dc46a07a8030c2985e1fbcb9f899c68 192.168.10.2:6380@16380 slave 237bbdb084091869e837a3ddf90e10f59f31ee64 0 1548208918000 1 connected
763bff12eea4ca5c821a6a5b9eeafdf8f44bf5b0 192.168.10.1:6380@16380 slave b4134b8ae3d45099b89e80f723ffbd6f92802e9d 0 1548208917000 3 connected
6db9b1aac4d272849300bb48d63ecd95c4c1ec94 192.168.10.2:6379@16379 myself,master - 0 1548208918000 2 connected 5461-10922
```


## 参考

https://redis.io/topics/cluster-tutorial