Redis Centinelメカニズムと使い方(二)


概要
Redis-SentineはRedisが公式に推奨する高可用性(HA)ソリューションであり、RedisをMaster-slaveの高可用性ソリューションとして使用する場合、masterがダウンタイムした場合、Redis自体(多くのクライアントを含む)は自動的にプライマリ・スタンバイ・スイッチングを実現していないが、Redis-sentinel自体も独立して動作するプロセスであり、複数のmaster-slaveクラスタを監視することができる.マスターがダウンタイムしていることを発見したら、自分で分かるように切り替えることができます.
主な機能は以下の点です.
  • は、redisが予想通りに良好に動作するかどうかを時々監視する.
  • redisノードの実行状況が発見された場合、別のプロセス(例えばクライアント)に通知することができる.
  • は自動切替が可能である.1つのmasterノードが使用できない場合、masterの複数のslave(1つ以上のslaveがある場合)のうちの1つを新しいmasterとして選択することができ、他のslaveノードは、それに追随するmasterのアドレスをmasterのslaveに昇格された新しいアドレスに変更する.

  • failoverがない場合の構成修正
    現在failoverが進行していない場合でも、sentinelは現在の構成を使用して監視のmasterを設定します.特に、
  • 最新の構成に従ってslavesと確認されたノードは、master(上記の例ではネットワークによって隔離されたredis 3を参照)であると主張し、現在のmasterのslaveとして再構成される.
  • slavesが誤ったmasterに接続されている場合、修正され、正しいmasterに接続されます.

  • Slave選挙と優先度
    sentinelがfailoverを行う準備ができ、他のsentinelの許可を受けた場合、新しいmasterとして適切なslaveを選出する必要があります.
    slaveの選挙は主にslaveの以下のいくつかの面を評価します.
  • masterから切断する回数
  • .
  • Slaveの優先度
  • データレプリケーションの下付き(slaveが現在どれだけmasterを持っているかを評価するためのデータ)
  • プロセスID
  • 1つのslaveがmasterと10回以上連絡を失い、毎回構成の最大接続時間(down-after-milliseconds option)を超え、sentinelがfailoverを行ったときにslave接続を失ったことを発見した場合、このslaveはsentinelによって新しいmasterに適していないと判断される.
    より厳密な定義は、slaveが接続を切断し続ける時間が
    (down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state

    選挙資格を失うと思われます.上記の条件を満たすslaveはmaster候補者リストに登録され、以下の順序でソートされます.
  • sentinelはまずslavesの優先度に基づいてソートされ、優先度が小さいほど上位(?)にランクされます.
  • 優先度が同じであれば、masterから受信したレプリケーションデータがどれが多いか、どれが上位にあるかをレプリケーションの下付きを表示します.
  • 優先度と下付き文字が同じであれば、プロセスIDの小さいものを選択します.

  • 1つのredisはmasterでもslaveでも、構成にslave優先度を指定する必要があります.マスターもfailoverでslaveになる可能性があることに注意してください.
    redisのslave優先度が0の場合、masterは選択されません.しかし、masterのどこからデータがコピーされますか.
    SentinalとRedis認証
    クライアントとslaveは、masterが接続するためにパスワードが必要になるように構成されている場合、接続時にパスワードを指定する必要があります.
    マスターはrequirepassで自分のパスワードを設定し、パスワードを提供しないとこのマスターに接続できません.slaveはmasterauthでmasterにアクセスする際のパスワードを設定します.
    ただしsentinelを使用すると、1つのmasterがslaveになり、1つのslaveがmasterになる可能性があるため、上記の2つの構成項目を同時に設定する必要があります.
    Sentinel API
    Sentinelはデフォルトで26379ポートで動作し、sentinelはredisプロトコルをサポートするため、redis-cliクライアントまたは他の利用可能なクライアントを使用してsentinelと通信することができます.
    sentinelと通信できる方法は2つあります.
  • は、クライアントを直接使用してメッセージを送信する
  • である.
  • のもう1つは、failoverやredisインスタンスの実行エラーなど、sentinelイベントを購読するためにパブリッシュ/購読モードを使用することです.

  • Sentinalコマンド
    sentinelがサポートする合法的な命令は以下の通りです.
  • PING sentinelはPONGに返信する.
  • SENTINEL mastersは、監視するすべてのマスターおよびそれらの状態を表示する.
  • SENTINEL master 指定masterの情報と状態を表示する.
  • SENTINEL slaves は、指定されたmasterのすべてのslaveおよびそれらの状態を表示する.
  • SENTINEL get-master-addr-by-name は、指定したmasterのipとポートを返し、failoverまたはfailoverが完了している場合、masterに昇格したslaveのipとポートが表示されます.
  • SENTINEL reset 名前が正規表現に一致するすべてのmasterの状態情報、それ以前の状態情報、およびslaves情報をリセットする.
  • SENTINEL failover sentinelにfailoverを強制し、他のsentinelの同意を得る必要はありません.ただしfailoverの後、最新の構成は他のsentinelに送信されます.

  • Centinel構成の動的変更
    redis 2から8.4からsentinelは、masterの構成を追加、削除、変更するためのAPIのセットを提供します.
    APIでsentinelの構成を変更した場合、sentinelは変更した構成を他のsentinelに伝えません.複数のsentinelに対して構成を変更するコマンドを手動で送信する必要があります.
    次はsentinel構成を変更するコマンドです.
  • SENTINEL MONITOR  このコマンドはsentinelに新しいmaster
  • を傍受するように伝えた.
  • SENTINEL REMOVE sentinelにあるmasterに対する傍受を放棄するように命令する
  • SENTINEL SET このコマンドは、指定したマスターの構成を変更するためにRedisのCONFIG SETコマンドに似ています.複数をサポートします.例えば、
  • SENTINEL SET objects-cache-master down-after-milliseconds 1000

  • プロファイルに存在するプロファイル項目であれば、SENTINEL SETコマンドで設定できます.これはmasterのプロパティ、例えばquorum(票数)を設定するためにも使用できますが、masterを削除してからmasterを再追加する必要はありません.例:
    SENTINEL SET objects-cache-master quorum 5

    Sentinalの追加または削除
    sentinel自動発見メカニズムがあるため、sentinelをクラスタに追加するのは簡単です.Masterに監視するだけで、新しく追加したsentinelは他のsentinelの情報とmasterdのすべてのslaveを得ることができます.
    複数のsentinelを追加する必要がある場合は、ネットワーク分離による問題を予防するために、次から次へと追加することをお勧めします.30秒ごとにsentinelを追加することができます.最後にSENTINEL MASTER masternameを使って、すべてのsentinelがmasterに監視されているかどうかを確認することができます.
    sentinelを削除するのは少し複雑です.sentinelは組織と長い間連絡を失っていても、すでに存在しているsentinelを削除しないからです.sentinelを削除するには、次の手順に従います.
  • 削除するsentinel
  • を停止する
  • は、SENTINEL RESET * コマンドを他のすべてのsentinelインスタンスに送信します.指定したmasterの上のsentinelをリセットするには、*番号を特定の名前に変更するだけです.送信間隔は30秒を下回らないことに注意してください.
  • すべてのsentinelsに一致する現在のsentinel数があるかどうかを確認します.SENTINEL MASTER masternameを使用してクエリーを行います.

  • 古いマスターを削除するかslaveに達しない
    sentinelは、slaveが組織と長い間つながっていなくても、Masterのslavesを記録します.これはsentinelクラスタがリカバリ可能なslaveを再構成する能力が必要であるため、有用である.
    また、failoverの後、失効したmasterは新しいmasterのslaveとしてマークされ、使用可能になると新しいmasterからデータがコピーされます.
    その後、slave(かつてmasterだった可能性があります)を永久に削除したい場合があります.SENTINEL RESET masterコマンドをすべてのsentinelsに送信するだけで、リストにmasterデータを正しくコピーできるslaveが更新されます.
    パブリッシュ/サブスクリプション
    クライアントは、あるチャネルのイベントを購読するコマンドをsentinelに送信することができ、特定のイベントが発生すると、sentinelはすべての購読クライアントに通知します.クライアントはサブスクリプションのみで、パブリッシュできないことに注意してください.
    サブスクリプションチャンネルの名前はイベントの名前と一致します.たとえば、sdownというチャンネル名は、SDOWNに関連するすべてのメッセージを購読者に公開します.
    すべてのメッセージを購読するには、PSUBSCRIBE *を簡単に使用します.
    以下は、すべてのメッセージを購読した場合、受信できるすべてのメッセージのメッセージフォーマットです.最初の単語はチャンネルの名前で、他はデータのフォーマットです.
    注:次のinstance detailsのフォーマットは次のとおりです.
    @
    このredisインスタンスがmasterである場合、@以降のメッセージは表示されません.
        +reset-master  --  master    .
        +slave  --       slave    slave   .
        +failover-state-reconf-slaves  -- Failover    reconf-slaves   
        +failover-detected  --  failover   
        +slave-reconf-sent  -- sentinel  SLAVEOF         
        +slave-reconf-inprog  -- slave          master slave,          。
        +slave-reconf-done  -- slave          master slave         master   。
        -dup-sentinel  --     master    sentinel  (   sentinel     ,         ).
        +sentinel  --  master     sentinel 。
        +sdown  --   SDOWN   ;
        -sdown  --   SDOWN   。
        +odown  --   ODOWN   。
        -odown  --   ODOWN   。
        +new-epoch  --           。
        +try-failover  --   failover  ,     sentinel   。
        +elected-leader  --        failover   。
        +failover-state-select-slave  --        slave   master 。
        no-good-slave  --      slave    master
        selected-slave  --         slave    master
        failover-state-send-slaveof-noone  --       master slave          。
        failover-end-for-timeout  -- failover        。
        failover-end  -- failover     。
        switch-master      --  master        。               。
        +tilt --   Tilt  。
        -tilt --   Tilt  。

    TILTモード
    redis sentinelはシステム時間に非常に依存しており、例えばPING返信にどのくらいの時間がかかったかを判断するためにシステム時間を使用します.しかし、システム時間が変更されたり、システムが非常に忙しい場合、プロセスが詰まったりすると、sentinelが正常に動作しない可能性があります.システムの安定性が低下すると,TILTモードはsentinelが入ることができる保護モードである.TILTモードに入るとsentinelはモニタリングを継続しますが、他の動作はありません.is-master-down-by-addrのようなコマンドにも応答しません.TILTモードでは、失効ノードを検出する能力が信頼できないためです.システムが正常に戻ると、30秒続くとsentinelはTITLモードを終了します.
    -BUSY状態
    注:この機能はまだ実装されていません.
    スクリプトの実行時間が構成の実行時間を超えると、sentinelは-BUSYエラー信号を返します.このことがfailoverをトリガーする前に発生した場合、sentinelはSCRIPT KILLコマンドを送信し、scriptが読み取り専用であれば正常に実行できます.