Redis主従複製と哨兵

4960 ワード

Redisは、スレーブ・サーバを使用して、リード/ライトの分離を実現し、スループットを向上させるか、プライマリ・サーバの障害時にプライマリ・サーバに代わって可用性を向上させることができる.
各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以前のバージョンのマスター・スレーブ・レプリケーション・プロセスは次のとおりです.
  • 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です.
    #        
    repl-backlog-size 1mb
    
    #   master       slave      ,          
    # repl-backlog-ttl                     
    # 0          
    repl-backlog-ttl 3600

    次に、PSYNCコマンドが実行するプロセスについて説明します.
  • slaveはmasterに同期を要求する
  • slaveが任意のマスターと同期していないか、またはSLAVEOF NO ONEコマンドを実行していない場合、PSYNC ? -1コマンドをマスターに送信して全量同期を要求する.
  • それ以外の場合、runidは前回同期したマスターサーバのIDであり、offsetは同期オフセット量
  • であるpsync コマンドをmasterに送信する.
  • マスター応答同期要求
  • slaveがインクリメンタル同期を要求する場合:1.runidは自身と同じである.2.同期オフセットが自己複製バッファ内にある場合、応答+continueは複製バッファ内のデータをslave
  • に同期する.
  • slaveがインクリメンタル同期を要求するが、上記の2つの条件またはslaveが全量同期を要求しない場合、応答+fullresync は、runidが自己IDであり、offsetが自己同期オフセットである全量同期を実行する.

  • 自身のバージョンが低すぎてPSYNCコマンドがサポートされていない場合はerrorに応答し、slaveはSYNCコマンドを使用して同期を試みます.

  • 歩哨兵
    簡単なマスター・スレーブ・レプリケーション・アーキテクチャはmaster障害後に使用できなくなり、Redis政府は哨兵(sentinel)メカニズムを提供し、マスター・スタンバイの切り替えを自動的に実現し、高可用性を保証します.
    哨兵メカニズムは、1組の哨兵ノードを通じて主従ノードの運行状態を監視し、主従ノードが故障した後に新しい主節点を選挙する.
    歩哨ノードは3つのタスクをタイミング的に実行します.
  • 哨兵ノードは、トポロジーを更新し、新しいslaveノードを自動的に感知するために、10 sおきにマスタスレーブノードにINFOコマンドを送信する.
  • 哨兵ノードは1 sおきに主従ノードにPINGコマンドを送信して心拍検出を行う.
  • 哨兵ノードは2 sおきに__sentinel__:helloチャンネルに自身の哨兵ノード情報と自身が知っているmaster情報を送信する.すべての哨兵ノードがこのチャンネルを購読し、哨兵クラスタ情報を更新します.

  • 哨兵ノードがmasterノードの心拍応答がタイムアウトしたことを発見した場合、masterは主観的にラインオフしたと考えられる.この場合、masterは本当にクラッシュしているか、この哨兵ノードとmasterの間にネットワーク障害が発生しているだけかもしれません.
    マスターが主観的にラインオフしたと考えている哨兵は、他の哨兵にsentinel is-master-down-by addrを送ってマスターがラインオフしたかどうかを尋ねる.半数以上の哨兵がmasterがラインオフしたと判断した場合、masterは客観的にラインオフしたと判断する.
    哨兵ノードは、自分が最初に受け取ったis-master-down-byコマンドの送信者を哨兵指導者に選出します.あるノードが過半数の投票を受けると哨兵指導者となり、ノードが過半数の票を得なければ次の投票に入る.この選挙プロセスはPaxosアルゴリズムと似ています.
    哨兵指導者はslaveノードを選択して新しいmasterノードに昇格し、論理を選択します.
  • 不健康なslaveノード
  • を濾過する
  • slave-priority構成値が最も小さいスレーブノードを選択します.複数のスレーブノードslave-priorityが最小で同一である場合、次のステップ
  • に進む.
  • は、コピーオフセットが最も大きいスレーブノードを選択し、これは、このスレーブノード上のデータが最も完全であることを意味する.複数のslaveノードのオフセット量が同じであれば、次のステップ
  • に進む.
  • runid最小スレーブノード
  • を選択
    新しいmasterノードが選択されると、アップグレードプロセスが実行されます.
  • 新しく選択されたマスターノードにSLAVEOF NO ONEコマンドを発行し、新しいマスターノード
  • に昇格する.
  • 他のslaveノードに対してSLAVEOFコマンドを発行する新しいマスターノード
  • に従う.
  • 哨兵クラスタで下線のマスターノードを下線のslaveノードに更新し、その返信後に新しいマスター
  • に従うように命令する.