インタビューシリーズ18 rediscluster原理

ノード間の内部通信機構

1、基本的な通信理論

ルーム(1)Redisのクラスタノードが通信するゴシッププロトコルを取ります

しかし、ノードの中央に格納されているクラスタ・メタデータ(ノード情報、障害、等)より集中異なるとすると、すべてのノードからクラスタ全体のデータを維持するために、互いに通信し続けるが完了し

クラスタのメタデータを維持し、集中しなければならない、ゴシップと呼ばれます

集中化:その更新の利点、およびメタデータを読み取るには、適時性は非常に良いですが、他のノードは、すぐに知覚読み取ることができたときに変更は即座に、集中ストレージへの更新メタデータがかつてありました。悪いですすべてのメタデータすべて一箇所に新たな圧力と、それは、メタデータ保存された圧力につながる可能性があること

ゴシップ:その更新プログラムのメタデータが散在メリット、一箇所に集中していないが、別の後に更新要求は、すべてのノードまで、一定の遅延は、圧力軽減アップデートを打つ;欠点を、遅延メタデータの更新があります一部の操作は、おそらくいくつかのヒステリシスのクラスタにつながります

私達はちょうど別の操作を行うには、reshardを行い、あなたは、言う構成エラーを見つけるだろう、合意

(2)ポート10000

各ノードは、ノード間の通信のための専用ポートを有するポート番号+10000は、7001などのサービス自体、提供され、その後、ノード間通信のためのポート17001であります

その他の点は、ピングを受信しながら、すべてのノードのいくつかの他のノード意志間隔にピンポン・リターン・メッセージを送信した後

情報(3)為替

追加し、障害情報を削除し、ノード、ハッシュスロット情報など

2、ゴシッププロトコル

ピング、ピンポン、満たしを含む複数のメッセージを含むゴシップ・プロトコル、失敗、等

満たす:新しいノードを満たすために、送信ノードが追加され、新しいノードがクラスタに参加するように、新たなノードは、他のノードと通信を開始します

Redisの-trib.rbアドインノード

実際には、内部がクラスタに参加するために、そのノードに気づく、新しいノードにゴシップ満たすメッセージを送信することです

ピング:他のノードへの各ノードが頻繁に自身の状態が含まピング、ならびにクラスタ・メタデータ自体のメンテナンスは、pingによるメタデータの相互交換を送ります

各ノードは、しばしばクラスタは、ping、互いの間のデータの頻繁な交換、各メタデータの更新ごとに相互にPINGを送信します

ピンポン:pingのリターンと会うが、それは、自身の状態やその他の情報が含まれていますが、情報や更新情報をブロードキャストするために使用することができます

失敗:別のノードへのノードが決意した後、それが送信失敗し、他のノードがダウンして指定したノードの他のノードに通知することができません

3、pingの深さのニュース

非常に頻繁にするだけでなく、メタデータの一部を運ぶために、それがネットワークの負担を増大させることができるのping

各ノードは、それぞれが、最長のない通信の5つの他のノードを選択する、第二のpingごとに10回行います

もちろん、我々はcluster_node_timeout / 2に到達したノードの通信遅延を見つけた場合、その直後に背後あまりにも長い間、あまりにも長い間データ交換の遅延を避けるため、PINGを送信

一貫性のないメタデータ深刻な状況で、データのない交換、クラスタ全体が存在しない、例えば、二つのノード10分の間、問題が存在するであろう

そうcluster_node_timeout調整が比較的大きい場合、それは送信の頻度を減少させる調整することができます

すべてのpingが、自ノードのメッセージをもたらすことです、他のノードがデータ交換を送信させるための情報があり1/10

少なくとも三つの他のノードを含む情報、合計-2ノードの他のノードまで含む情報

-------------------------------------------------- -------------------------------------------------- ---

内部jedisの原則の第二に、クラスタ指向の実現

Javaクライアント・クライアントの開発、jedis、Redisの年代、Redisのクラスタは、クラスタAPIをjedis

いくつかの基本的な原則は、クラスタAPIクラスタはRedisのクラスタと対話jedis

クライアントのリダイレクトに基づいて1、

Redisの-CLI -c、自動リダイレクト

(1)要求のリダイレクト

クライアントはRedisの例を送信するために任意のコマンドを選択することができる、コマンドの各インスタンスが受信されるRedisのは、すべての対応するキーハッシュスロットを算出します

それはローカルでローカルに処理されている場合は、それ以外のクライアントに移動するので、クライアントのリダイレクト

クラスタキースロットのmykeyを、あなたはどのようなキーに対応するハッシュスロットを表示することができます

受信Redisの-CLIが移動した後、-cパラメータを追加することができる場合のRedis-CLI、それは自動リダイレクト要求をサポートして、自動的に対応するノードの実行にリダイレクトされます

(2)算出したハッシュスロット

算出されたハッシュスロットアルゴリズムCRC16は、キー値に従って計算され、次いで、対応するハッシュスロットを取得するために、16384モジュロ

ハッシュタグを手動でキー対応するスロットを指定することができ、同じキーのハッシュタグの下に、そのようなセットmykey1としてハッシュスロット、になり{100}とmykey2を設定:{100}

