Redisを冗長化構成にする（フェールオーバー環境を構築するーその２）

Redis 冗長化 ＆ フェールオーバー環境を CentOS 6.x 上に構築する手順です
手順は３部構成となっており、本稿は **Redis の冗長化**となります

　[（その１）：Redisのインストール](http://qiita.com/KurosawaTsuyoshi/items/f8719bf7c3a10d22a921)
　**（その２）：Redisの冗長化**
　[（その３）：Redis-Sentinelによるフェールオーバー環境の構築](http://qiita.com/KurosawaTsuyoshi/items/e6a4def57c9a12f1d752)

# Redisの冗長化の概要
Redis を3インスタンス立ち上げ、複数の Redis でレプリケーション（データ同期）させます

なお混乱を避けるため、[（その１）で構築した Redis](http://qiita.com/KurosawaTsuyoshi/items/f8719bf7c3a10d22a921) は利用しません
各種ファイルをコピーして新たに3インスタンス分を用意します

| 起動ファイル | ポート | 設定ファイル |説明 |
| --- | --- | --- | --- |
| redis | 6379 | 6379.conf | 停止させます。利用しません |
| redis_1 | 6381 | 6381.conf | Master |
| redis_2 | 6382 | 6382.conf | Slave1 |
| redis_3 | 6383 | 6383.conf | Slave2 |

# Redis の冗長化構成を構築
Redis を複数インスタンス立ち上げ、1インスタンスを Master（読み書き可）にします
残りは Slave（参照のみ）のバックアップとして構成します

## Redis 設定ファイルの作成
1インスタンスごとに設定ファイルが必要です
[（その１）で構築した Redis](http://qiita.com/KurosawaTsuyoshi/items/f8719bf7c3a10d22a921) の設定ファイルをコピーして利用します

```bash
$ sudo cp -p /etc/redis/6379.conf /etc/redis/6381.conf
$ sudo cp -p /etc/redis/6379.conf /etc/redis/6382.conf
$ sudo cp -p /etc/redis/6379.conf /etc/redis/6383.conf
```
ポート番号にあわせ変更していきます
　**重要**
　　マスタ側でパスワード設定（requirepass）した場合は スレーブ側で **masterauth** 指定が必要です

　　また冗長化を永続化するためにスレーブ側（ 6382.conf と 6383.conf ）に slaveof 文を追加してください
　　指定しない場合は、再起動すると全て Master 起動されてしまいます。

```bash
$ sudo vi /etc/redis/6381.conf
```
```conf:6381.conf
pidfile /var/run/redis/redis_6381.pid
port 6381
logfile /var/log/redis/6381.log
dbfilename 6381.rdb
requirepass hoge
```
```bash
$ sudo vi /etc/redis/6382.conf
```
```conf:6382.conf
pidfile /var/run/redis/redis_6382.pid
port 6382
logfile /var/log/redis/6382.log
dbfilename 6382.rdb
masterauth hoge
slaveof 127.0.0.1 6381
```
```bash
$ sudo vi /etc/redis/6383.conf
```
```conf:6383.conf
pidfile /var/run/redis/redis_6383.pid
port 6383
logfile /var/log/redis/6383.log
dbfilename 6383.rdb
masterauth hoge
slaveof 127.0.0.1 6381
```

## redis の起動スクリプトを作成
こちらも最初にインストールした Redis の起動スクリプトをコピーします

```bash
$ sudo cp -p /etc/init.d/redis /etc/init.d/redis_1
$ sudo cp -p /etc/init.d/redis /etc/init.d/redis_2
$ sudo cp -p /etc/init.d/redis /etc/init.d/redis_3
```

各インスタンスごとのポートとプロセスIDファイルに変更していきます

```bash
$ sudo vi /etc/init.d/redis_1
```
```txt:redis_1
REDISPORT=6381
★ REDISPORT が存在しない場合
pidfile="/var/run/redis/redis_6381.pid"
REDIS_CONFIG="/etc/redis/6381.conf"
```
```bash
$ sudo vi /etc/init.d/redis_2
```
```txt:redis_2
REDISPORT=6382
★ REDISPORT が存在しない場合
pidfile="/var/run/redis/redis_6382.pid"
REDIS_CONFIG="/etc/redis/6382.conf"
```
```bash
$ sudo vi /etc/init.d/redis_3
```
```txt:redis_3
REDISPORT=6383
★ REDISPORT が存在しない場合
pidfile="/var/run/redis/redis_6383.pid"
REDIS_CONFIG="/etc/redis/6383.conf"
```
  
## Redis の自動起動（サービス）登録と起動確認  
サービスとして自動起動されるようにします
[（その１）](http://qiita.com/KurosawaTsuyoshi/items/f8719bf7c3a10d22a921)で登録したサービスは解除しておきます

```bash
$ sudo chkconfig redis off
$ sudo chkconfig redis_1 on
$ sudo chkconfig redis_2 on
$ sudo chkconfig redis_3 on
```
```bash
$ chkconfig --list | grep redis
redis          	0:off	1:off	2:off	3:off	4:off	5:off	6:off
redis-sentinel 	0:off	1:off	2:off	3:off	4:off	5:off	6:off
redis_1        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
redis_2        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
redis_3        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

登録が終わったら起動してみましょう
こちらも[（その１）](http://qiita.com/KurosawaTsuyoshi/items/f8719bf7c3a10d22a921)の起動サービスは落とします

```
$ sudo /etc/init.d/redis_1 start
 [  OK  ]
$ sudo /etc/init.d/redis_2 start
 [  OK  ]
$ sudo /etc/init.d/redis_3 start
 [  OK  ]
$ sudo /etc/init.d/redis stop
redis-server を停止中: (error) NOAUTH Authentication required.
```

redis の実行プロセスが表示されることを確認します

```bash
$ ps -ef | grep redis
redis      3387      1  0 07:26 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6381                                                              
redis      3402      1  0 07:26 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6382                                                              
redis      3417      1  0 07:26 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6383                                                              
coco       3422   3146  0 07:27 pts/0    00:00:00 grep redis
```

ログファイルも確認します

```bash
$ ls -l /var/log/redis/
-rw-r--r--. 1 root root 7781  2月  6 21:42 2016 6379.log
-rw-r--r--. 1 root root 3367  2月  6 21:42 2016 6381.log
-rw-r--r--. 1 root root 3247  2月  6 21:42 2016 6382.log
-rw-r--r--. 1 root root 3247  2月  6 21:42 2016 6383.log
```

ダンプファイル・プロセスファイルも作成されていることを確認します

```bash
$ ls -l /var/run/redis/
-rw-r--r--. 1 root root 18  2月  6 21:42 2016 6379.rdb
-rw-r--r--. 1 root root 18  2月  6 21:42 2016 6381.rdb
-rw-r--r--. 1 root root 18  2月  6 21:42 2016 6382.rdb
-rw-r--r--. 1 root root 18  2月  6 21:42 2016 6383.rdb
-rw-r--r--. 1 root root  5  2月  6 21:42 2016 redis_6381.pid
-rw-r--r--. 1 root root  5  2月  6 21:42 2016 redis_6382.pid
-rw-r--r--. 1 root root  5  2月  6 21:42 2016 redis_6383.pid
```

全ての Redis インスタンスに接続できることを確認します
パスワード（requirepass）をセットしてる場合は -a でパスワードの指定が必要です

```bash
$ redis-cli -p 6381 -a hoge info | egrep 'role'
role:master
$ redis-cli -p 6382 -a hoge info | egrep 'role'
role:slave
$ redis-cli -p 6383 -a hoge info | egrep 'role'
role:slave
```
# Redis の冗長化確認
Master に値をセットし Slave に反映されることを確認します
6381 ポートにデータを更新すると 6382/6383に同期（冗長化）されます

下記は、キー "fuga" に、値 "on" をセットしています

```bash
$ redis-cli -p 6381 -a hoge set fuga on
OK
$ redis-cli -p 6382 -a hoge get fuga
"on"
$ redis-cli -p 6383 -a hoge get fuga
"on"
```
キー fuga を削除しています

```bash
$ redis-cli -p 6381 -a hoge del fuga
(integer) 1
$ redis-cli -p 6382 -a hoge get fuga 
(nil)
$ redis-cli -p 6383 -a hoge get fuga 
(nil)
```

# 自動フェールオーバーの必要性
この構成では、Master を終了させても Slave は Slave のままです
Master が応答しなくなったら[自動でフェールオーバーするように（その３）](http://qiita.com/KurosawaTsuyoshi/items/e6a4def57c9a12f1d752)で設定します

以上です