ノード間の内部通信機構
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のソースの詳細を説明するまさか
私たちのレッスンこのフレームワークでは、主な関心事はアーキテクチャではなく、アーキテクチャの詳細レベルで、基本原則の基本的な考え方は明確に整理することです