(3)ハッシュスロットを検索します

ゴシッププロトコルを介してノード間の交換データは、あなたが知っている各ハッシュ・スロット内のどのノードで

2、スマートjedis

(1)スマートjedisは何ですか

ほとんどの場合、要求が正しいノードを見つけるために、リダイレクトされた後に発生する可能性があるため、クライアントベースのリダイレクトが、それは、ネットワークIOを消費します

だから、そのようなJavaのRedisのクライアントとして、クライアントのほとんどはjedis、すべてのスマートです

ローカルhashslotを維持 - >ノードのマッピングテーブル、キャッシュ、ほとんどの場合、ローカルキャッシュに直接移動hashslot見つけることができます - >ノードを、ノードがリダイレクトによって移動する必要はありません。

(2)JedisCluster作品

各ノードJedisPoolの接続プールを作成し、>ノードマッピングテーブル - JedisClusterの初期化は、ランダムにノード、初期化hashslotを選択する場合

JedisClusterはローカルhashslotでJedisCluster最初のキーを計算し、ローカルマッピングテーブル内の対応するノードを検索し、各時間に基づいて動作を行います

そのノードまたは単にはhashslotを保持する場合は、[OK]を、このような動作reshardを行っている場合、そのノード上でもはやhashslotあり、それは移動返されません

JedisCluterのAPIに対応するノードのリターンが見つかっ移動した場合、その後、メタデータを使用して、ノードは、ローカルhashslotを更新 - >ノードマッピングテーブルキャッシュ

あなたが対応するノードが見つかるまでリトライ5回以上は、JedisClusterMaxRedirectionException与えられている場合、上記の手順を繰り返し

jedisクラスタノード障害がまだ完全自動切替回復しない場合に古いバージョンが発生することが、頻繁な更新がスロットをハッシュは、しばしばネットワークIOオーバーヘッドの多くをもたらす、アクティブノードのpingを確認します

jedis最新バージョンは、これらの過度のハッシュスロット更新とpingのために、同様の問題を回避するために最適化されています

(3)hashslotの移行とリダイレクトを尋ねます

ハッシュスロットを移行する場合は、その後、jedisにリダイレクト依頼する戻ります

jedisがリダイレクトを尋ねる受け取った後、実行するターゲット・ノードに再配置されますが、ハッシュスロットが尋ねるのでJedisCluster APIはhashslotが更新されないように、ローカルキャッシュを尋ねる受け、移行中に発生

すでにローカルhashslot->ノードマッピングテーブルキャッシュを更新する移動、hashslotが終わっ移行した、と述べた決定することができ

-------------------------------------------------- -------------------------------------------------- ---

第三に、高可用性とスタンバイスイッチング原則

ほぼ同様センチネルと高可用性の原則のRedisクラスター、

1、決意ノードのダウンタイム

ノードは他のノードがダウンしたとみなした場合、それはpfail、主観的なダウンタイムがあります

複数のノードが他のノードがダウンしたと見なされた場合、それは、ほぼ同じ原理センチネル、SDOWN、odownで、客観的ダウンタイム、失敗であります

クラスタノードタイムアウトでは、ノードは、ピンポンを戻っていない、それは考えられるpfail

ノードがノードpfailを考慮した場合、ノードの半分以上がpfail考慮される場合、メッセージは、それが失敗となるであろう、他のノードへのpingは、pingをゴシップます

図2に示すように、ノードから濾過しました

マスタノードのダウンタイムは、すべてのスレーブノードからマスターノードが選択するように切り替えられます

切断された各タイムマスタとスレーブノードのノードをチェックし、クラスタ・ノード・タイムアウト*クラスタ・スレーブ妥当性要因よりも、それはマスターが対象となりませんとなった場合

これは、ノードタイムアウト濾過工程から、センチネルと同じです

ノード選挙から3、

、スレーブ優先順位をソートするすべてのノードから、オフセット、実行ID:センチネル

各スレーブノードは、すべてのノード、より多くの時間から選挙前面を大きく(より多くのコピーデータ)オフセット、選挙の時間を設定するマスタデータの独自のコピーを相殺するためによれば、選挙優先

(N / 2 + 1)マスターノードのほとんどは、ノードの一つのために投票した場合、投票する選挙を行うことをスレーブにすべてのマスターノード開始スレーブ世論調査では、、、その後、選挙を通じて、それはマスターにノードから切り替えることができます

スイッチング・ノードから実行待機マスタノードは、マスタノードからの切り替え

センチネルと比べて4、

全体のプロセスは、センチネルと比較して、強力な直接レプリケーション機能に統合され、センチネルのRedisのクラスタ、なるように、非常に似ています


で、深さ、あなたにそれが別々のコースを開く除き、コアの原則と設計の詳細を基礎となる設計のRedis、基本原理Redisの深さ分析、Redisのソースの詳細を説明するまさか

私たちのレッスンこのフレームワークでは、主な関心事はアーキテクチャではなく、アーキテクチャの詳細レベルで、基本原則の基本的な考え方は明確に整理することです

おすすめ

転載: www.cnblogs.com/xiufengchen/p/11259127.html