記事ディレクトリ
1. 全体の紹介
現在、データ量が急増しているため、1 台のマシンでは PB 以上のデータ量を保存および処理できず、大規模なクラスターに依存してデータを保存および処理する必要があるため、システムの拡張性は重要な指標となります。システムの長所と短所を測定します。
現在、主流のビッグデータストレージおよびコンピューティングシステムは、システムの拡張性をサポートするために通常水平拡張方式を採用しており、大量のデータを保存および処理するには、データをセグメント化し、データシャーディングを通じてマシンに分散する必要があります。データが断片化された後、対応する保存場所を見つける方法を と呼びます数据路由
。
データシャーディングとデータレプリケーションは密接な関係にあり、大規模データの場合はデータシャーディングによりシステムの水平拡張を実現し、データレプリケーションによりデータの高可用性を保証します。同時に、システム障害が発生した場合でもデータを確実に利用できるようにするために、同じデータを複数の場所にコピーして保存し、データを確実に利用できるようにする必要があります。データ レプリケーションにより、読み取り操作の効率が向上します。クライアントは、複数のレプリケート データから、物理的距離が近いデータを選択して読み取ることができるため、読み取り操作の同時実行性が向上し、単一読み取りの効率が向上します。
以下の図は次のことを示しています数据分片与数据复制的关系
。
2. 抽象モデル
次の図は、抽象化レベルを示しています数据分片与路由的通用模型
。
これは 2 レベルのマッピング関係とみなすことができます。第 1 レベルのマッピングはkey-partition
、データ レコードをデータ フラグメント空間にマッピングするマッピングです。マッピング関係は多対 1 です。つまり、1 つのデータ フラグメントに複数のレコードが含まれます。 2 番目の季節マッピングはpartition-machine
、データ フラグメントを物理マシンにマッピングするマッピングで、通常は多対 1 のマッピング関係、つまり 1 つの物理マシンが複数のデータ フラグメントに対応できます。
データ シャーディングを行う場合、key-partition
ビッグ データはマッピング関係に従って水平方向に多数のデータ シャードに分割され、partition-machine
データ シャードはマッピング関係に従って対応する物理マシンに配置されます。
Get(key)
データ ルーティングを実行するときは、特定のレコードの値をクエリし、key-partition
マッピングに従って対応するデータ フラグメントを見つけて、partition-machine
リレーショナル テーブルを検索する 必要があります。このデータがどの物理マシンに保存されているかがわかれば、key
対応するデータを読み取ることができます。value
価値。
3. ハッシュシャーディング
データ シャーディングにはハッシュ関数が一般的に使用されます。一般的に使用されるハッシュ シャーディング手法は、ラウンド ロビン、仮想バケット、コンシステント ハッシュ手法の 3 つです。以下に詳しく説明します。
3.1 ラウンドロビン
ラウンド ロビン (一般的にハッシュ モジュロとして知られる) は、一般的に使用されるデータ シャーディング方法です。k 台の物理マシンがある場合、ハッシュ関数を通じてデータ シャーディングを実現できます。
H(key) = hash(key)mod k
レコードを主キーとし、その番号がデータを格納する物理マシンの番号となるため、上記のハッシュ関数に従って、0
物理マシンに から までの番号を付け、すべてのデータを 1 つの物理マシンに割り当てることがk-1
でき、また、同じハッシュ関数を使用して、データが保存されている物理マシンを検索します。key
H(key)
k
この方法の利点は、実装が簡単であることですが、柔軟性に欠けることです。新しい物理マシンが分散システムに追加された場合、ハッシュ関数は次のようになります。
H(key) = hash(key)mod(k+1)
この場合、以前に割り当てられたデータとデータを格納する物理マシンとの間のマッピング関係が破壊されるため、新しいハッシュ関数に従ってデータを再割り当てする必要があります。
柔軟性に欠ける理由は、上で紹介したデータ シャーディングとルーティングの抽象モデルが、実際には、ラウンド ロビンが物理マシンとデータ シャーディングの 2 つの機能を組み合わせているため、マッピング機能とマシンが解決できないことを示しているためです。
3.2 仮想バケット
Couchbase
これはメモリ分散型データベースであり、データの断片化を管理するために、次のようなNoSQL
仮想バケットの実装が提案されています。运行机制
ストレージレコードと物理マシンの間には仮想バケット層が導入されており、まずハッシュ関数を通じてレコードが対応する仮想バケットにマッピングされ、次にテーブル管理を通じて仮想バケットと物理マシン間のマッピング関係が実現されます。
ラウンド ロビンと比較すると、仮想バケットは元の単一レベルのマッピングを第 2 レベルのマッピングに調整するため、スケーラビリティが向上します。新しい物理マシンが追加されるときは、第 2 レベルのマッピング テーブル内の影響を受ける個々のエントリを調整するだけで済みます。partition-machine
. 拡張性、柔軟性の向上。
3.3 一貫したハッシュ化
分散ハッシュ テーブル (DHC) は、P2P ネットワークや分散ストレージの一般的な技術です ハッシュ テーブルを分散拡張したものです 複数の物理マシンの分散環境でデータをハッシュする方法を検討します データ操作の追加/削除/変更/確認メソッド。コンシステント ハッシュは DHC の技術概念を実装したものであり、ここでは主に Chord システムで提案されているコンシステント ハッシュ アルゴリズムを紹介します。
次の図は、ハッシュ空間を長さ 2 5 (m=5) の一貫したハッシュ アルゴリズムの模式図として表したもので、ハッシュ空間の表現可能な範囲は 0 ~ 31 であり、循環シーケンスです。各マシンは、IP とポート番号に応じてハッシュ関数を介してハッシュ値空間にマッピングされます。図の 5 つのノードは異なるマシンを表し、N i で表されます。ここで、i はハッシュ空間に対応する値を表します。例 N14 ノードには、ハッシュ化後の主キーが 6 ~ 14 の範囲にある Key-Value データが格納され、各マシン ノードはリング内の先行ノードと後続ノードのアドレスを記録し、実際の有向リングを形成します。
ルーティングテーブル
上記の方法に従って構築が完了した後、P2P 環境には中央管理ノードが存在しないため、どのようにクエリを実行すればよいでしょうか? 最も直観的な方法は、有向リングに沿ってクエリのためにすべてのマシン ノード N i を順次走査することですが、これは非効率なクエリ方法です。クエリを高速化するために、各マシン ノードにルーティング テーブルを構成できます。ルーティングテーブル経路データは m 個あり、i 番目の経路情報は、現在のノードからハッシュ空間値が 2 i離れたマシンノードの番号を表します。たとえば、上図のノード N14 では、対応する経路表は次のとおりです。
距離 | 1 (2 0 ) | 2 (2 1 ) | 4 (2 2 ) | 8 (2 3 ) | 16 (2 4 ) |
---|---|---|---|---|---|
マシンノード | # 20 | # 20 | # 20 | N25_ _ | N5_ _ |
一貫したハッシュ ルーティング アルゴリズム
ルーティング テーブルを使用すると、コンシステント ハッシュ ルーティング アルゴリズムを使用してクエリを実行できます。
アルゴリズムの考え方: 異なるノード間でメッセージを送信することでコラボレーションが完了します。現在操作を実行しているノードを N c、その初期値を Ni 、 N cの後継ノードを N sとします。
步骤1
: c<j<=s
true の場合、検索を終了するかどうかを判断します。N cはキー値に対応する値を見つけるためにN sにメッセージを送信します。N s はクエリ結果を N iに返します (各メッセージにはソース N iに関する情報が含まれます)。
步骤2
: ステップ 1 の結果が false の場合、N c は対応するルーティング テーブルを検索し、 j より小さい最大の番号を持つノード N hを見つけます。N c はメッセージをN hに送信し、それに対応する値を検索するように要求します。この時点で N i 、N hに代わってキー値が現在のノード N cになり、ステップ 1 とステップ 2 に従って再帰的にクエリを続けます。
たとえば、次の図に示すように、H(key)=27
アルゴリズムのステップ 1 に従って、キーのキー値リクエストがノード N14 で見つかり、N14 は 27 が後続ノード N20 にないことを検出し、ステップ 2 に入り、ルーティングをクエリします。テーブルを参照し、27 未満の最大番号を持つノード N25 を見つけ、キーのキー値を見つけるために N25 にリクエストを送信します。N25 はアルゴリズムのステップ 1 に入り、27 が次のノード N29 に該当することを発見したため、 N29 にクエリを依頼するために N29 にリクエストします。N29 がクエリを完了すると、対応する値を N14 に返してクエリを完了します。なぜ N14 に戻るのでしょうか? 各メッセージにはメッセージ送信元 N14 の情報が含まれることは前述したためです。
この例によれば、コンシステント ハッシュ ルーティング アルゴリズムの検索プロセスは二分探索に似ていることがわかります。
新しいノード
新しいマシンノード N new を P2P ネットワークに追加する必要がある場合は、N xなどの任意のノードとの接続を確立し、ルーティングに従って N newに対応するハッシュ値 Hash(N new )=newをクエリする必要があります。 N xのアルゴリズムを計算し、 N newの後続ノード N sを見つけます。N sの先行ノードをN pとします。N newが P2P ネットワークに参加するには、p2p ネットワーク アーキテクチャ関係を再確立する必要があります。それらの間の。
で非并发情况下
、次の 2 つの手順を実行します。
step1
変更された先行ノードおよび後続ノード レコードに対応するN p、 N new、および N s
step2
を変更します; データの再シャーディングと分散、およびN newによって保持される必要がある N sに格納されたデータをN newに移行します。
并发情况下
データの正確性を確認するには、次の 2 つの手順を完了する必要があります。
step1
. N newの後続ノードをN sに、先行ノードを null にポイントします;
step2
. P2P ネットワーク内の各ノードが定期的に実行する定期的な安定性チェックを実行します. このステップを通じて、先行ノードと後続ノードの更新とデータ移行が行われます。ノードが完成しますが、これは新しく参加したノード用に特別に用意されたものではありません。
安定性検出アルゴリズム
アルゴリズムのアイデアとプロセス:
step1
N s がN cの後続ノードであると仮定すると、N c はN sに先行ノードN pを要求します。
step2
N p がN cと N sの間にある場合、N c はN p をその後継ノードとして記録します。
step3
N xを N cの後続ノードとします。N sまたは N pの場合があります。N xの先行ノードがnull であるか、N cが N xとその先行ノードの間に位置するかどうかは、前のステップによって異なります。次に、N c は、自分が N xの先行ノードであることをN xに伝えるメッセージを送信し、N x はその先行ノードを N cに設定します。
step4
. N x は、N cに属するデータの一部(ハッシュ値が c より小さい)を N cに移行します。
以下は解析例ですが、P2P環境でN5とN14が安定している場合、N8を追加した後の状態は以下のようになります。
step1
N8 は安定性テストを開始し、N14 の前駆ノードが N5 であることを検出し、次のように入力します。step2
step2
. N5 は N8 と N14 の間にないため、何もせず、入力します。step3
step3
N8 は N14 とその先行ノード N5 の間に位置するため、N8 は N14 にその先行ノードが N8 であるべきであることを伝え、N14 は先行ノードが N8 を指すようにします。状態は次のとおりです。
step4
N14 のコンポーネント ハッシュ値が 6 と 8 の間のレコードは N8 ノードに移行されるため、N8 ノードは安定性テストを完了します。
N8 の安定性テストが完了した後、一定期間後に N5 ノードの安定性テストが実行されます。N5 は、N14 からその先行ノードが N5 自身ではなく N8 であることを通知されます。N5 は、後続ノードを N8 に変更します。 N8 の先行ノードは null であるため、N5 は N8 にそれを先行ノードとして使用するように通知し、N8 は先行ノードを N5 に変更します。N5 の安定性テストの後、システム ステータスは次の図のように変わります。
ノードが P2P ネットワークから離脱します
P2P ネットワークから離脱するノードには 2 種類あり、ここでは主に通常離脱について紹介します. 通常離脱の前に準備を行い、該当ノードに先行ノードと後続ノードを更新するように通知し、保持しているデータを P2P ネットワークに移行します。後継ノード。ノードの離脱により他マシンのルーティングテーブルが無効になっていますが、「新規ノード参加時の状況」で紹介した方法でルーティングテーブルを更新できます。
異常終了は通常、マシンの故障によって引き起こされますが、同じデータのコピーを複数のマシンに保存しておくことで回避できます。
仮想ノード
ハッシュ アルゴリズムでは、マシンがリング構造にマッピングされる位置がランダムになるため、負荷の不均衡が発生します。さらに、マシンの異質性が一般的であり、高構成と低構成は不均等であり、一貫性のあるハッシュではすべてのマシンが平等に扱われるため、低構成と高負荷が発生する可能性があります。
Dynamo は整合性ハッシュを変更し、仮想ノードの概念を導入し、物理ノードを複数の仮想ノードに仮想化し、整合性ハッシュのリング構造の異なる位置にマッピングしました。また、マシンの異種性も考慮されます。
4. 範囲のシャーディング
範囲シャーディングでは、最初にすべてのレコードの主キーが並べ替えられ、主キー空間内のレコードがデータ シャードに分割され、各データ シャードには主キー制御フラグメントに記録されたすべてのデータが格納されます。特定のストレージ システムでは、データ シャードのマッピング テーブルが維持され、各項目にデータ シャードの最小主キーと対応する物理マシン アドレスが記録されます。
レコードを追加、削除、変更、クエリする場合、マッピング テーブルを検索することで、データ断片化が発生している物理マシンを見つけることができます。物理マシン上のデータ断片化の管理方法には、通常、効率的なデータ インデックス構造である LSM 番号が採用されています。書き込み。