Windows AzureテーブルストレージとAmazon DynamoDBを比較する

こんにちは。

Windows AzureとAmazonが提供するサービスの比較サイクルの最初の記事の翻訳に注目してください。これは、クラウドサークルの有名な専門家であるGaurav Mantriによって書かれています。



この記事では、Windows AzureテーブルストレージとAmazon DynamoDB-WATSとADDBをそれぞれ比較します。





機能に関しては、WATSとADDBは同様の機能を提供します。 どちらも、大量のデータを保存するように設計されたNoSQLシステムです。 Amazonには、別のNoSQLデータベースSimpleDBもあります。



注意すべき重要な点は、ADDBは単なるNoSQLデータベースではないということです。 これはデータベースサービスです。 はい、データの管理に使用されるのは事実ですが、必要な帯域幅でシステムのスケーラビリティの程度を制御します。 この意味で、これらはすべてAmazonまたはWindows Azureのコンピューティングサービスインスタンスに非常に似ています。 計算サービスのインスタンスの場合、必要なインスタンスのサイズを選択すると、システムがリクエストに応答します。 同様に、ADDBの場合、アプリケーションがADDBテーブルで実行する読み取りおよび書き込み操作の数をシステムに伝え、ADDBが必要な電力を割り当てます。



概念的には、両方のシステムは類似しています:

  1. 両方のシステムは非リレーショナルNoSQLです。
  2. 両方のシステムは、全体としてKey-Valueレコードリポジトリです。
  3. リレーショナルデータベースで利用可能な関係のサポートはありません。
  4. 高可用性と柔軟性の暗黙的なサポート。
  5. 両方のシステムは、キューとメッセージ、および通常はREST APIを実装するラッパーである他の高レベル言語のライブラリを操作するためのREST APIを提供します。 両方のシステムで、各APIリリースには日付で表される独自のバージョンがあります。 執筆時点では、これらのバージョンは同じです:WATS- 2011-08-18 、ADDB- 2011-12-05


当然、いくつかの重要な違いがあります。

  1. ADDBで必要な帯域幅は、システムの操作を開始したときに得られる帯域幅です; WATSの場合、帯域幅はシステムによって制御されます。 したがって、ADDBシステムはより柔軟ですが、より多くの「資本」作業が必要です。
  2. ドメインに10 GBの制限があるSimpleDBとは異なり、ADDBにはそのような制限はありません。好きなだけデータを保存できます。 また、WATSはテーブル内のデータに厳しい制限を設定しませんが、ストレージアカウントのサイズ(現在は100 Tb)によって制限されています。
  3. ADDBは、ご要望に応じて、WATSとは異なり、データのインデックスを作成できます。 技術的には、WATSはデータのインデックスも作成しますが、特定の属性(PartitionKey、RowKey)のみであり、ユーザーが最も要求する機能の1つであるWATSにセカンダリインデックスを設定できます。


コンセプトの



テーブル:テーブルについて考えるとき、最初に頭に浮かぶのは、「行と列で構成されるもの」であるというステートメントです。 WATSとADDBのテーブルは想像したように見えるかもしれませんが、実際はそうではありません。 テーブルは、データを表示するキーと値のペアのコレクションを含むコンテナと考えてください。 リレーショナルモデルでは、テーブルの列を定義し、行にはデータが含まれます。 テーブルにデータを保存するには、列を定義する必要があります。 WATSおよびADDBのテーブルにはスキーマが含まれていません。つまり、列を定義する必要はありません。 要するに、テーブルを、必要なデータを置くバッグと考えてください。



