07-redisのsentinelモード

5863 ワード

Redisのsentinelモード
Sentinalの起動と初期化
  • 初期化サーバ
  • 通常のreidsサーバで使用するコードをSentinal専用コード
  • に置き換える.
  • 初期化Sentinel状態
  • 所与のプロファイルに従って、Sentinelの監視マスタサーバリスト
  • を初期化する.
  • プライマリサーバへのネットワーク接続
  • を作成する.
    サーバの初期化
    Sentinal専用コードの使用
    Sentinalステータスの初期化
    struct sentinelState {
        uint64_t    current_epoch;  //     ,        
        
        //         sentinel       
        //             
        //          sentinelRedisInstance    
        dict        *masters;   
        
        int         tilt;                   //     TITLYT  
        int         running_scripts;        //             
        mstime_t    tilt_start_time;        //   TILT     
        mstime_t    previous_time;      //               
        list        *scripts_queue;     //   FIFO  ,              
        
    } sentinel;
    

    Sentinalステータスのmastersプロパティの初期化
    typedef struct sentinelAddr {
        char *ip;
        int  port;
    } sentinelAddr;
    
    
    typedef struct sentinelRedisInstance {
        int             flags;              //    ,                  
        
        //                   
        //       sentinel    sentinel    
        //    ip:port,  “127.0.0.1:26379”
        char            *name;              //      
        
        char            *runid;             //     ID 
        uint64_t        config_epoch;       //     ,        
        sentinelAddr    *addr;              //     
        
        // SENTINEL down-after-millisenconds       
        mstime_t        down_after_period;  //                      
        
        // SENTINEL monitor        quorum  
        int             quorum;             //                     
        
        // SENTINEL parallel-syncs       
        int             parallel_syncs;     //           ,                       
        
        // SENTINEL failover-timeout       
        mstime_t        failover_timeout;   //              
        
        ...;
    } sentinelRedisInstance;
    

    プライマリ・サーバへのネットワーク接続の作成
    プライマリ・サーバへの非同期ネットワーク接続が2つ作成されます
  • コマンド接続
  • 購読接続
  • プライマリ・サーバ情報の取得
    sentinelのデフォルトでは、10秒ごとに1回の頻度でコマンド接続を介して監視されているプライマリサーバにINFOコマンドを送信し、INFOコマンドの返信を分析することでプライマリサーバの現在の情報を取得します.
    取得された情報には、次の2つの側面があります.
    一方、プライマリサーバ自体の情報
    一方、プライマリ・サーバの部下であるすべてのスレーブ・サーバ情報について-sentinelは、サーバからのアドレス情報をユーザーが提供する必要がなく、自動的にスレーブ・サーバを発見することができる.
    サーバからの情報の取得
    sentinelがプライマリ・サーバに新しいセカンダリ・サーバがあることを発見すると、sentinelはこれらの新しいセカンダリ・サーバに対して信頼できるインスタンス構造を作成するほか、サーバに接続されたコマンド接続とサブスクリプション接続も作成します.
    プライマリ・サーバとセカンダリ・サーバへの情報の送信
    sentinelのデフォルトでは、2秒ごとに1回の頻度で、コマンド接続によって監視されているすべてのプライマリ・サーバとサーバから次のフォーマットのコマンドが送信されます.
    PUBLISH __sentinel__:hello ",,,,,,,"
    

    このコマンドはサーバへの_sentinel_:helloチャンネルは、複数のパラメータからなる情報を送信します(s_先頭のパラメータはsentinel自体の情報を記録し、m_先頭のパラメータはプライマリサーバの情報を記録します)
    自主サーバとスレーブサーバからのチャンネル情報を受信
    sentinelがプライマリ・サーバまたはサーバからサブスクリプション接続を確立すると、sentinelはサブスクリプション接続を介してサーバに次のコマンドを送信します.
    subscribe __sentinel__:hello
    

    sentinel対_sentinel_:helloチャンネルの購読はsentinelとサーバの接続が切れるまで続きます
    sentinelが接続するサーバごとに、sentinelはコマンドでサーバに接続されます.sentinel_:helloチャンネルは情報を送信し、サブスクリプション接続を通じてサーバからの_sentinel_:helloチャンネル受信メッセージ
    sentinel辞書の更新
    sentinelプライマリサーバが作成したインスタンス構造のsentinel辞書には、sentinel自体を除いて、このプライマリサーバを監視する他のsentinelのすべての資料が保存されています.
    他のsentinelへのコマンド接続の作成
    sentinelがチャンネル情報を介して新しいsentinelを発見すると、新しいsentinelのためにsentinels辞書に対応するインスタンス構造を作成するだけでなく、新しいsentinelへのコマンド接続も作成されます.新しいsentinelも同様に、このsentinelへのコマンド接続を作成します.
    sentinel間ではサブスクリプション接続は作成されません
    主観ダウンライン状態の検出
    sentinelは、コマンド接続が作成されたすべてのインスタンス(プライマリサーバ、スレーブサーバ、その他のsentinelを含む)に、PINGコマンドを1秒に1回の頻度で送信し、インスタンスが返すPINGコマンドの返信によってインスタンスがオンラインであるかどうかを判断します.
    sentinelプロファイルのdown_after_millisecondsオプションはsentinel判定インスタンスが主観的なラインオフに入るのに要する時間の長さを制定した.
    インスタンスがdown_にある場合after_millisecondsミリ秒以内にsentinelに無効な返信が連続的に返されると、sentinelはこのインスタンスに対応するインスタンス構造を変更し、構造flagsプロパティでSRI_を開きます.S_DOWNは、このインスタンスが主観的な状態に入ったことを示すために識別される.
    複数のsentinel設定の主観的なオフラインは時々異なる場合があります
    客観的なラインオフ状態を検査する
    sentinelがプライマリ・サーバを主観的にオフラインと判断した後、このプライマリ・サーバが本当にオフラインであるかどうかを確認するために、同じプライマリ・サーバを監視している他のsentinelにも、プライマリ・サーバがオフライン状態に入ったと考えているかどうかを尋ねます(主観的にオフラインまたは客観的にオフラインであってもよい).
    sentinelが他のsentinelから十分な数のオフライン判定を受信すると、sentinelはサーバ判定ビットから客観的にオフラインし、プライマリサーバに対してフェイルオーバ操作を実行します.
    SENTINEL is-master-down-by-addrコマンドの送信
    sentinel使用:
    SENTINEL is-master-down-by-addr    
    

    コマンドは、他のsentinelがプライマリサーバがオフラインになったことに同意したかどうかを尋ねます.
    SENTINEL is-master-down-by-addrコマンドを受け入れる
      
    

    down_stateは1はプライマリサーバがオフラインになったことを表し、0はプライマリサーバがオフラインになっていないことを示す
    SENTINEL is-master-down-by-addrコマンドの返信を受ける
    他のsentinelから送信されたSENTINEL is-master-down-by-addrコマンドの返信に基づいて、sentinelは他のsentinelがプライマリサーバのオフライン数に同意したことを統計し、この数が構成指定の客観的なオフラインを判断するのに必要な数に達すると、sentinelはプライマリサーバインスタンス構造flags属性のSRI_O_DOWN IDがオンになっており、マスターサーバが客観的なオフライン状態になっていることを示しています
    客観的なラインオフ状態の判断条件は以下の配置書類に示す:
    ​ sentinel monitor master 127.0.0.1 6379 2
    2つのsentinelがプライマリサーバがオフライン状態に入ったと判断した場合、現在のsentinelはプライマリサーバが客観的なオフライン状態であると判定する
    異なるsentinelが客観的な下線状態を判断する条件は異なる可能性がある.
    選挙のリーダーシップ
    1つのプライマリ・サーバが客観的なダウンラインと判定されると、このダウンラインを監視するプライマリ・サーバの各sentinelが協議し、1つのリーダーSentineを選出し、リーダーSentineがダウンライン・サーバに対してフェイルオーバ操作を実行する
    選挙のリーダーSentineは自分で本を読みましょう.
    フェイルオーバ
  • は、ダウンラインされたプライマリ・サーバのすべてのセカンダリ・サーバの中から、セカンダリ・サーバを選択し、プライマリ・サーバ
  • に変換する.
  • は、ダウンラインされたプライマリ・サーバのすべてをサーバから新しいプライマリ・サーバ
  • にコピーするように変更する.
  • は、ラインオフしたプライマリサーバを新しいプライマリサーバのスレーブサーバに設定し、この古いプライマリサーバが再ラインアップすると、新しいプライマリサーバのスレーブサーバ
  • となる.
    参考:黄鍵宏先生の『redis設計と実現』、機械工業出版社