Redisを冗長化構成にする(フェールオーバー環境を構築するーその2)


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

 (その1):Redisのインストール
 (その2):Redisの冗長化
 (その3):Redis-Sentinelによるフェールオーバー環境の構築

Redisの冗長化の概要

Redis を3インスタンス立ち上げ、複数の Redis でレプリケーション(データ同期)させます

なお混乱を避けるため、(その1)で構築した Redis は利用しません
各種ファイルをコピーして新たに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インスタンスごとに設定ファイルが必要です
(その1)で構築した Redis の設定ファイルをコピーして利用します

$ 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 起動されてしまいます。

$ sudo vi /etc/redis/6381.conf
6381.conf
pidfile /var/run/redis/redis_6381.pid
port 6381
logfile /var/log/redis/6381.log
dbfilename 6381.rdb
requirepass hoge
$ sudo vi /etc/redis/6382.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
$ sudo vi /etc/redis/6383.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 の起動スクリプトをコピーします

$ 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ファイルに変更していきます

$ sudo vi /etc/init.d/redis_1
redis_1
REDISPORT=6381
★ REDISPORT が存在しない場合
pidfile="/var/run/redis/redis_6381.pid"
REDIS_CONFIG="/etc/redis/6381.conf"
$ sudo vi /etc/init.d/redis_2
redis_2
REDISPORT=6382
★ REDISPORT が存在しない場合
pidfile="/var/run/redis/redis_6382.pid"
REDIS_CONFIG="/etc/redis/6382.conf"
$ sudo vi /etc/init.d/redis_3
redis_3
REDISPORT=6383
★ REDISPORT が存在しない場合
pidfile="/var/run/redis/redis_6383.pid"
REDIS_CONFIG="/etc/redis/6383.conf"

Redis の自動起動(サービス)登録と起動確認

サービスとして自動起動されるようにします
(その1)で登録したサービスは解除しておきます

$ sudo chkconfig redis off
$ sudo chkconfig redis_1 on
$ sudo chkconfig redis_2 on
$ sudo chkconfig redis_3 on
$ 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

登録が終わったら起動してみましょう
こちらも(その1)の起動サービスは落とします

$ 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 の実行プロセスが表示されることを確認します

$ 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

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

$ 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

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

$ 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 でパスワードの指定が必要です

$ 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" をセットしています

$ 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 を削除しています

$ 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 が応答しなくなったら自動でフェールオーバーするように(その3)で設定します

以上です