Redis主従複製と哨兵
4960 ワード
Redisは、スレーブ・サーバを使用して、リード/ライトの分離を実現し、スループットを向上させるか、プライマリ・サーバの障害時にプライマリ・サーバに代わって可用性を向上させることができる.
各Redisサーバインスタンスは複数のslaveノードを構成することができ、slaveサーバは二次slaveノードを持つこともでき、複雑なツリー構造に組織することができる(生産環境ではそうする人は少ないが).
マスターコピーの構成
プライマリ・スレーブ・レプリケーションを構成するには、少なくとも2つのredisサーバ・インスタンスが必要です.最も簡単な方法は、redisの公式サイトでredis-serverバイナリ実行可能ファイルをダウンロードし、masterディレクトリとslaveディレクトリにそれぞれ配置することです.
各ディレクトリにredisをそれぞれ作成する.confプロファイル.マスターインスタンスのプロファイルはデフォルトで、slaveインスタンスでプライマリ・セカンダリ・レプリケーション構成を行います.
主従複製の原理
SYNC
Redis 2.8以前のバージョンでは、Redisはフルレプリケーションのみをサポートし、インクリメンタルレプリケーションはサポートされておらず、プライマリ・スレーブの同期のパフォーマンスに大きな影響を及ぼしていました.
Redis 2.8以前のバージョンのマスター・スレーブ・レプリケーション・プロセスは次のとおりです. slaveはSYNCコマンドをmaster に送信する. masterはbgsaveコマンドを実行してrdbファイルを生成する.同時に、すべての新しい書き込みコマンドがレプリケーションバッファ内の に書き込まれる. master rdbファイルをslave に送信 masterバッファ内のコマンドをslaveに同期し、プライマリスレーブ同期 を完了する.
PSYNC
Redis 2.8はSYNCコマンドの代わりにPSYNCコマンドの使用を開始し、PSYNCはフルコピーおよびインクリメンタルコピー機能を有する.
masterノードとslaveノードは、runidを独自の識別子として持っています.
masterとslaveは、それぞれ1つのレプリケーションオフセット量を維持し、インクリメンタルレプリケーション時に同期の進捗状況を識別します.
masterはFIFOのレプリケーションバッファ(replication backlog)を維持し、デフォルトのサイズは1 mbです.
次に、PSYNCコマンドが実行するプロセスについて説明します. slaveはmasterに同期を要求する slaveが任意のマスターと同期していないか、またはSLAVEOF NO ONEコマンドを実行していない場合、 それ以外の場合、runidは前回同期したマスターサーバのIDであり、offsetは同期オフセット量 である
マスター応答同期要求 slaveがインクリメンタル同期を要求する場合:1.runidは自身と同じである.2.同期オフセットが自己複製バッファ内にある場合、応答 に同期する. slaveがインクリメンタル同期を要求するが、上記の2つの条件またはslaveが全量同期を要求しない場合、応答
自身のバージョンが低すぎて
歩哨兵
簡単なマスター・スレーブ・レプリケーション・アーキテクチャはmaster障害後に使用できなくなり、Redis政府は哨兵(sentinel)メカニズムを提供し、マスター・スタンバイの切り替えを自動的に実現し、高可用性を保証します.
哨兵メカニズムは、1組の哨兵ノードを通じて主従ノードの運行状態を監視し、主従ノードが故障した後に新しい主節点を選挙する.
歩哨ノードは3つのタスクをタイミング的に実行します.哨兵ノードは、トポロジーを更新し、新しいslaveノードを自動的に感知するために、10 sおきにマスタスレーブノードに 哨兵ノードは1 sおきに主従ノードに 哨兵ノードは2 sおきに
哨兵ノードがmasterノードの心拍応答がタイムアウトしたことを発見した場合、masterは主観的にラインオフしたと考えられる.この場合、masterは本当にクラッシュしているか、この哨兵ノードとmasterの間にネットワーク障害が発生しているだけかもしれません.
マスターが主観的にラインオフしたと考えている哨兵は、他の哨兵に
哨兵ノードは、自分が最初に受け取ったis-master-down-byコマンドの送信者を哨兵指導者に選出します.あるノードが過半数の投票を受けると哨兵指導者となり、ノードが過半数の票を得なければ次の投票に入る.この選挙プロセスはPaxosアルゴリズムと似ています.
哨兵指導者はslaveノードを選択して新しいmasterノードに昇格し、論理を選択します.不健康なslaveノード を濾過する に進む.は、コピーオフセットが最も大きいスレーブノードを選択し、これは、このスレーブノード上のデータが最も完全であることを意味する.複数のslaveノードのオフセット量が同じであれば、次のステップ に進む. runid最小スレーブノード を選択
新しいmasterノードが選択されると、アップグレードプロセスが実行されます.新しく選択されたマスターノードにSLAVEOF NO ONEコマンドを発行し、新しいマスターノード に昇格する.他のslaveノードに対してSLAVEOFコマンドを発行する新しいマスターノード に従う.哨兵クラスタで下線のマスターノードを下線のslaveノードに更新し、その返信後に新しいマスター に従うように命令する.
各Redisサーバインスタンスは複数のslaveノードを構成することができ、slaveサーバは二次slaveノードを持つこともでき、複雑なツリー構造に組織することができる(生産環境ではそうする人は少ないが).
マスターコピーの構成
プライマリ・スレーブ・レプリケーションを構成するには、少なくとも2つのredisサーバ・インスタンスが必要です.最も簡単な方法は、redisの公式サイトでredis-serverバイナリ実行可能ファイルをダウンロードし、masterディレクトリとslaveディレクトリにそれぞれ配置することです.
各ディレクトリにredisをそれぞれ作成する.confプロファイル.マスターインスタンスのプロファイルはデフォルトで、slaveインスタンスでプライマリ・セカンダリ・レプリケーション構成を行います.
# 6379
port 6380
# ip
slaveof 127.0.0.1 6379
#
# masterauth
##
## ,
##
# master
# yes: ,
# no: INFO SLAVEOF , SYNC with master in progress
slave-serve-stale-data yes
#
slave-read-only yes
redis-server redis.conf
コマンドを使用して、redis-serverインスタンスをそれぞれ起動します.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
は、サーバが属するmasterノードを動的に変更することができる.SLAVEOF NO ONE
レプリケーション機能をオフにし、slaveサーバからmasterサーバに移行します.同期して得られたデータセットは破棄されません.プライマリ・サーバが障害が発生した場合、SLAVEOF NO ONE
コマンドを使用してslaveサーバをmasterに昇格できます.主従複製の原理
SYNC
Redis 2.8以前のバージョンでは、Redisはフルレプリケーションのみをサポートし、インクリメンタルレプリケーションはサポートされておらず、プライマリ・スレーブの同期のパフォーマンスに大きな影響を及ぼしていました.
Redis 2.8以前のバージョンのマスター・スレーブ・レプリケーション・プロセスは次のとおりです.
PSYNC
Redis 2.8はSYNCコマンドの代わりにPSYNCコマンドの使用を開始し、PSYNCはフルコピーおよびインクリメンタルコピー機能を有する.
masterノードとslaveノードは、runidを独自の識別子として持っています.
masterとslaveは、それぞれ1つのレプリケーションオフセット量を維持し、インクリメンタルレプリケーション時に同期の進捗状況を識別します.
masterはFIFOのレプリケーションバッファ(replication backlog)を維持し、デフォルトのサイズは1 mbです.
#
repl-backlog-size 1mb
# master slave ,
# repl-backlog-ttl
# 0
repl-backlog-ttl 3600
次に、PSYNCコマンドが実行するプロセスについて説明します.
PSYNC ? -1
コマンドをマスターに送信して全量同期を要求する.psync
コマンドをmasterに送信する.+continue
は複製バッファ内のデータをslave +fullresync
は、runidが自己IDであり、offsetが自己同期オフセットである全量同期を実行する.PSYNC
コマンドがサポートされていない場合はerrorに応答し、slaveはSYNCコマンドを使用して同期を試みます.歩哨兵
簡単なマスター・スレーブ・レプリケーション・アーキテクチャはmaster障害後に使用できなくなり、Redis政府は哨兵(sentinel)メカニズムを提供し、マスター・スタンバイの切り替えを自動的に実現し、高可用性を保証します.
哨兵メカニズムは、1組の哨兵ノードを通じて主従ノードの運行状態を監視し、主従ノードが故障した後に新しい主節点を選挙する.
歩哨ノードは3つのタスクをタイミング的に実行します.
INFO
コマンドを送信する.PING
コマンドを送信して心拍検出を行う.__sentinel__:hello
チャンネルに自身の哨兵ノード情報と自身が知っているmaster情報を送信する.すべての哨兵ノードがこのチャンネルを購読し、哨兵クラスタ情報を更新します.哨兵ノードがmasterノードの心拍応答がタイムアウトしたことを発見した場合、masterは主観的にラインオフしたと考えられる.この場合、masterは本当にクラッシュしているか、この哨兵ノードとmasterの間にネットワーク障害が発生しているだけかもしれません.
マスターが主観的にラインオフしたと考えている哨兵は、他の哨兵に
sentinel is-master-down-by addr
を送ってマスターがラインオフしたかどうかを尋ねる.半数以上の哨兵がmasterがラインオフしたと判断した場合、masterは客観的にラインオフしたと判断する.哨兵ノードは、自分が最初に受け取ったis-master-down-byコマンドの送信者を哨兵指導者に選出します.あるノードが過半数の投票を受けると哨兵指導者となり、ノードが過半数の票を得なければ次の投票に入る.この選挙プロセスはPaxosアルゴリズムと似ています.
哨兵指導者はslaveノードを選択して新しいmasterノードに昇格し、論理を選択します.
slave-priority
構成値が最も小さいスレーブノードを選択します.複数のスレーブノードslave-priorityが最小で同一である場合、次のステップ新しいmasterノードが選択されると、アップグレードプロセスが実行されます.