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
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
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
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
REDISPORT=6381
★ REDISPORT が存在しない場合
pidfile="/var/run/redis/redis_6381.pid"
REDIS_CONFIG="/etc/redis/6381.conf"
$ sudo vi /etc/init.d/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
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)で設定します
以上です
Author And Source
この問題について(Redisを冗長化構成にする(フェールオーバー環境を構築するーその2)), 我々は、より多くの情報をここで見つけました https://qiita.com/KurosawaTsuyoshi/items/936c32bb8947fb907ef5著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .