目次
トグル序文
私たちがここにいたことを思い出してください データベースの基礎入門 – システム設計 08 この記事では、リレーショナル データベースについて説明した後、Key-Value ストアの原理をさらに詳しく説明します。もちろん、NoSQL と Key-Value データベースについても説明します。
NoSQLとは何ですか?
NoSQL は Not Only SQL を意味し、非リレーショナル データベースです。つまり、データの保存に従来のリレーショナル データベース モデルを使用しません。 NoSQL データベースは通常、キーと値のペア、ファイル、グラフ、ワイド テーブルなど、より柔軟で拡張可能なデータ モデルを使用します。この記事では、Key-Value データベースについて説明します。
キーと値のデータベースとは何ですか?
キーと値のデータベースは、ハッシュ テーブルなどのキーと値のメソッドを使用して、キーと値のペアの形式でデータを保存します。キーは主キーとして機能し、値は単純なスカラー値から複雑なオブジェクトまで何でも可能です。一般的なキーと値のデータベースには、Amazon DynamoDB、Redis などがあります。
キーバリューストア
Key-Value ストアは分散ハッシュ テーブルであり、DHT はハッシュ テーブルのような検索とストレージを提供する分散ストレージ方式です。ハッシュ テーブルは抽象データ型 (ADT) でもあり、その利点は通常、検索操作を比較的高速に完了できることです。まず、ハッシュの原理について説明します。キーのセットはハッシュ関数によって生成され、それは一意のキーです。 Key-Value ストアはキーを特定の値にバインドします。値はマップやイメージなどのストレージ タイプにすることができます。
通常、値は比較的小さいファイル サイズ (コンテンツ サイズの約 MB ~ KB) に制限されます。キーと値のデータ ストレージは、メッセンジャーの作成やユーザーの会話の保存など、さまざまなシナリオで使用できます。このようなシナリオは、この NoSQL アプローチの使用に非常に適しています。
Key-Value データ ストアを設計するにはどうすればよいですか?
システム コンポーネントを設計したい場合は、まず最初の質問に戻る必要があります。このシステム コンポーネントの要件は何ですか?必要性を忘れてしまった読者の方は、ぜひご覧ください。 ソフトウェア設計の非機能的特徴 – システム設計 03 。
機能要件
一般に、キーと値のストレージは一般的なデータベースと同じであり、get 関数や put 関数などのいくつかの共通関数があります。ただし、キーバリュー ストレージ システムと一般的なストレージ システムの間では、機能要件に依然としていくつかの違いがあります。
- 構成可能なサービス: 一部のシステムでは、より高い可用性 (可用性) のために強い一貫性 (一貫性) が犠牲になる場合があります。キー/値ストアは、整合性モデルをさまざまなシステムで使用できるように、構成可能なサービスを提供する必要があります。
- 常に書き込み機能: システムには、キーと値のストアに書き込む機能が必要です。ユーザーが強い一貫性(Consistency)を求める場合、CAP定理の影響により可用性(Availability)は必然的に放棄されることになります。つまり、CAP では C が優先されます。
非機能要件
スケーラビリティ: キーバリュー ストアは、世界中の何万ものサーバー上で実行できなければなりません。また、サービスの可用性への影響を軽減しながら、あるいはまったく影響を与えずに、ニーズに応じてサーバーを追加または削除できます。さらに、システムはキーと値のストアの多数のユーザーを処理できる必要があります。
フォールト トレランス: システム サーバーまたはシステム コンポーネントに障害が発生した場合でも、キーと値のストアは中断されることなく動作し続ける必要があります。
キーと値のデータ ストレージを設計する
システムの設計を開始する前に、まずシンプルに設計する (Design Simple) 原則として、次のことを前提とする必要があります。
- データセンターは信頼されています。
- データストアでの認証が完了しました。
- ユーザーのリクエストと応答は HTTPS 経由で行われます。
API設計
1 つ目は、API の設計です。機能の観点から必要な API を考える必要があります。ハッシュ テーブルと同様に、get と put という 2 つの主要な機能が提供されます。
取得関数
取得(キー)
パラメータのキーに従って、対応する値を返します。ここでもう一つ言及しておきます データ レプリケーションはデータベースをどのように最適化しますか? - システム設計09 前述したデータのコピーの問題があります。キーと値のデータベースがデータをコピーするときに、キーに関連付けられたオブジェクトのコピーが見つかります。ストレージが弱いデータ整合性モデルで構成されている場合、これはシステムによって行われます。
関数を置く
put(キー、値)
この関数は、キーに関連付けられた値を格納するために使用されます。キーと値のデータ ストアは、データを配置する場所を自動的に決定します。さらに、システムは通常、保存されたオブジェクトに関するメタデータを保持します。将来的には、メタデータとは何かについても詳しく説明する予定です。
スケーラビリティの向上
システム設計ではスケーラビリティ(Scalability)が非常に重要なので、キーバリューストア(Key-Value Store)を設計する際には、ストレージノードにキーバリューデータを格納します。ニーズの変化に応じて、ストレージ ノードの追加または削除が必要になる場合があります。これは、システム内のノード上のデータを分割して、すべてのノードに負荷を分散する必要があることを意味します。パーティショニングにまだ慣れていない読者は、以下を参照してください。 データ パーティショニング データ パーティショニングとは何ですか? – システム設計 10。
キーと値のデータ ストアのパーティショニングに戻り、例を示します。 4 つのノードがあり、負荷を分散するために 40% リクエストを各ノードに送信するとします。この問題を解決する従来の方法は、モジュロを使用することです。演算子 (Modulus Operator) を使用して計算を実行します。到着するすべてのリクエストにはキーが関連付けられています。リクエストが届くと、キーのハッシュ値が計算されます。次に、ハッシュ値とノード数 m を組み合わせて余りを求めます。
一貫したハッシュ
私たちはかつて DNSとは何ですか?ドメインネームシステム入門 – システム設計 06 トラフィック問題に対処するためにさまざまな種類のアルゴリズムが導入されているため、ハッシュについて議論する場合は、Consistent Hashing アルゴリズムについても議論する必要があります。このアルゴリズムは、ノードの負荷を分散するのに非常に適した方法です。
一貫性のあるハッシュ アルゴリズムでは、最初に 0 から n-1 までのハッシュ リング (ハッシュ リング) があると仮定する必要があります。ここで、n は利用可能なハッシュ値の数です。各ノードの ID を使用してそのハッシュ値を計算し、そのハッシュ値をハッシュ リングにマッピングします。各リクエストは、リング内を時計回りに移動して見つけた次のノードによって満たされます。
新しいノードがリングに参加すると、すぐ次のノードが影響を受けます。新しく追加されたノードとプロファイルを共有する必要がありますが、他のノードは影響を受けません。このようなアルゴリズムは簡単に拡張でき、ノードへの変更を最小限に抑えることができます。ハッシュ値はランダムに分散されるため、リクエストの負荷はランダムでリング全体に均等に分散されることが予想されます。
コンシステント ハッシュの主な利点は、ノードが参加または離脱するときに、移動するキーの数を最小限に抑える必要があることです。ただし、実際には、リクエストの負荷は均等に分散されません。大量のデータを処理するサーバーは、分散システムのボトルネックになる可能性があります。ノードは不釣り合いに大量のデータ ストレージおよび検索リクエストを受信し、システム全体のパフォーマンスが低下します。ここでは、読者が参考として使用できる、非常に詳細であると思われる記事を、一貫性のある混合図を使用して提供します。
仮想ノードの使用
一貫したハッシュ アルゴリズムを使用することに加えて、仮想ノードを使用してノード間でより均等な負荷分散を確保することもできます。この方法では、単一のハッシュ関数を適用するのではなく、同じキーに対して複数のハッシュ関数を使用します。
ここに簡単な例を示します。4 つのハッシュ関数があるとします。ノードごとに 4 つのハッシュ値を計算し、リングに入れます。このリクエストでは、ハッシュ関数のみを使用します。リクエストがリング上のどこに到着しても、時計回りに移動中に見つかった次のノードによって処理されます。サーバーごとに 4 つの場所があるため、リクエストの負荷はより均等になります。さらに、ノードのハードウェア容量が他のノードよりも大きい場合は、追加のハッシュ関数を使用して仮想ノードを追加できます。こうすることで、リング内でより多くのポジションを占有し、より多くのリクエストに対応できるようになります。
データ複製
この記事 データ レプリケーションはデータベースをどのように最適化しますか? - システム設計09 データベースのレプリケーションについて書きましたが、キーと値のデータベースに関しては、データのレプリケーションを処理するさまざまな方法もあります。一般的なデータ レプリケーションには、マスター/スレーブ関係とポイントツーポイント関係が含まれます。
プライマリ-セカンダリ レプリケーション
マスタースレーブ方式では、一方の記憶領域が主記憶領域となり、他の記憶領域が補助記憶領域となる。セカンダリ レプリカは、プライマリ レプリカからデータをコピーします。プライマリ ストレージ領域は書き込みリクエストを処理し、セカンダリ サービスは読み取りリクエストを処理します。また、メイン リポジトリに障害が発生すると、ストレージに書き込むことができなくなり、単一障害点になります。
ピアツーピアレプリケーション
ピアツーピアのアプローチでは、すべてのストレージ領域がプライマリストレージ領域となり、データは複製されて最新の状態に保たれます。すべてのノードで読み取りと書き込みも許可されます。通常、n 個のノードすべてにレプリケートすると非効率的でコストがかかります。代わりに、複製するストレージ ノードの数として 3 つまたは 5 つを選択するのが一般的です。
結語
2週間近く海外出張になりますが、今後もシステム設計に関する技術記事を更新し、システム設計の内容を書いていきたいと思います。このタイプの記事が気に入っていただけましたら、励ましのメッセージを残していただけると幸いです。
関連記事
データ パーティショニング データ パーティショニングとは何ですか? – システム設計 10
データ レプリケーションはデータベースをどのように最適化しますか? - システム設計09
DNSとは何ですか?ドメインネームシステム入門 – システム設計 06
システム設計コンポーネントの構成要素の概要 – システム設計 05