11
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-02-06

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)で設定します

以上です

11
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?