07-redisのsentinelモード
5863 ワード
Redisのsentinelモード
Sentinalの起動と初期化初期化サーバ 通常のreidsサーバで使用するコードをSentinal専用コード に置き換える.初期化Sentinel状態 所与のプロファイルに従って、Sentinelの監視マスタサーバリスト を初期化する.プライマリサーバへのネットワーク接続 を作成する.
サーバの初期化
Sentinal専用コードの使用
Sentinalステータスの初期化
Sentinalステータスのmastersプロパティの初期化
プライマリ・サーバへのネットワーク接続の作成
プライマリ・サーバへの非同期ネットワーク接続が2つ作成されますコマンド接続 購読接続 プライマリ・サーバ情報の取得
sentinelのデフォルトでは、10秒ごとに1回の頻度でコマンド接続を介して監視されているプライマリサーバにINFOコマンドを送信し、INFOコマンドの返信を分析することでプライマリサーバの現在の情報を取得します.
取得された情報には、次の2つの側面があります.
一方、プライマリサーバ自体の情報
一方、プライマリ・サーバの部下であるすべてのスレーブ・サーバ情報について-sentinelは、サーバからのアドレス情報をユーザーが提供する必要がなく、自動的にスレーブ・サーバを発見することができる.
サーバからの情報の取得
sentinelがプライマリ・サーバに新しいセカンダリ・サーバがあることを発見すると、sentinelはこれらの新しいセカンダリ・サーバに対して信頼できるインスタンス構造を作成するほか、サーバに接続されたコマンド接続とサブスクリプション接続も作成します.
プライマリ・サーバとセカンダリ・サーバへの情報の送信
sentinelのデフォルトでは、2秒ごとに1回の頻度で、コマンド接続によって監視されているすべてのプライマリ・サーバとサーバから次のフォーマットのコマンドが送信されます.
このコマンドはサーバへの_sentinel_:helloチャンネルは、複数のパラメータからなる情報を送信します(s_先頭のパラメータはsentinel自体の情報を記録し、m_先頭のパラメータはプライマリサーバの情報を記録します)
自主サーバとスレーブサーバからのチャンネル情報を受信
sentinelがプライマリ・サーバまたはサーバからサブスクリプション接続を確立すると、sentinelはサブスクリプション接続を介してサーバに次のコマンドを送信します.
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がプライマリサーバがオフラインになったことに同意したかどうかを尋ねます.
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設計と実現』、機械工業出版社
Sentinalの起動と初期化
サーバの初期化
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設計と実現』、機械工業出版社