概念的に両方のシステムのテーブルはデータを保存するためのコンテナであるという事実にもかかわらず、それらの間にはいくつかの違いがあります。

  1. デフォルトでは、ADDBには256個のテーブルの数に制限があります(要求によって増やすことができます。WATSに制限はありません。WATSでは、ストレージアカウントの制限(現在は100 Tb)を考慮して、できるだけ多くのテーブルを持つことができます。
  2. ADDBでテーブルを定義するときは、このテーブルの主キーを定義する必要があります。これは、1つまたは複数の属性にすることができます。 このテーブルのすべてのオブジェクトには、一意の主キー値が必要です。 WATSでは、主キーはシステムによって生成され、PartitionKey属性とRowKey属性の組み合わせです。 テーブル内の各エンティティには、これらの属性の一意の組み合わせが必要です。
  3. ADDBでテーブルを作成するときは、割り当てられた帯域幅(読み取りおよび書き込み操作の数)を指定する必要がありますが、これはWATSでは使用できません。 後でADDB APIを使用してこの帯域幅を変更できます。 割り当てられた帯域幅の終わりに、ADDBはリクエストの制限(スロットル)を開始します。


エンティティとオブジェクト:テーブルのデータを定義します。 各エンティティ(WATS)およびオブジェクト(アイテム、ADDB)は、1つ以上の属性で構成されます。 属性は、キーと値のペア(WATSのキーと値のデータ)のコレクションです。 リレーショナルデータベースでは、これは文字列になります。 ここでは、テーブルまたはドメインの各行には他の行とのリンクはありません。 WATSの各エンティティは、PartitionKeyとRowKeyの2つの属性によって一意に識別されます-これを複合主キーと見なします。 各エンティティには、これらの属性の一意の組み合わせが必要です。 ADDBでは、各オブジェクトは、オブジェクトの属性の1つである主キーによって一意に識別されます。 ADDBテーブルのすべてのオブジェクトには主キーが必要です。



エンティティとオブジェクトにはいくつかの違いがあります。

  1. WATSでは、エンティティには最大256個の属性がありますが、ADDBでは制限はありません。 各WATSエンティティには、PartitionKey、RowKey、およびTimestampの3つのシステム属性があるため、ユーザー定義属性の数は253に減少します。PartitionKeyおよびRowKey属性の値は独立して決定できます。 。 PartitionKeyおよびRowKey属性には、String型が含まれています。
  2. WATSのエンティティの最大サイズは1 MBに設定され、ADDBオブジェクトは64 KBです。
  3. WATSでは、属性値は8つのデータ型のいずれかを持つことができます:バイナリ、ブール、DateTime、10進数、Int32、Int64、Guid、および文字列。豊富なデータモデルを提供します。 ADDBでは、使用可能なタイプのセットには、ストリング、数値、ストリング/数値セット(ストリングまたは数値の配列)が含まれます。
  4. WATSでは、データはPartitionKeyとRowKeyによってのみインデックス付けされ、他の属性によるインデックス付けはまだ利用できません。 Windows AzureのデータはPartitionKey値によってパーティション化されます。値を誤って選択するとパフォーマンスが大幅に低下する可能性があるため、慎重に選択する必要があります。 ここで素晴らしい記事を読むことができます 。 ADDBでは、テーブルの主キーを構成する属性によってデータにインデックスが付けられます。


ADDBは、2種類の主キーをサポートしています。

  1. ハッシュタイプのプライマリキー:この場合、プライマリキーはハッシュという単一の属性で構成されます。 ADDBは、この主キーの属性に基づいて非構造化ハッシュインデックスを構築します。
  2. ハッシュおよび範囲タイプのプライマリキー:この場合、プライマリキーは2つの属性で構成されます。 最初の属性はハッシュ属性で、2番目は範囲属性です。 ADDBは、ハッシュ属性を使用して非構造化ハッシュインデックスを作成し、範囲属性を使用してソートされた範囲インデックスを作成します。


帯域幅の割り当て



ADDBの最も重要な機能の1つは帯域幅の割り当てです。これにより、アプリケーションに必要な帯域幅を構成できます。 つまり、帯域幅の割り当てにより、ADDBテーブルで実行できる1分あたりの読み取りおよび書き込み操作の数が決まります。 指定した値に基づいて、ADDSは適切なリソースを割り当て、APIまたはAmazon Management Consoleを使用してその場で設定を更新できます。



帯域幅の割り当ては、読み取り操作用の読み取り容量ユニットと書き込み操作用の書き込み容量ユニットという2つの用語で動作します。



読み取りキャパシティーユニットは、1 Kbブロックにおける1秒あたりの一貫した読み取り操作の数として定義されます。 したがって、10個のRCUを要求した場合、これは、1秒あたり1 KBまでのサイズの10個のオブジェクトに対して一貫した読み取り操作を実行できることを意味します。 オブジェクトのサイズが1 Kbを超える場合、1秒間に読み取ることができるオブジェクトの数は少なくなります。 たとえば、オブジェクトのサイズが1 KBおよび2 KBの場合、システムが制限する前に1秒あたり5回の一貫した読み取りのみを実行できます。通常、機能は2倍になります。10個のRCUを要求すると、1 KB以下のオブジェクトで最終的に一貫した読み取りを20回実行できます。



同様に、書き込みキャパシティーユニットの場合-1 Kbあたりの読み取りまたは書き込み操作の数。 10個のWCUが要求された場合、1秒あたり最大1 KBのサイズで10個のオブジェクトを記録できます。 オブジェクトのサイズが1 Kbを超えると、1秒あたりに記録するオブジェクトの数が減ります。 たとえば、オブジェクトのサイズが1〜2 KBの場合、システムが制限を開始する前に、1秒あたり5回の書き込み操作を実行できます。



ADDBの価格は他のサービスとは別に設定されるため、帯域幅の割り当てには価格の面で機能があることに注意してください。 基本的に、予約した読み取りおよび書き込み操作に対して料金を支払います。 執筆の時点で、米国東部(バージニア)のデータセンターでは、10ユニットの書き込み容量ごとに0.01ドル/時間、50ユニットの書き込み容量ごとに0.01ドル/時間を支払うことになります。 原則として、価格設定はコンピューティングサービスのインスタンスの価格の形成方法に似ています。この場合、特定のサイズ(特定の容量とRAM)の仮想マシンを要求し、完全にロードするかどうかに関係なく、この仮想マシンに1時間ごとに支払います。 同様にADDBでは、使用の程度に関係なく、Amazonからリクエストした帯域幅に対して1時間ごとに支払います。



帯域幅の割り当てに関しては、考慮すべき点がいくつかあります。

  1. これはテーブルごとにカスタマイズ可能です。
  2. 最小スループットは、テーブルごとに5 RCUと5 WCUです-このテーブルをまったく使用しない場合でも、各テーブルに対して、一貫した読み取り操作に対して最低$ 0.001($ 0.01 * 5/50)を、一貫した書き込み操作に対して$ 0.005を支払います。
  3. 割り当てられた帯域幅の増減は、以前の値と少なくとも10%異なる必要があります。たとえば、現在100の読み取りキャパシティーユニットがあり、この値を増やしたい場合、新しい値は110以上でなければなりません。
  4. スループットを増減する場合、1つのリクエストで最大値を2倍にできます。たとえば、現在100の読み取りキャパシティーユニットがある場合、この値を最大200に増やすことができます。
  5. 割り当てられた帯域幅を1日に1回削減できます。
  6. 最大10,000個の読み取りキャパシティーユニットと10,000個の書き込みキャパシティーユニット(デフォルト)をテーブルに割り当てることができます。 デフォルトでは、アカウント内のすべてのテーブル間に、最大で20,000の読み取りキャパシティーユニットと20,000の書き込みキャパシティーユニットがあります。 これらの値は、 Amazonを記述することで増やすことができます


価格



各システムが提供する機能について説明する前に、価格について見てみましょう。 どちらのシステムにも「資本」コストはありません。 価格設定に含まれるコンポーネントは次のとおりです。

  1. トランザクション :WATSでは、トランザクションの数に対して支払いを行い、そのコストは固定されています(10,000トランザクションあたり0.01ドル)。 したがって、最終価格を計算するには、トランザクションの数にその値を掛ける必要があることがわかります。
  2. 帯域幅の割り当て :ADDBでは、読み取りおよび書き込み操作に対して固定価格で割り当てられた帯域幅を支払います。 割り当てられたRCUとWCUの数に1時間あたりの価格を掛けることで、合計価格を計算できます。
  3. データ転送 :システムとの間で転送されるデータの量に対して支払います。 執筆時点では、両方のシステムが無料の着信トラフィックを提供しています。 同じリージョン内のADDBとAmazon EC2の間で転送されるデータは無料です。 異なる地域のADDBとAmazon EC2の間で転送されるデータは、関税に従って課金されます。 WATSでは、発信トラフィックのみが支払われます。


ADDBの価格設定はWATSの価格設定よりも予測可能ですが、不必要な要求に料金を支払わないように、またはシステムによる制限を引き起こさないように、必要な帯域幅を正しく計算する必要があります。



機能リスト

ワット

ADDB

テーブル作成/テーブル作成

はい

はい

クエリテーブル/ ListTables

はい

はい

テーブルの削除/テーブルの削除

はい

はい

更新可能

いや

はい

DescribeTable

いや

はい

1つのエンティティ/オブジェクトのCRUD

はい

はい

複数のエンティティ/オブジェクトのCRUD

はい

はい

クエリエンティティ/クエリ(スキャン)

はい

はい



リストのすべての関数をより詳細に検討してみましょう。



ワット

ADDB

テーブル作成/テーブル作成

はい

はい



この関数の名前が示すように、WATSおよびADDBにテーブルを作成します。 CreateDomain操作がべき等であるSimpleDBとは異なり、ADDBではそうではありません-既存のテーブルの名前でテーブルを作成しようとすると、システムはエラーをスローします。



以下の表に要約されているいくつかのテーブル/ドメイン命名規則があります。



ワット

ADDB

最小/最大長

3/63

3/255

大文字と小文字の区別

混在ケース

混在ケース

許可されたキャラクター

英数字

英数字、ハイフン(-)、ダッシュ(_)、ピリオド(。)





さらにいくつかのポイントがあります。





ワット

ADDB

クエリテーブル/ ListTables

はい

はい



この関数は、テーブルのリストを返します。 1つの関数要求は、WATSの最大1000個のテーブルとADDBのすべてのテーブルを返します。テーブルまたはドメインがまだある場合は、継続トークンも返され、次のテーブルまたはドメインのセットにアクセスできます。



ワット

ADDB

関数呼び出しごとの最大レコード数

1000

-

継続トークンを返す

はい

はい



ワット

ADDB

テーブルの削除/テーブルの削除

はい

はい



この関数はテーブルを削除します。 ADDBにはi等性はありません。

ADDBのテーブルを削除するには、テーブルがアクティブ状態である必要があります。 ADDBのこの操作は非同期です。 WATSでは、同期しているように見えますが、非同期でもあります。 WATSでテーブルを削除する要求を送信すると、テーブルは削除のためにシステムによってマークされ、使用不可になり、ガベージコレクションプロセス中にのみ削除されます。したがって、テーブルの現在の削除は、このテーブル内のデータのサイズによって異なります。 私の経験では、非常に大きなテーブルの削除には数時間かかる場合があります。 現時点では、同じ名前のテーブルを作成しようとするとエラーが発生します(競合エラー-HTTPステータスコード409)。



ワット

ADDB

更新可能

いや

はい



この関数は、ADDBのテーブルに割り当てられた帯域幅を更新するために使用されます。 割り当てられた帯域幅を増減できます。







ワット

ADDB

DescribeTable

いや

はい



DescribeTable関数は、次のテーブル情報を取得するために使用されます。





この操作の結果は最終的に一貫しているため、最新の更新を受け取ることは保証されません。



ワット

ADDB

1つのエンティティ/オブジェクトのCRUD

はい

はい



どちらのシステムでも、1つのエンティティ/オブジェクトに対して作成、読み取り、更新、削除(CRUD)操作を実行できます。

覚えておくべきこと:





作成




WATSでは、操作を作成するために複数の操作を使用できますが、ADDBでは、それらはすべて1つの関数( PutItem )に結合されます。 PutItem操作はオブジェクトを作成します。または、指定された主キーを持つオブジェクトがテーブルに含まれている場合、このオブジェクトは完全に置き換えられます。 WATSには、エンティティを作成するための3つの機能があります。



  1. エンティティの挿入 :テーブルに新しいエンティティを作成します。 指定されたPartitionKeyおよびRowKey値を持つエンティティが既に存在する場合、エラーがスローされます。
  2. Insert or Merge Entity : . PartitionKey RowKey , , .. , , , , , , .
  3. Insert or Replace Entity : . PartitionKey RowKey , PartitionKey RowKey .








両方のシステムで、読み取り操作はエンティティ/オブジェクトの属性のクエリで構成されます。WATSでは、これはクエリエンティティ使用して実装され、PartitionKeyRowKeyを引数として渡します。ADDBでは、これはGetItem使用して実装され、オブジェクトの主キーを引数として渡します。



デフォルトでは、GetItem操作は最終的に一貫した読み取りを完了することに注意してください。ただし、オプションのConsistentReadパラメーターを使用して、この関数に一貫した読み取りを実行させることができます。



更新する




WATSのエンティティを更新するにはいくつかの方法がありますが、ADDBには2つしかありません。



  1. PutItem:PutItem操作はオブジェクトを作成するか、指定された主キーを持つオブジェクトが既に存在する場合、それを完全に置き換えます。
  2. UpdateItem 既存のオブジェクトを完全に置き換えるのではなく、いくつかの属性を置き換える必要がある場合、この機能を使用して、属性の変更を柔軟に制御できます。




エンティティを更新するために、WATSでは4つの機能を使用できます。



  1. エンティティのマージ:指定された PartitionKeyおよび RowKey値を持つエンティティが既に存在する場合、このエンティティは新しいエンティティとマージされます。両方のエンティティに存在する属性の値が更新され、新しいエンティティにのみ存在する属性が追加され、古いエンティティにのみ存在する属性は古い状態のままになります。
  2. Update Entity : , PartitionKey RowKey .
  3. Insert or Merge Entity : . PartitionKey RowKey , , .. , , , , , , .
  4. Insert or Replace Entity : . PartitionKey RowKey , PartitionKey RowKey .




条件付き更新:両方のシステムが条件に応じた更新をサポートしますが、これらのメカニズムの動作は異なります。ADDBでは、既存の属性の値に条件を定義します。つまり、別の属性attribute2の値がある値と等しい場合にのみ、ADDBがattribute1の値を更新することを決定します。ADDBの条件付き更新は、属性の存在の確認をサポートしています。WATSは異なります。WATSでは、すべてがエンティティのETag値に依存します。条件に従ってエンティティを更新するには、リクエストヘッダーの1つでエンティティのETag値を指定する必要があります(REST APIを使用する場合)。その後、WATSはこの値を更新されたエンティティの現在のETag値と比較し、これらの値が一致する場合にのみ更新が実行されます。



削除する




WATSでエンティティを削除するには、Delete Entity使用してこのエンティティのPartitionKeyRowKeyを入力引数として渡します。同様に、ADDB内のオブジェクトの除去は、あなたが使用DeleteItemを入力引数プライマリキーの送信としてこのオブジェクトから。



ADDBのDeleteAttributesはべき等です。つまり、存在しないエンティティを削除しようとしても、条件付き削除を使用するまでADDBはエラーをスローしません。条件に従って削除を実行する場合、操作はADDBでべき等ではありません。 WATSでは、存在しないエンティティを削除しようとすると、エラー(NotFoundエラー-HTTPステータスコード404)がスローされます。



条件ごとの取り外し:両方のシステムは条件に応じて削除をサポートしますが、これらのメカニズムは異なる方法で動作します。ADDBでは、既存の属性の値に条件を定義します。つまり、attribute2の値がある値と等しい場合にのみADDBがオブジェクトを削除することを決定します。ADDBの条件に応じた削除は、属性の存在の確認をサポートします。WATSは異なります。WATSでは、すべてがエンティティのETag値に依存します。条件に従ってエンティティを更新するには、リクエストヘッダーの1つでエンティティのETag値を提供する必要があります(REST APIを使用する場合)。その後、WATSはこの値を削除されたエンティティの現在のETag値と比較し、これらの値が一致する場合にのみ削除が実行されます。

ワット

ADDB

複数のエンティティ/オブジェクトのCRUD

はい

はい



両方のシステムは、単一のサービスコール内で複数のエンティティ/オブジェクトのCRUD操作をサポートします。



CRUDのWATSでは、エンティティグループトランザクションを使用できますADDBでは、使用することができBatchWriteItemをBatchGetItemを使用して、主キーを使用して複数のテーブルから複数のオブジェクトを読み取ることもできます。



コメント:





ワット

ADDB

クエリエンティティ/クエリ(スキャン)

はい

はい



基準に基づいてテーブルから1つ以上のエンティティ/オブジェクトを取得するために使用されます。



コメント:







要約-両方のシステムの機能は同等です。機能にはいくつかの違いがあり、開発および計画プロセス中にそれらを念頭に置いておくと、場合によっては両方のサービスを統合して使用するシステムを作成できます。各システムには長所と短所があり、これらの長所と短所を使用して、ニーズに最適なシステムを決定する必要があります。






All Articles