Dockerを用いたRedisクラスタ(1マスター2スレーブ)+ センチネルモードの実装

  1. サーバ環境

サーバ名 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)のルールを満たす必要があります。そうでないと、センチネルが自動的にマスター-スレーブを切り替えることができません。

  1. Dockerを使用したRedis 1マスター2スレーブ環境の構築

2.1 Redisイメージのプル

Dockerがインストールされていることを前提とします。

  1. ネットワーク接続がある場合、直接オンラインでイメージをプルします

docker pull redis

  1. ネットワーク接続がない場合は、別のネットワーク接続があるサーバでダウンロードします

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

  1. ネットワーク接続がある場合はオンラインで取得

wget http://download.redis.io/redis-stable/redis.conf

  1. ネットワーク接続がない場合は、インターネットに接続できる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 マスタースレーブとレプリケーション機能の検証

  1. マスタースレーブ構成の確認

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

  1. レプリケーション機能の正常性確認

マスサーバにデータを挿入

127.0.0.1:6379>set a test

127.0.0.1:6379>get a

"test"が返ってくれば正常です

両方のスレーブサーバでデータを取得

127.0.0.1:6379>get a

"test"が返ってくれば、マスタースレーブレプリケーション機能は正常です

  1. センチネルモードの構築

3台のサーバすべてで以下の同じ操作を行います

3.1 redis-sentinel設定ファイルパスの作成

mkdir -p /home/sentinel/conf

3.2 設定ファイルの作成と変更

cd /home/sentinel/conf

  1. サーバにネットワーク接続がある場合は、オンラインで設定ファイルをダウンロード

wget http://download.redis.io/redis-stable/sentinel.conf

  1. サーバにネットワーク接続がない場合は、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

  1. 検証

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が表示されます

タグ: redis Docker センチネル マスタースレーブ 高可用性

5月19日 02:20 投稿