まず、Sentinel は Redis のロード バランサーまたはプロキシではありません。
第二に、すべての障害がホストの死であるとは限りません。サーバーが短時間ハングしたり、ネットワーク ケーブルが抜かれたりすることがあります。このため、Redis インスタンスと同じホストで Sentinel を実行することはお勧めできません。Sentinel を使用してフェイルオーバーを管理している場合、Redis マスターとスレーブ以外のノードで実行されている Sentinel が 3 つ未満であると、問題が発生します。
Sentinel はクォーラム メカニズムを使用して、フェイルオーバーとスレーブに投票します。センチネルが 2 つ未満の場合、2 つ以上の Redis サーバーがマスターであると考えるスプリット ブレインのリスクがあります。
2 つのサーバーを実行し、それぞれでセンチネルを実行するシナリオを想像してください。1 つを失うと、信頼できるフェイルオーバー機能が失われます。
クライアントは Sentinel にのみ接続して、現在のマスター接続情報を学習します。クライアントが接続を失うたびに、このプロセスが繰り返されます。Sentinel は Redis のプロキシではありません。Redis のコマンドは直接 Redis に送られます。
Sentinel を 3 つ未満の Sentinel で実行する唯一の信頼できる理由は、サービス検出のためです。つまり、フェイルオーバー管理には使用しません。
2 つのホストのシナリオを考えてみましょう。
Host A: redis master + sentinel 1 (Quorum 1)
Host B: redis slave + sentinel 2 (Quorum 1)
このシナリオでホスト B が一時的にホスト A へのネットワーク接続を失った場合、ホスト B は自身をマスターに昇格させます。これで次のことができます。
Host A: redis master + sentinel 1 (Quorum 1)
Host B: redis master + sentinel 2 (Quorum 1)
Sentinel 2 に接続するすべてのクライアントはホスト B がマスターであると通知されますが、Sentinel 1 に接続するクライアントはホスト A がマスターであると通知されます (ロード バランサーの背後に Sentinel がある場合、クライアントの半分を意味します)。
したがって、最小限の許容可能な信頼性の高いフェイルオーバー管理を取得するために実行する必要があるのは、次のとおりです。
Host A: Redis master
Host B: Redis Slave
Host C: Sentinel 1
Host D: Sentinel 2
Host E: Sentinel 2
クライアントはセンチネルに接続し、Redis インスタンスの現在のマスターを (名前で) 取得してから、それに接続します。マスターが停止した場合、クライアントは接続をドロップする必要があり、クライアントは再び Sentinel に接続して新しい情報を取得する必要があります。
各クライアント ライブラリがこれをどの程度うまく処理できるかは、ライブラリによって異なります。
理想的には、ホスト C、D、および E は、Redis への接続元と同じホスト (つまり、クライアント ホスト) にあります。またはそれらを得た良いサンプリングを表します。ここでの主な目的は、Redis に接続する必要がある場所を確認していることを確認することです。これに失敗すると、クライアントと同じ DC/Rack/Region に配置されます。
クライアントにロード バランサーと通信させたい場合は、可能であればこれらの LB ノードに Sentinel を配置し、必要に応じて非 LB ホストを追加して奇数の Sentinel > 2 を取得します。これに対する例外は、クライアント ホストは、その数が一貫していないという点で動的です (たとえば、トラフィックに応じてスケールアップし、遅い期間にダウンします)。このシナリオでは、Sentinel を非クライアントおよび非 redis サーバー ホストで実行する必要があります。
これを行う場合、マスター切り替えイベントの Sentinel PUBSUB チャネルを監視して LB を更新するデーモンを作成する必要があることに注意してください。これは、現在のマスターとのみ通信するように構成する必要があります (決して両方と通信しようとしないでください)。それを行うにはより多くの作業が必要ですが、Sentinel をクライアントに対して透過的に使用します。これは、LB IP/ポートと通信することしか認識していません。