Redis マスター・スレーブ構成の構築と障害復旧ワークフロー

同期原理とデータ転送プロセス

Redis の複製システムでは、マスターノードがリード担当、スレーブノードが読み取り負荷分散またはバックアップ担当となります。初期化時には以下の流れでデータを整合させます。

  • スレーブ側からマスターへ SYNC パケットを送信し、状態同期を要求します。
  • マスター側は BGSAVE をトリガーして RDB スナップショットを作成し、同時に改変されたコマンドをメモリバッファに蓄積します。
  • RDB ファイル転送が完了した段階で、蓄積された差分コマンド(Write Ops)を順次ストリームとして送信し、最終的なデータ一致を実現します。

バージョン 2.8 以降では、ネットワーク切断後の再接続時に全量同期を行わず、最新のポインター情報を参照する PSYNC モードが採用されているため、中断からの再開が効率的に行えます。

環境構築とインスタンス準備

本番環境での検証のため、異なるポートを持つ複数の Redis インスタンスをローカルマシン上に立ち上げます。ディレクトリ構造を変更し、以下のポート構成を採用します。

ノード名ポート役割
Master-Node7001Primary
Slave-A7002Replica 1
Slave-B7003Replica 2

設定ファイル生成

各インスタンズ用のコンフィグレーションファイルを以下のように記述します。

# マスター設定 (7001 番ポート)
cat > /opt/redis/config_master.conf <<EOF
port 7001
daemonize yes
pidfile /opt/redis/pid_7001
loglevel notice
logfile "/opt/redis/log_7001.log"
dbfilename dump_rdb_7001.rdb
dir /opt/redis/data_7001
protected-mode no
EOF

# スレーブ設定 (7002 番ポート)
cat > /opt/redis/config_slave_a.conf <<EOF
port 7002
daemonize yes
pidfile /opt/redis/pid_7002
loglevel notice
logfile "/opt/redis/log_7002.log"
dbfilename dump_rdb_7002.rdb
dir /opt/redis/data_7002
protected-mode no
EOF</code>

サービス起動実行

生成した設定を使用して各プロセスを開始します。

redis-server /opt/redis/config_master.conf
redis-server /opt/redis/config_slave_a.conf
# 他のスレーブも同様に起動

複製リンクの確立

起動後にスレーブノードに対して、マスターのアドレスとポートを指定して連携関係を構築します。最新の仕様では SLAVEOF の代わりに REPLICAOF コマンドを使用することが推奨されます。

# スレーブ A からマスター 7001 への接続設定
redis-cli -p 7002 REPLICAOF 127.0.0.1 7001

# スレーブ B も同様に追加
redis-cli -p 7003 REPLICAOF 127.0.0.1 7001

ステータス確認と整合性テスト

設定が正常に行われたかを確認するために、以下の情報取得コマンドを実行します。

# 任意のノードで詳細を表示
redis-cli -p 7002 INFO replication
redis-cli -p 7003 INFO replication

正常な場合は connected_slaves や role フィールドに該当する値が表示されます。
書き込み操作を行い、データが反映されるか検証を行います。

# マスターでの書き込み
redis-cli -p 7001 SET session_key "test_value_001"

# スレーブでの読み出し確認
redis-cli -p 7002 GET session_key

フェイルオーバー対応シナリオ

マスターノードが停止した場合、スレーブ間の入れ替えを行う必要があります。

  1. マスター停止: 本来の主役であった 7001 ポートのプロセスをシャットダウンします。
redis-cli -p 7001 SHUTDOWN
  1. スレーブの昇格: 残存するスレーブノードの中から新しいリーダーを選定し、その役割を変更します。
# スレーブ A を独立させる
redis-cli -p 7002 REPLICAOF NO ONE
# これでマスターとしての機能が有効になります
  1. 他スレーブの再設定: もう片方のスレーブが、新しいマスターであるスレーブ A を参照するように接続を更新します。
# スレーブ B が新しいマスター (7002) に接続
redis-cli -p 7003 REPLICAOF 127.0.0.1 7002

この状態で両方のノードの状態情報 (INFO replication) を再度確認し、リンクが確立していることを確認してください。

タグ: redis Replication Master-Slave failover database-ops

9月26日 04:51 投稿