- サーバ環境
| サーバ名 | IPアドレス | OSバージョン |
|---|---|---|
| マスターサーバ | 10.30.10.1 | centos7.6 |
| スレーブサーバ1 | 10.30.10.2 | centos7.6 |
| スレーブサーバ2 | 10.30.10.3 | centos7.6 |
注意点:3台以上のサーバが必要で、2n+1(n≧1)のルールを満たす必要があります。そうでないと、センチネルが自動的にマスター-スレーブを切り替えることができません。
- Dockerを使用したRedis 1マスター2スレーブ環境の構築
2.1 Redisイメージのプル
Dockerがインストールされていることを前提とします。
- ネットワーク接続がある場合、直接オンラインでイメージをプルします
docker pull redis
- ネットワーク接続がない場合は、別のネットワーク接続があるサーバでダウンロードします
docker pull redis
docker save -o redis.tar redis
次に、Redisをデプロイするネットワーク接続がないサーバにredis.tarをアップロードし、ローカルイメージをプルします
docker load -i redis.tar
2.2 Redisのストレージ、ログ、設定ファイルのマウントパス作成
mkdir -p /home/redis/{data,conf,log}
2.3 redis.confファイルの取得とredis.logフォルダの作成と権限付与
cd /home/redis/conf
- ネットワーク接続がある場合はオンラインで取得
wget http://download.redis.io/redis-stable/redis.conf
- ネットワーク接続がない場合は、インターネットに接続できるPCから以下のURLでダウンロードし、サーバにアップロードします
http://download.redis.io/redis-stable/redis.conf
redis.logファイルの作成
touch /home/redis/log/redis.log
(ヒント:ログファイルが大きくなった場合は、削除して再作成し、Redisを再起動してください)
権限の付与
chmod 777 /home/redis/conf/redis.conf
chmod 777 /home/redis/log/redis.log
2.4 redis.conf(マスター)設定ファイルの変更
外部デバイスからの接続を許可
bind 0.0.0.0
保護モードを無効化
protected-mode no
バックグラウンド実行を無効化(注意:Docker実行時にはすでにバックグラウンドデーモンが動作しているため、yesにするとRedisが起動しなくなります)
daemonize no
ログファイルパスの設定(注意:このパスはコンテナ内のパスであり、ホストパスと間違えないでください)
logfile "/etc/redis.log"
マスターサーバパスワードの設定(注意:センチネルモードでは、マスターがダウンして再起動するとマスターがスレーブになるため、masterauthを設定しないと元のマスターにパスワード認証がなくなり、マスター-スレーブレプリケーションでエラーが発生します)
masterauth 123456
Redisパスワードの設定(注意:3台のサーバのRedisパスワードは必ず同じに設定してください。そうでないと、マスターがダウンした後に一台のスレーブRedisがマスターになると、他のスレーブRedisがsentinel設定ファイル内のsentinel auth-pass mymaster 123456でパスワードを検証しようとします。このsentinel auth-pass mymasterはredis.conf設定ファイル内のrequirepassに対応します)
requirepass 123456
2.5 redis.conf(スレーブ)設定ファイルの変更(両方のスレーブサーバで同様の変更)
外部デバイスからの接続を許可
bind 0.0.0.0
保護モードを無効化
protected-mode no
バックグラウンド実行を無効化(注意:Docker実行時にはすでにバックグラウンドデーモンが動作しているため、yesにするとRedisが起動しなくなります)
daemonize no
ログファイルパスの設定(注意:このパスはコンテナ内のパスであり、ホストパスと間違えないでください)
logfile "/etc/redis.log"
マスターIPとポートの設定(注意:この設定はmasterauth 123456の上に記述する必要があります。そうでないとRedisが起動しません)
slaveof 10.30.10.1 6379
マスターサーバパスワードの設定
masterauth 123456
Redisパスワードの設定(注意:3台のサーバのRedisパスワードは必ず同じに設定してください。そうでないと、マスターがダウンした後に一台のスレーブRedisがマスターになると、他のスレーブRedisがsentinel設定ファイル内のsentinel auth-pass mymaster 123456でパスワードを検証しようとします。このsentinel auth-pass mymasterはredis.conf設定ファイル内のrequirepassに対応します)
requirepass 123456
2.6 Dockerを使用したRedisコンテナの起動(3台のサーバで同じコマンドを実行)
起動コマンド
注意:ファイアウォールの6379ポートを開放してください
docker run --name redis \
--restart=always \
-p 6379:6379 \
-v /home/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /home/redis/data:/data \
-v /home/redis/log/redis.log:/etc/redis.log \
-d redis redis-server /etc/redis/redis.conf
コマンド解説
コンテナ名の設定
--name redis
ポート設定(ホストポート:コンテナポート)(注意:スレーブサーバのポートは6379である必要があります。そうでないと自動マスタースレーブ切り替えができません)
-p 6379:6379
Docker起動時に自動的にRedisを起動する設定
--restart=always
設定ファイルのマウント(設定ファイルの変更を容易にするため)
-v /home/redis/conf/redis.conf:/etc/redis/redis.conf
ストレージファイルのマウント
-v /home/redis/data:/data
ログファイルのマウント(運用時のログ確認を容易にするため)
-v /home/redis/log/redis.log:/etc/redis.log
Redisイメージを指定し、設定ファイルを使用して起動
-d redis redis-server /etc/redis/redis.conf
2.7 マスタースレーブとレプリケーション機能の検証
- マスタースレーブ構成の確認
docker exec -it redis bash -c "redis-cli -a 123456 info replication"
マスターでは以下のように表示され、2台のスレーブがオンライン状態であることを確認できます
Replication
role:master connected_slaves:2 slave0:ip=10.30.10.2,port=6379,state=online slave1:ip=10.30.10.3,port=6379,state=online
スレーブでは以下のように表示され、マスターへの接続が成功していることを確認できます
Replication
role:slave
master_host:10.30.10.1
master_port:6379
master_link_status:up
- レプリケーション機能の正常性確認
マスサーバにデータを挿入
127.0.0.1:6379>set a test
127.0.0.1:6379>get a
"test"が返ってくれば正常です
両方のスレーブサーバでデータを取得
127.0.0.1:6379>get a
"test"が返ってくれば、マスタースレーブレプリケーション機能は正常です
- センチネルモードの構築
3台のサーバすべてで以下の同じ操作を行います
3.1 redis-sentinel設定ファイルパスの作成
mkdir -p /home/sentinel/conf
3.2 設定ファイルの作成と変更
cd /home/sentinel/conf
- サーバにネットワーク接続がある場合は、オンラインで設定ファイルをダウンロード
wget http://download.redis.io/redis-stable/sentinel.conf
- サーバにネットワーク接続がない場合は、PCから以下のURLでダウンロードしサーバにアップロードします
http://download.redis.io/redis-stable/sentinel.conf
設定ファイル名の変更
mv sentinel.conf redis-sentinel.conf
設定ファイル内容の変更
外部デバイスからの接続を許可
bind 0.0.0.0
保護モードを無効化
protected-mode no
デーモンプロセスを無効化
daemonize no
ログパスの設定
logfile "/etc/sentinel.log"
mymasterはサーバ名として任意に設定可能、マスターサーバIP、ポート、センチネル票数を設定
sentinel monitor mymaster 10.30.10.1 6379 2
sentinel monitor mymaster 10.30.10.1 6379 2の下に挿入、mymasterはサービス名、123456はRedisサーバのパスワード
sentinel auth-pass mymaster 123456
タイムアウト時間の変更(単位:ミリ秒)、3秒に設定、1000ミリ秒=1秒
sentinel down-after-milliseconds mymaster 3000
3.3 センチネルコンテナの起動
起動コマンド
注意:ファイアウォールの26379ポートを開放し、起動順序はマスターからスレーブの順で行ってください
docker run --restart=always \
--privileged=true \
--name redis-sentinel \
-p 26379:26379 \
-v /home/sentinel/conf:/etc/redis/conf/ \
--net host \
-d redis \
redis-sentinel /etc/redis/conf/redis-sentinel.conf
コマンド解説
センチネルがDocker起動時に自動的に起動する設定
--restart=always
コンテナ名の設定
--name redis-sentinel
コンテナにroot権限を付与(重要!コンテナがホストにマウントされたredis-sentinel.confファイルを変更する権限が必要です。そうでないとエラーが発生します)
--privileged=true
ポート設定
-p 26379:26379
redis-sentinel設定ファイルディレクトリパスの設定(注意:ファイルパスを指定しないでください。指定するとマスタースレーブ切り替えに失敗します。ディレクトリをマウントしてください)
/home/sentinel/conf:/etc/redis/conf/
コンテナ内部ネットワークをホストネットワークと共有
--net host
Redisイメージを指定し、設定ファイルを使用して起動
-d redis
redis-sentinel /etc/redis/conf/redis-sentinel.conf
- 検証
4.1 センチネル状態の確認とredis-sentinel.confファイルの変更確認
コンテナに入らずに確認(3台のサーバで確認)
docker exec -it redis-sentinel bash -c "redis-cli -p 26379 info sentinel"
以下の情報が返ってくれば正常です。マスターIPとポートが正しく、2台のスレーブと3台のセンチネルが存在していればmyidの競合はなく、状態は正常です
master0:name=mymaster,status=ok,address=10.30.10.1:6379,slaves=2,sentinels=3
redis-sentinel.confファイルを直接確認
センチネル起動後、設定ファイルに自動で書き込まれるため、最下部に生成されたmyid、他2台サーバのIPとポート、およびそれらのセンチネルmyidが表示されます
問題がある場合は、コンテナ内でログを確認
docker exec -it redis-sentinel bash
cat /etc/sentinel.log
正常なログには、他2台サーバのredis、IP、ポート、および他2台サーバのセンチネルID、IP、ポートが表示されます
4.2 マスターサーバ障害時のマスタースレーブ切り替えのシミュレーション
マスターサーバのRedisサービスを停止
docker stop redis
2台のスレーブサーバのRedis情報を確認
docker exec -it redis bash -c "redis-cli -a 123456 info replication"
どちらかのサーバでrole:masterが表示され、スレーブが1台接続されていれば、マスタースレーブ切り替えは成功しています
2台のスレーブサーバのセンチネル状態を確認
docker exec -it redis-sentinel bash -c "redis-cli -p 26379 info sentinel"
正常の場合、以下のような情報が返ってきます。スレーブサーバ10.30.20.1がマスターに変わっていることがわかります
master0:name=mymaster,status=ok,address=10.30.20.1:6379,slaves=2,sentinels=3
停止していた元マスターサーバを起動
docker start redis
元マスターサーバのRedis情報を確認
docker exec -it redis bash -c "redis-cli -a 123456 info replication"
正常の場合、role:slaveが表示されます