(本番環境は非常に少数の人々がそうであるが)各インスタンスRedisのサーバーが複数のスレーブノードで構成することができ、また、二次スレーブノードを持つことができ、スレーブサーバは、複雑なツリー構造に編成することができます。
マスタースレーブレプリケーションの設定
マスタースレーブレプリケーションを構成しようとするために、我々は、少なくとも二つのRedisのサーバーインスタンスを必要としています。最も簡単な方法は、マスターとスレーブのディレクトリに、それぞれ、公式サイトのRedisのRedisサーバのバイナリ実行可能ファイルをダウンロードすることです。
redis.conf設定ファイルを作成すると、各ディレクトリにあります。マスター・スレーブ構成のスレーブ複製の例では、デフォルトの設定ファイルへのマスターの例としては、:
# 和主服务器 6379 区分
port 6380
# 主服务器 ip 端口
slaveof 127.0.0.1 6379
# 如果主服务器配置了密码请写在这个配置项中
# masterauth <master-password>
##
## 接下来的选项保留默认配置即可,这里仅做介绍
##
# 当与 master 断开连接或正在进行同步时
# yes: 仍然正常响应客户端请求,但可能返回过时数据
# no: 除 INFO 和 SLAVEOF 命令正常外,其它命令均返回 SYNC with master in progress 错误
slave-serve-stale-data yes
# 从服务器只读
slave-read-only yes
使用しredis-server redis.conf
、それぞれのインスタンスのRedisサーバを起動するコマンドを。使用するredis-cli -p 6380
サーバからのコマンドを:
127.0.0.1:6380> info Replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:16
master_sync_in_progress:0
slave_repl_offset:3640
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:0b4e100aa9e9fda54aeba2bc110316d811ac2ff6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3640
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3640
127.0.0.1:6380> get a
1
127.0.0.1:6380> set a 2
(error) READONLY You can't write against a read only slave.
SLAVEOF host port
あなたは、動的に属するサーバからマスターノードを変更することができます。SLAVEOF NO ONE
クローズコピー機能、及びマスターサーバサーバにスレーブ背面からの遷移は、同期を取得し、元のデータセットは破棄することができません。プライマリサーバに障害が発生した場合には、使用しSLAVEOF NO ONE
たスレーブサーバがマスターで持ち上げるようにコマンドを。
マスター・スレーブ原理をコピーします。
SYNC
2.8 Redisの年より前のバージョンでは、Redisのは、唯一のフルボリューム増分レプリケーションが大幅にマスタースレーブ同期の性能に影響を与えるレプリケーションをサポートしていませんサポートしています。
次のように前に2.8 Redisのマスタースレーブのレプリケーションプロセスのバージョンは以下のとおりです。
- スレーブSYNCコマンドはマスターに送信されます
- マスターコマンドの実行には、RDBファイルを生成bgsave。同時に、すべての新しい書き込みコマンドは、コピーバッファに書き込まれます
- マスターファイルは、スレーブRDBに送信されます
- スレーブへのマスタ同期バッファコマンドは、マスター・スレーブの同期が完了しました
PSYNC
Redisの2.8 PSYNC、SYNCコマンドを使用して起動する代わりにPSYNCの合計と増分レプリケーションレプリケーションを命じます。
マスタとスレーブノードは、すべての彼らの固有の識別としてRUNIDを持っています。
マスタとスレーブは、各増分レプリケーション時にコピーオフセット、識別の同期の進行状況を維持します。
マスターは、FIFOバッファ(レプリケーションバックログ)、1メガバイトのデフォルトサイズのコピーを保持します。
# 复制缓冲区大小
repl-backlog-size 1mb
# 当 master 不再与任何 slave 保持连接时,复制缓冲区可能被清空
# repl-backlog-ttl 用于配置从断开连接到清空缓冲区间隔的秒数
# 0 表示永不清除缓冲区
repl-backlog-ttl 3600
その後、我々はPSYNCコマンドのプロセスを説明するために始めることができます。
- マスタースレーブ同期要求
- スレーブは、任意のマスタまたはSLAVEOF NO ONEコマンドが実行されるを通じて同期されていない場合は、マスターが送信
PSYNC ? -1
要求された総量を同期化するコマンドを。 - それ以外の場合は、マスターが送信
psync <runid> <offset>
コマンドをオフセットIDが最後RUNIDマスター同期である増分同期の要件は、同期が相殺されます
- スレーブは、任意のマスタまたはSLAVEOF NO ONEコマンドが実行されるを通じて同期されていない場合は、マスターが送信
- マスター同期要求応答
- スレーブ増分同期要求を満たす場合:.. 1は同じ自体RUNID; 2同期が応答して、バッファ内の自身のコピーをオフセット
+continue
スレーブ同期にバッファ内のデータをコピーします - しかし、スレーブ増分同期要求は、2つの条件、または総量スレーブ同期要求上方に満たしていない場合は、同時に応答は
+fullresync <runid> <offset>
RUNIDが自己のIDであることを特徴とする請求、それ自体が同期オフセットオフセット、完全同期の量を実行します。
- スレーブ増分同期要求を満たす場合:.. 1は同じ自体RUNID; 2同期が応答して、バッファ内の自身のコピーをオフセット
- 彼らのバージョンが低すぎる場合にはサポートされていない
PSYNC
応答エラーでコマンドを、スレーブは同期にSYNCコマンドを使用しようとします。
衛兵
マスターに障害が発生した後、単純なマスタースレーブレプリケーション・アーキテクチャは使用できなくなり、Redisの公式センチネル(見張り)スタンバイスイッチング機構が自動的に高可用性を保証します。
プライマリノードに障害が発生した後にセンチネル節マスタ・スレーブ動作ノードの状態、および新しいプライマリノードの選出を監視するためのメカニズムのセットを介してセンチネル。
センチネルノードは定期的に3つのタスクを実行します。
-
マスターノードからセンチネルノード10秒間隔送信し
INFO
、トポロジを更新するためのコマンドを新しいスレーブノードを自動的に検知。 -
マスタノードに送信するごとに1Sセンチネルノード
PING
のハートビート検出コマンド。 -
すべて2Sにセンチネル節は、
__sentinel__:hello
センチネルノード情報とマスター情報チャネルの独自の理解を送信します。すべてのセンチネルノードは、チャネル、およびこの更新センチネルクラスタ情報をサブスクライブします。
センチネルノード検出マスターノードのハートビート応答タイムアウト、そのマスター主観的なオフラインの場合。この時点で、マスターは本当にそれだけでネットワーク障害がこのセンチネルノードとマスターとの間で発生するかもしれ崩壊している可能性があります。
彼はセンチネルオフラインマスター主観が他の歩哨に送信されることを考慮sentinel is-master-down-by addr
マスターオフラインかどうかを尋ねました。センチネルの半分以上は、組立ラインは、マスター客観的にオフラインと見なされるオフマスターがあったことを考慮すれば。
センチネルノードが選出する彼らの最初に受信され、マスター・ダウン・バイ見張りのリーダーのために、送信者のコマンド。ないノードが投票の次のラウンドに入ります票の半分以上受け取る場合は、1つのノードが取得する場合には半分以上の投票は、歩哨のリーダーになります。この選択プロセスは、Paxosアルゴリズムに似ています。
センチネルリーダーは新しいノードにスレーブマスターノードを選択するための責任があり、選択論理は以下のとおりです。
- 不健康アウトスレーブノードフィルタ
- 選択し
slave-priority
、最小のノードからの設定値。最小からスレーブ優先複数のノードと同様、次のステップに移行する場合 - オフセットノードの最大から[コピー]を選択し、どの手段で最も完全な上記のノードからのデータという。スレーブノードの複数が依然として同じであれば次のステップへのオフセットとして
- ノードRUNIDから最小値を選択します
新しいマスターノードの選出した後、アップグレードプロセスを実行します。
- SLAVEOF NO ONEコマンドは、新しいマスターノードであるためには、新たに選出されたマスターノードに対して発行されました
- 他のスレーブノードへSLAVEOF発行コマンドは、新しいマスターノードをたどります
- センチネルノードクラスタオフラインオフラインスレーブノードにマスター、その復帰後に新しいマスターを次のコマンドを更新します