Redis プライマリ-レプリカ レプリケーション設定ガイド
Redis レプリケーションは、高可用性、データ冗長性、および読み取りスケーラビリティを実現するための基本的なパターンです。プライマリ(旧称マスター)と1つ以上のレプリカ(旧称スレーブ)を設定することで、プライマリに書き込まれたデータが自動的に接続されているすべてのレプリカにコピーされることを保証します。
このガイドでは、Redis プライマリ-レプリカ レプリケーションの設定に関する包括的なステップバイステップのチュートリアルを提供します。堅牢で信頼性の高い Redis デプロイメントを構築するために必要な、必須の設定ディレクティブ、動的な設定方法、および重要な監視手順について説明します。
1. Redis レプリケーションの基本を理解する
Redis レプリケーションは非同期(プライマリがレプリカの書き込み確認を待たない)であり、高いパフォーマンスを可能にします。主に、初期同期と継続的同期の2つのフェーズで動作します。
フル同期(SYNC)
レプリカが初めてプライマリに接続したとき、または部分再同期を防ぐネットワーク障害の後、フル同期が発生します。
- レプリカはプライマリに
PSYNCコマンドを送信します。 - プライマリは、RDB スナップショットファイル(
.rdb)を生成するためにバックグラウンド保存プロセスを開始します。 - プライマリは、RDB が作成されている間に受信したすべての新しい書き込みコマンドをバッファリングします。
- RDB ファイルが完了すると、プライマリはそれをレプリカに送信します。
- レプリカは RDB ファイルをメモリにロードします。
- 最後に、プライマリはバッファリングされたすべての書き込みコマンドをレプリカに送信して同期させます。
部分再同期(PSYNC)
Redis 2.8 以降では、部分再同期がサポートされています。プライマリとレプリカのリンクが一時的に切断された場合、レプリカは、レプリケーションバックログバッファ(プライマリ上の設定可能な円形バッファ)を使用して、リンクが切断されてからの不足しているコマンドのみを要求できます。
2. 前提条件とセットアップ
レプリケーションを設定する前に、少なくとも2つの独立した Redis インスタンスが実行されていること(またはテストのために同じサーバー上で異なるポートで実行されている構成)を確認してください。
このガイドでは、以下のセットアップを想定しています。
| インスタンス | 役割 | IP アドレス | ポート | 設定ファイル |
|---|---|---|---|---|
| プライマリ | プライマリ | 192.168.1.100 | 6379 | redis-primary.conf |
| レプリカ 1 | レプリカ | 192.168.1.101 | 6380 | redis-replica-1.conf |
ステップ 2.1: プライマリインスタンスの設定
プライマリインスタンスがレプリカからの接続を受け入れる準備ができており、プライマリ自体の安定性が必要な場合に永続化(RDB または AOF)を管理するように設定されていることを確認してください。
重要なプライマリ設定:
- バインディング: プライマリがパブリック IP アドレスまたは
0.0.0.0にバインドされていることを確認してください(複数のマシンで実行する場合)。ファイアウォールを使用している場合は、レプリカの IP からポート 6379 が開いていることを確認してください。 - 永続化: レプリケーション自体には厳密には必要ありませんが、プライマリデータの永続化のために RDB/AOF を有効にすることを強くお勧めします。
# redis-primary.conf
port 6379
bind 0.0.0.0 # すべてのインターフェイスにバインド(外部レプリカに必要)
# RDB 永続化を有効にする
save 900 1
save 300 10
save 60 10000
ステップ 2.2: レプリカイインスタンスの設定
レプリカを設定する核心は replicaof ディレクティブにあります。これにより、インスタンスがどのプライマリとデータを同期するかを指示します。
重要なレプリカ設定:
- ポート: 同じマシンで実行している場合は、異なるポートを使用してください。
- レプリケーション ディレクティブ:
replicaofまたはslaveof(レガシー名)を使用してください。
# redis-replica-1.conf
port 6380
# *** 必須レプリケーション設定 ***
replicaof 192.168.1.100 6379
# レプリカは読み取り専用にする(Redis 5 以降のデフォルト)
replica-read-only yes
# HA が Sentinel/Cluster で処理される場合、レプリカでの永続化を無効にすることを推奨
# 再起動を迅速に行うために永続化が必要な場合は、有効のままにする。
save ""
注意: プライマリがパスワードで保護されている場合(
requirepassを使用)、レプリカは正常に認証するためにmasterauth <password>で設定する必要があります。
3. 実装方法
レプリケーション設定は、設定ファイル(redis.conf)を編集してサーバーを再起動するか、CONFIG SET コマンドを使用して動的に実装できます。
方法 3.1: 設定ファイル(本番環境推奨)
上記のように redis-replica-1.conf を更新した後、両方のインスタンスを起動します。
# プライマリを起動
redis-server redis-primary.conf
# レプリカ 1 を起動
redis-server redis-replica-1.conf
起動後、レプリカ 1 は 192.168.1.100:6379 のプライマリに接続しようとし、同期プロセスを開始します。
方法 3.2: 動的設定
Redis インスタンスが既に実行されていて、再起動せずにレプリカとして設定したい場合は、redis-cli を介して CONFIG SET を使用します。
-
レプリカに変換したいインスタンス(例ではポート 6380 で実行中)に接続します。
bash redis-cli -p 6380 -
レプリケーションコマンドを実行します。
bash 127.0.0.1:6380> replicaof 192.168.1.100 6379 OK
ポート 6380 のインスタンスは、以前のデータをすべて破棄し、新しいプライマリとのフル同期(SYNC)を開始します。
⚠️ 警告: レプリケーションの無効化
レプリカをスタンドアロンのプライマリインスタンスに戻すには、そのインスタンスで
replicaof no oneを実行します。
4. レプリケーションステータスの監視
データの一貫性を保証するために、接続ステータスの監視は不可欠です。プライマリとレプリカの両方で redis-cli を介して INFO replication コマンドを使用します。
4.1 プライマリステータスの確認
プライマリ(6379)に接続し、いくつのレプリカが接続されていて、そのステータスを確認します。
redis-cli -p 6379 INFO replication
期待される出力スニペット(プライマリ):
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.101,port=6380,state=online,offset=2048,lag=0
master_replid:a9b1c2...
master_replid2:000000...
master_repl_offset:2048
role:masterはその役割を確認します。connected_slaves:1はレプリカが認識されていることを確認します。state=onlineは望ましい安定状態です。lag=0(または非常に小さい数値)は、同期データ転送の成功したパフォーマンスを示します。
4.2 レプリカステータスの確認
レプリカ(6380)に接続し、プライマリリンクステータスを確認します。
redis-cli -p 6380 INFO replication
期待される出力スニペット(レプリカ):
# Replication
role:slave
master_host:192.168.1.100
master_port:6379
master_link_status:up
master_sync_in_progress:0
slave_priority:100
slave_read_only:1
role:slaveはその役割を確認します。master_link_status:upは接続がアクティブで正常であることを確認します。master_sync_in_progress:0は初期同期が完了したことを意味します。
5. レプリケーションのベストプラクティスと最適化
5.1 レプリカの読み取り専用モード
デフォルトでは、レプリカは読み取り専用(replica-read-only yes)です。これは重要な安全メカニズムです。レプリカへの書き込みを試みるとエラーが発生し、クラスター全体でのデータの一貫性を保証します。
読み取り専用モードを無効にした場合、レプリカへの書き込みはローカルになり、レプリケーションリンクが壊れてフル同期が発生すると上書きされます。
5.2 同期時間の最適化
データセットが非常に大きい場合、初期 SYNC プロセスに時間がかかることがあります。以下の要因を考慮してください。
- ネットワーク帯域幅: RDB 転送のためのプライマリとレプリカ間の十分な帯域幅を確保してください。
- RDB 生成: プライマリは RDB ファイルを生成するために CPU とディスク I/O を必要とします。同期中にサーバーに利用可能なリソースがあることを確認してください。
- レプリカでのディスク永続化の無効化(オプション): プライマリがすべての永続化を処理し、レプリカが読み取りスケーリングのためだけの場合、レプリカで
save ""を設定すると、RDB ファイルの書き込み I/O オーバーヘッドが回避され、再起動が高速化されます。
5.3 セキュリティとネットワーク設定
プライマリがインターネットにレプリケーションポート(6379 またはその他)を公開しないことが重要です。ファイアウォールルールを設定して、指定されたレプリカサーバーの IP アドレスからのレプリケーショントラフィックのみを許可してください。
5.4 読み取りスケーリングにレプリカを使用する
レプリケーションの主な利点は、読み取り負荷を分散することです。主に読み取り操作を実行するアプリケーションをレプリカインスタンスに指示し、プライマリを書き込み操作専用にすることで、システム全体の全体的なスループットを向上させます。
結論
Redis プライマリ-レプリカ レプリケーションの設定は、回復力のある高性能なアプリケーションを構築するために不可欠です。replicaof ディレクティブを正しく設定し、INFO replication を使用してリンクステータスを定期的に監視することで、高可用性と効果的な読み取りスケーリングの基盤を構築します。
このガイドでは基本的なセットアップに焦点を当てていますが、本番環境では、自動プライマリ昇格と障害検出のための Redis Sentinel、または複数のノードにわたるデータの自動パーティショニングと分散のための Redis Cluster のような、さらなる自動化レイヤーを統合することがよくあります。