I.はじめに
- Redisのは、オープンソースのキー値ストレージシステム、すべての年齢層のインターネット企業の大多数です。redis3.0バージョンがサポートする唯一のシングルケース・モデル、サポートCluster 3.0の以降のバージョンの前に、ここに私のバージョンredis3.0.0です。
- P2Pモードを使用してクラスタをRedisの、完全に分散化され、中央ノードまたはプロキシノードが存在しません。
- クラスタは、クラスタに接続されたクラスタ(ノード)に接続された任意のノードは、クラスタが内部ノードである不均一入口クライアント(クライアント)でのRedis(PING-PONG機構)は、各ノードは、互いに通信しますRedisの例。
- 高可用性クラスタを実現するためには、(正しく機能)の健康かどうかを判断するために、そのノードは、Redisのクラスタを、このような投票のフォールトトレランスをしている:そのノードを切ったクラスタノードの投票場合と半数以上は、ノードがハングアップすることを信じて、 (失敗)。これは、ノードがメソッドにリンクされたか否かを判定する。
- だから、クラスタはそれのこつかどうかを確認する方法? - >クラスタ内のノードのいずれかがしていないノードのノード(バックアップノード)から、ハングアップした場合、クラスタはハングアップ。これは、クラスタ吊り方式か否かが判断されます。
- なぜたむろするために、任意のノード(ノードではないから)このクラスタがハングアップしますか? - >クラスタは16384スロット(スロットハッシュ)、およびこの[0から16383]スロット16384にマッピングされたすべての物理ノード、又は均一各ノードに割り当てられたスロットを構築しているので。ときRedisのクラスタ内のストアデータ(キーと値)に必要性を、Redisのは、最初にこのキーのCRC16アルゴリズムで、その後、結果を取得します。この結果は、次いでモジュロ16384を実行し、残りの部分は、それによってどのノードにキー値ストアを決定し、[0から16383]前記溝に対応することになります。だから、一度ノードをハングアップ、スロットに対応するノードが使用できない、それがクラスタにつながる仕事をしません。
- 要約すると、各クラスタの理論Redisのは、16,384ノードまで持つことができます。
2つの3クラスタモデル
図1に示すように、金型からマスタ
プライマリ・データベース(マスタ)とデータベース(スレーブ):マスタスレーブレプリケーションでは、データベースは2つのカテゴリに分けます。
スレーブは、マスタにSYNCコマンドを送信するためのイニシアチブを開始します。スナップショット(RDBの永続性)を保存するために、マスターSYNCコマンドを受信し、この時間の間、コマンドのスナップショットを保存し、バックグラウンドでスレーブに保存したスナップショットファイルとキャッシュコマンドを送信するためにキャッシングした後。スレーブがスナップショットファイルとスナップショットファイルとコマンド実行コマンドを受信した後にキャッシュをロードします。
フォルトを維持または、Redisのクラスタは、マスターノードのサブセットからのマスターモデルのノードの大部分使用しないときの通信が利用可能であるために、請求項1(マスターノード自体)からのN個のコピーを有する各ハッシュ・スロット(N)-1他のスレーブノード)。ノードBに障害が発生した場合、我々はもはや5501から11000の範囲働きで一方向ハッシュスロットを持っているので、A、B、Cを持つクラスタノードの例では、クラスタは、続行しないであろう。
(またはそれ以降)クラスタを作成する場合しかし、我々は、各スレーブノードにマスターノードを追加するように、マスタノードAの最終的なクラスタ、B、C、およびASスレーブノードA1、B1、C1の組成、もしノードBに障害が発生し、システムが継続することができるようになります。
ノードB1コピーBは、Bは失敗し、B1は、新しいマスターノードにアップグレードされたクラスタノードが正常に動作し続けます。
ノードBおよびB1が同時に故障した場合ただし、Redisのクラスタを続行できません。
問題を解決するには:
Redisのを決意単一の実施形態、パフォーマンスのボトルネックとバックアップデータが発生し、データの大きな体は、モデルからこの問題へのクラスタマスターの良いソリューションをRedisの。読み出しおよび書き込み動作は、システムのスループットを向上させるために、異なるRedisの例に分けることができます
新たな問題を紹介:
1は、configureの再接続の問題
異なるインスタンス、異なるIPアドレスと対応するポートをRedisの、インスタンスがダウンした場合、構成の変更は、再接続する必要があり
2、フェールオーバーの問題
ノード障害がオフラインで、失敗しない場合、そのようなマスターをオフラインとして、対応するスレーブ・ノードは、だけでなく、書き込み動作、読み出すことができ、マスタ機能を交換することができません。
次のような機能は次のとおりです。
- プライマリ・データベースが読むことができるとの書き込みは、書き込み操作が起こした場合、データの変更は自動的にデータベースからのデータに同期します
- 一般的に、データベースから読み取り専用で、プライマリ・データベースから同期してデータを受信します
- マスタは、複数のスレーブを有することができるが、スレーブがマスターのみに対応することができます
- スレーブは、マスタデータ同期から来る他のスレーブマスターの読み取りに影響を与え、再起動後に読み取りおよび書き込みせずにハングアップ
- マスターは読み取りスレーブには影響しません、後にハングアップ、もはやサービスを提供書くのRedis、Redisのは、マスターが再び書き込み、外部サービスを提供します後に再起動しません
- マスターをぶら下げた後、スレーブでマスターノードを再選択はありません
次のような欠点があります:
マスターがサービスRedisの外を書いて提供することができない場合は、マスタノードモードからメインシングルでは、高い可用性を持っていない、ハングアップ。
2、センチネルモデル
複数のサーバを管理するためのRedis RedisのSentinelシステム(インスタンス)。
モニタリング(監視):センチネルはプライマリサーバからは正常に機能している場合、サーバーをチェックしていきます。
(通知)思い出させる:Redisのサーバーの問題を監視する場合、Sentinelは、APIを介して、管理者や他のアプリケーションに通知を送信することができます。
自動フェイルオーバー(自動フェイルオーバー):プライマリサーバが正常に動作していないとき、センチネルは、自動フェイルオーバー操作を開始します、それは選挙になり、新しいプライマリサーバへのサーバから1、および他のプライマリサーバの障害を聞かせて新しいプライマリサーバにサーバから複製し、プライマリサーバーに接続するクライアントの試みが失敗した場合、クラスタは、新しいマスタクラスタではなく、障害が発生したサーバーの使用することができるように、新しいプライマリサーバ側のクライアントアドレスに戻ります。
問題を解決するには:
センチネルセンチネルモデルは、自動フェイルオーバーを実装しています。安定したサービスを提供するために、マスタースレーブモデルによって導入された新しい問題を解決します。
未解決の問題:
歩哨モード、まだ唯一のマスターノード。同時書き込み要求が大きい場合、センチネル書き込みモードは、圧力を緩和することはできませんと。
次のような機能は次のとおりです。
- Sentinelは、マスターとマスターでスレーブの任意の数を監視することができます。(すなわち、マスタとスレーブ複数のモード)
- 互いに独立したマスターモデルとは異なり、同じセンチネル、下で。
- Sentinelはマスターをチェックしていきますと、スレーブは正常です。
- 同じセンチネルのマスターを監視する自動的センチネルがネットワークに分散形成に接続する限り、センチネル生きあるように、フェイルオーバーすることができ、監視サーバ上で互いに互いに交換情報、センチネルネットワークと通信します。ときにのみセンチネルセンチネルがハングアップした場合、それは自動フェイルオーバーを実現することはできません。
- フェイルオーバー:世論調査(半分原則)は、任意のマスターセンチネルは、組立ラインをオフに見つけ、監視する場合、組立ラインオフマスターかどうか(の半分以上、奇数と通常センチネルようにする)を決定する投票、他のセンチネル会に通知します。
- フェイルオーバー:選挙、センチネルは、マスターをオフラインで決定し、すべてのスレーブ、新しいノードの選挙は、マスターノードにアップグレードされます。ノードからノードに、他のノードをスレーブ。
- マスターノードから現在のノードに自動的にオンラインライン上のマスターの元バック、オリジナルのマスターノードバック。
3、Redisのクラスタクラスタ
Redis 3.0
それ以降のバージョンのサポート Redis Cluster
クラスタ、Redisのクラスタフリー中心構造は、各ノードとクラスタ全体の状態は、各ノードと他のすべてのノードのためのデータ保存。
目標:
- スケーラビリティと高いパフォーマンスをリニア千個のノードまで。いいえエージェントん、非同期レプリケーションの使用ではなく、マージ操作の値。
- 安全性の許容レベル書く:クライアントからのすべての書き込み操作を保持するシステムの試み(ベストエフォート型の道を)と、メインノードのほとんど。一般的に、いくつかの小さな窓、あなたが確認書かを失う可能性のある小さなウィンドウがあります。クライアントは、パーティションの数が少ないに位置している場合は、Windowsの書かれた以上の損失を確認しました。
- 可用性:Redisのクラスタは、各マスターノード上で生存アクセスパーティションから最もプライマリノードと、少なくとも一つのノードにアクセスすることができが使用できなくなりました。さらに、使用して、レプリカの移行を、もはや複数のスレーブによって覆わスレーブ複製からマスタがマスタを受信しません。
高性能:
- 非同期レプリケーション・メカニズムを使用して、他のノードに応じて、書き込みデータを待たずに、ノードにデータを書き込むとき。
- いいえ中央ノード・エージェントませんが、それは、データを所有しているノードに直接クライアントをリダイレクトします。
- N回に単一のRedisの全体的な性能の理論的な性能を対応するクラスタマスターノード数N、のため。
高可用性:
複製のマスタースレーブ・メカニズムを使用して、自動的にマスターノードに昇格するときマスタスレーブノード障害ノード。そこNクラスタマスターノードは、それぞれがマスタースレーブノードがある場合、クラスタ1 /(2 * N-1)の故障の確率は、使用される確率1-1 /(2 * N-1)とすることができます。
高い拡張性:
それはまでサポートできる1000
サービスノード。あなたは、常にクラスタに新しいノードを追加したり、既存のノードを削除することができます。相互に接続された他のノードと各ノードで確立クラスタ
一貫性:
Redisのクラスタは保証できない強い一貫性を。実際には、この手段はいくつかのケースでは、Redisのクラスタは、クライアントの書面による承認にそのシステムを失う可能性があること。
Redisのクラスタは、非同期レプリケーションを使用しているため、最初に書かれた行方不明の原因になるかもしれません。以下は、書き込み時に起こることをこれは意味:
-
- あなたの顧客は主にBに書きました
- あなたの顧客への主なBは「OK。」と答え
- 独自のスレーブB1、B2及びB3にB伝播ホスト書き込み操作。
クライアントに返信する前Bは、あなたのクライアントの書き込み何か、書き込みBが確認しますもしそうなら、これは遅延のRedisの遅延の原因となりますよう、確認のB1、B2、B3を待つが、クラッシュする前にクラッシュしていません書き込み動作は、そのスレーブ・サーバに送信することができるので、スレーブサーバは、(書き込み動作を受信していない)書き込み動作が永久に失われているように、プライマリ・サーバであってもよいです。
次のような機能は次のとおりです。
- 互いに(PING-PONG機構)に相互接続されたすべてのRedisのノード、バイナリプロトコルと帯域幅の最適化を使用して、内部伝送速度。
- より多くのノード障害検出の半分以上のみ有効になり、クラスタノードを介して失敗します。
- Redisのクライアント・ノードが接続され、中間層プロキシは、すべてのクラスタノードに接続されていないクライアントの必要なしに、任意のノードがクラスタを接続するために使用することができます。
- < - >スロット< - >値Redisのクラスタは(必ずしも均等に分布していない)の[0から16383]スロット(スロットハッシュ)へのすべての物理ノードをマッピングする、クラスタノードを維持します。
- 値CRC16(キー)に基づいて、Redisの16384クラスタ良いハッシュプレ分離溝、キー値はRedisのクラスタ内に配置される、浴槽にキーこれに決定し、16384を国防省。
第三に、クラスタの主要コンポーネント
1、キー分布モデル
空間がキースロット16 384に分割され、有効クラスタサイズ16384マスタノード(ノードが、約1000ノードの推奨される最大サイズ)の上限を設定します。
ハッシュのクラスタのサブセット内の各マスターノードは16,384スロットを処理します。クラスタ(別のモバイルノードから、すなわち、ハッシュスロット)の進行中の再構成が存在しない場合、クラスタがある安定しました。クラスタが安定している場合、単一のサービスノードを提供することによって、単一のハッシュ溝(サービングノードは、1つまたは複数のスレーブデバイスを有することができるが、スレーブデバイスは、故障やネットワーク分割の場合に置き換えることができ、そして展開するために使用することができる)とすることができます)読み出し動作廃止されたデータを受信します。
キーは、基本的なアルゴリズムのハッシュスロットにマッピングされています。HASH_SLOT = CRC16(key) mod 16384
2、キーのハッシュタグ
ハッシュタグは、同じハッシュスロットを確保するために複数のキーを割り当てる方法です。これは、Redisのクラスタにおけるマルチキー操作で使用されています。
ハッシュタグを達成するために、わずかに異なるようにして算出特定の場合において、ハッシュキー溝。キーが含まれている場合は「{...}」のみサブパターン間 {
及び}
ハッシュスロットを得るためにハッシュされます。しかしながら、複数の発生があってもよい{
、または}
よく、次の規則によって指定されたアルゴリズム。
-
- キーが含まれている場合は
{
、文字を。 - ある場合は
}
文字の右側には、{
- そして、最初に出現した場合
{
と、初めての間で1つ以上の文字が存在します}
。
- キーが含まれている場合は
3、クラスタノード属性
各ノードは、クラスタ内で一意の名前を持っています。ノード名160は乱数を16進数表現である、ノードが最初に起動されたとき(通常は/ dev / urandomの)が得られます。ノードIDは、構成ファイルれるノードに格納され、同じIDの永続的使用、又は少なくともノードコンフィギュレーションファイルまたはシステム管理者に削除されない介しCLUSTERリセットするためのコマンド要求ハードリセットケースことを利用IDを 。
全体のクラスタ内の各ノードを識別するノードID。与えられたノードは、ノードのIDを変更することなく、そのIPアドレスを変更することがあります。また、クラスタ・バスの再構成で実行されている変更IP /ポート、および使用のゴシッププロトコルを検出することができるクラスタ。
ノードIDは、各ノードに関連する情報のみが、常にのみグローバル一貫性のある情報ではありません。各ノードは、以下に関連する情報のセットを有します。特定のノードのクラスタ構成の詳細についていくつかの情報、およびクラスタ全体で常に同じ。特定の他の情報(PINGに例えば最後のノード)は、各ノードにローカルです。
各ノードは、クラスタ内の他のノードに関する以下の情報を保持:ノードID、ノードIPおよびポート、フラグのセットは、フラグがあればノードであるslave
、ノードのマスターノードは何ですか?ノード、及び最後に受信したポンのpingを、あろうノードを示し、現在の 設定時間(本明細書で後述する)、リンク状態、および最終ハッシュ溝セットとサービス。
4、クラスタ・バス
各ノードは他のノードRedisのクラスタからの着信接続を受信するためのRedisクラスタ追加のTCPポートを有しています。固定オフセットで、クライアントからの着信接続を受信するためのこの共通ポートとTCPポート。Redisのクラスタポートを取得するには、従来のコマンドポート10,000を追加する必要があります。たとえば、ノードが受信しているかどうかRedisのクライアント側のポート6379は16379が開きますクラスタ・バスポートに接続されています。
唯一のクラスタ・バスとバスプロトコルクラスタを使用してノードへの通信ノード:クラスタ・プロトコルは、異なるタイプのフレームバイナリプロトコルであり、そのサイズ。未発表の2値記録用クラスタ・バス・プロトコル、それはノードRedisのクラスタと通信するソフトウェア・プロトコルを使用して、外部装置のために意図されていないため。しかし、あなたが読むことができるRedisのクラスタのソースコード内cluster.h
やcluster.c
ファイルをクラスタバスプロトコルに関する詳細な情報を取得します 。
5、クラスタトポロジ
Redisのクラスタは、各ノードが他のすべてのノードへのTCP接続を使用して完全なグリッドです。
Nノードクラスタのグループでは、各ノードはN-1とN-1 TCP接続の着信接続を聞きました。
TCP接続がアクティブのままで、オンデマンドで作成されません。クラスタバスのpingに応答するノードの願いは、アクセスできない前にポン用にマークされたノードに対応するために十分な長さの時間を待つことになる際には、ノードに接続されてリフレッシュするために最初から通じ再接続しようとします。
Redisのクラスタノードは、完全な格子を形成するが、にもかかわらずゴシッププロトコル及びメカニズムを使用して、ノード構成の更新は、通常の状態ではあまり回避するために、ノード間でメッセージを交換するメッセージの数が交換には、指数関数的ではありません。
図6に示すように、ノードのハンドシェイク
常にping応答がpingを受信した場合でも、でもpingのノードが信頼されていないクラスタ・バスポートに接続ノードを受け入れます。送信ノードがクラスタの一部と見なされていない場合は、受信ノードは、他のすべてのパケットを破棄します。
クラスタの一部として、2つの方法で別のノードに一つだけのノード:
-
-
ディスプレイへのノードかどうか
MEET
メッセージ。素敵なメッセージとPINGのメッセージと全く同じ、しかし、クラスタノードの一部として受信者を受け入れることを余儀なくされます。のみ、次のコマンドのためのシステム管理者ノードは、ノードがなりMEET
、他のノードにメッセージを送信します:IPポートクラスタ会
-
あなたはノードへの信頼ノードチャットを持っている場合は、別のノードへのノードは、クラスタの一部として登録されます。AがBを知っている場合したがって、C Bが知って、最終的なBがAにゴシップCについてのメッセージを送信します このとき、A Cは、ネットワークの一部として登録され、Cは、試行が接続されています。
-
我々はすべての接続図内のノードに参加限り、この手段は、彼らが最終的には完全に自動接続図を形成すること。この手段では、クラスタは、他のノードを自動的に発見することができますが、力に、システム管理者によって確立された信頼関係が存在する場合にのみ。
このメカニズムは、クラスタはより堅牢になり、それが変更IPアドレスやその他のネットワーク関連イベント、異なるRedisのクラスタ不慮の混入を防ぐことができます。
参考リンク:
公式サイト:https://redis.io/topics/cluster-spec クラスタ仕様