« 【AWS発表】 AWS無料使用枠で、 EC2のMicrosoft Windowsサーバも利用可能に | メイン | AWSマイスターシリーズ(無料Webセミナー) 本日1/23 18:00から開始します »

【AWS発表】 Amazon DynamoDB - インターネット時代のアプリケーションのために設計された高速でスケーラブルなNoSQLデータストレージ

本日の発表は、インターネット時代のスケーラブルなアプリケーションのために設計された高速かつスケーラブルなNoSQLデータベースである Amazon DynamoDBです。これは、Amazon Web Servicesが、Amazon S3やAmazon SimpleDBといった、ノンリレーショナルなデータベースとクラウドサービスの運用で培ってきた経験の集大成となる新サービスです。Amazon DynamoDBは信頼性、データ耐久性が高いデータベースサービスであり、そのデータ容量は無制限、アクセス性能を自在にコントロールできるという特徴を持っています。そして、そのデータは、SSD(Solid State Drive)に保存され、どのような規模であっても高速なパフォーマンスを提供できます。

下記の紹介ビデオをご覧ください(Youtube下部の『CC』から日本語キャプションを選択できます)。

 

インターネット時代におけるWebアプリケーションは、利用ユーザ数やトラフィック量、データ量が膨大に増えがちであり、しばしばデータベースをスケールさせるのに困難を伴います。Amazon DynamoDBを用いれば、開発者はアプリケーションに本当に必要な分だけのデータベースの性能でスモールスタートでき、そのアプリケーションが成長したときに、必要なだけ性能を増加させることができます。保存されているデータ量が増えるにつれて、テーブルも制限なしに自動的に大きくなります。そして、DynamoDBを使うユーザは、サーバや、ディスクや、ソフトウェアのインストール、設定、アップデート等を考えなくて良いのです。DynamoDBは、ユーザーが意識することなく、その裏側で自動的に十分な数のサーバにまたがってデータとトラフィックを分散させ、ユーザに指定された容量に見合うように調整します。DynamoDBは、どのようなスケールであっても、一般的に、平均数ミリ秒の安定した低遅延なパフォーマンスを発揮するのです!

では、もう少し詳細にDynamoDBをみてみましょう。

DynamoDBでは、スループット設定 (provisioned throughput) という仕組みを持っています。DynamoDBのテーブルを作成する際、どれくらいの読込みと書込みが必要か設定できます。AWSが裏側で、ミリ秒レベルの低遅延を維持しつつ、そのニーズにこたえられるように全てをセットアップします。もし後から設定を変更したければ、そのスループット設定を変更して、上げ下げすれば良いのです。AWSがそれにしたがって調整を行います。その設定は、オンラインでおこなえ、ダウンタイプや全体のスループットに影響はありません。言い換えれば、データベースがリクエストを処理している最中ですら、スケールアップすることが可能です。

DynamoDBにおいて、新しくテーブルを作成すると、約1~2分で利用可能になります。テーブルが作成されると、あとはデータをそこに(好きなだけ)保存するだけです。あとは、実際に使ったストレージ容量を支払うことになります。あらかじめストレージ容量を確保しておく必要無いのです。これも、ユーザーが意識することなく、裏側で、適切な量のストレージを調整しているのです。

ここまで読んでDynamoDB、良さそうだなと思っていただけたでしょうか?さて、では信頼性やデータ耐久性はどうでしょうか?一言でいうと、非常に高い信頼性、データ耐久性を持っています!DynamoDBのテーブルをあるリージョン(例えば、東京リージョン)で作成すると、そのデータは複数のゾーン(東京リージョンの中の異なる物理データセンタ)にまたがり同期的にコピーされます。こうすることで、サーバレベルの障害のみならず、万が一、データセンタレベルの障害の際にも影響をうけることがありません。

DynamoDBのパフォーマンスについては何度も強調しておきたいと思います。スモールスタートから(例えば、5リード/秒)、50リード、500リード、5000リード、さらに50000リード/秒にスケールアップすることができます。そしてこの変更の間もオンラインであり、アプリ側のコードに変更は必要ありません。もちろん、読込みだけでなく書込みに関しても同様のことが可能です。DynamoDBはシステムやビジネスとともに成長し、その成長の妨げになることは無いのです。

このDynamoDB、もちろん、AWS無料使用枠の中で利用できます。100MBのストレージ、5ライト(書込み)/秒、 10リード/秒(強一貫性 - strongly consistent reads - の場合) もしくは20リード/秒(結果整合性 - eventually consistent read - の場合)が無料になります。それを超えた場合は、料金はどれくらいのスループットでどれくらいのデータ量を保存したかで決まります。AWSの他のサービスと同様に、同一のリージョン内におけるEC2インスタンスとDynamoDBテーブルの間でのデータ転送には料金はかかりません。

初期設定では、256テーブルまで作成でき、10000リード/秒、 10,000/秒まで設定できるようになっています。より多くのテーブル数、読込み、書込みが必要な場合、こちらから申込みください。すでにご利用になられているお客様の中には、すでにこの初期設定を超えて利用されています。

AWS Management ConsoleからDynamoDBの利用
AWS Management Consoleに、新しくDynamoDB用のタブができています。新しいテーブルを作成し、スループットを設定し、インデックスを決め、CloudWatchアラームを作成するまで、Webコンソールから実施できます。

下記のフォームからキャパシティの設定を手動で設定します。

もしくは、簡単なカルキュレーターを用いて、必要なスループットを計算することもできます。

CloudWatchのアラームも下記から設定でき、たとえば、スループット設定のある一定の割合を超えたらメールで通知することも可能です。

さらにCloudWatchのメトリクスを使って、書込みや読込みのスループットを追加するタイミングを確認することもできます。

作成後に、あとから、スループットを変更するこもともちろん可能です。

DynamoDBを用いたプログラミング

さて、ここでは、より詳細に、DyanamoDBを使ったプログラミングについてみていきましょう。

まず、DynamoDBにおける各テーブルは主キー (primary key) を持ちます。今回のリリースでは、2種類の主キーがあり、シンプルハッシュキー(Simple Hash Keys)、レンジキーを持つコンポジットハッシュキー (Composite Hash Key with Range Keys)があります。

  • シンプルハッシュキー (Simple Hash Keys) は、分散ハッシュテーブルであり、ユニークキーにおけるインデックスとして利用されます。キーは複数の処理、ストレージにハッシュされ、ワークロードを最適化します。
  • コンポジットハッシュキー (Composite Hash Keys with Range Keys) では、、2つの属性を持つ主キー作成することができます。ハッシュ属性と、レンジ属性です。キーの種類でクエリーをかけると、ハッシュ属性は完全に一致する必要がありますが、レンジ属性の場合、範囲で特定することができます。例えば、"all orders from Ken in the last 24 hours"といったクエリーをかけることができます。

DynamoDBにおける各アイテムが、キー・バリュー・ペアで構成されています。各バリューは、ストリング、数値、ストリングセット、数値セット のどれでも構いません。アイテムを取得する際は、強一貫性(strongly consistent read)か、結果整合性(eventually consistent read)のどちらかをニーズにあわせて選択します。結果整合性の場合は、半分のリソースしか消費しません。そのため、スループットにおけるトレードオフを考慮してどちらか選択する必要があります。

AWS SDKsもDynamoDBのためにアップデートされています。下記の例は、AWS SDK for PHPを用いたものです。最初はSDKを読み込み、オブジェクトへのリファレンスを作成します。

require_once("sdk.class.php");
$DDB = new AmazonDynamoDB(array('credentials' => 'production'));

テーブルの作成には、テーブル名、キーの設定、スループット設定の3つの引数が必要です。

// Create a table
$Schema = array('HashKeyElement' =>
                array('AttributeName' => 'RecordId',
                      'AttributeType' => AmazonDynamoDB::TYPE_STRING));

$Throughput = array('ReadsPerSecond' => 5, 'WritesPerSecond' => 5);

$Res = $DDB->create_table(array('TableName' => 'Sample',
                                'KeySchema' => $Schema,
                                'ProvisionedThroughput' => $Throughput));

create_tableの返り値が戻ると、テーブルのステータスは, CREATINGとなります。テーブルが作成されるとACTIVEに変わり、データを保存することができます。describe_table functionを用いてステータス等の情報の取得ができます。

$Res = $DDB->describe_table(array('TableName' => 'Sample'));
print_r($Res->body->Table);

こちらがそのPHPオブジェクトの結果です。

CFSimpleXML Object
(
    [CreationDateTime] => 1324673829.32
    [ItemCount] => 0
    [KeySchema] => CFSimpleXML Object
        (
            [HashKeyElement] => CFSimpleXML Object
                (
                    [AttributeName] => RecordId
                    [AttributeType] => S
                )

        )

    [ProvisionedThroughput] => CFSimpleXML Object
        (
            [ReadsPerSecond] => 5
            [WritesPerSecond] => 5
        )

    [TableName] => Sample
    [TableSizeBytes] => 0
    [TableStatus] => ACTIVE
)

新しいアイテムを挿入するのは簡単です。各アイテムのデータタイプを指定する必要があります。下記がその例です。Squareには、二乗した数字を入れています。(他にも、データタイプとしては、TYPE_ARRAY_OF_STRINGS、TYPE_ARRAY_OF_NUMBERSが使えます)

for ($i = 1; $i < 100; $i++)
{
  print($i);
  $Item = array('RecordId' => array(AmazonDynamoDB::TYPE_STRING => (string) $i),
                'Square'   => array(AmazonDynamoDB::TYPE_NUMBER => (string) ($i * $i)));

  $Res = $DDB->put_item(array('TableName' => 'Sample', 'Item' => $Item));
}

RecordIdのキーでデータを取得するのも簡単です。

for ($i = 1; $i < 100; $i++)
{
  $Key = array('HashKeyElement' => array(AmazonDynamoDB::TYPE_STRING => (string) $i));

  $Item = $DDB->get_item(array('TableName' => TABLE,
                               'Key'       => $Key));

  print_r($Item->body->Item);
}

PHPオブジェクトとして戻る各アイテムはこのようになります。

CFSimpleXML Object
(
    [RecordId] => CFSimpleXML Object
        (
            [S] => 44
        )

    [Square] => CFSimpleXML Object
        (
            [N] => 1936
        )

)


DynamoDBのAPIは、queryやscan関数も含んでいます。query関数は、主キーの属性値をクエリーし、比較演算を利用できます。scan関数は、テーブル全体を検索し、フィルタリングをかけます。一般的にクエリーのほうがスキャンよりも効率的です。

また、アイテムの更新、複数アイテムの取得、アイテムの削除、複数アイテムの削除も行えます。条件付き更新も使えますが、詳しくは、Amazon DynamoDB Developer Guideを参照ください。

いかがでしょうか?このDynamoDBは米国東リージョンで利用できますが、東京リージョンではまだ利用できません。しかしながら、ぜひ日本からもDynamoDBを使ってみて、フィードバックを頂ければと思います!

玉川憲 (@KenTamagawa)

 

 

コメント

トラックバック

この記事のトラックバックURL:
http://www.typepad.com/services/trackback/6a00d8341c534853ef0162ff0d3525970d

【AWS発表】 Amazon DynamoDB - インターネット時代のアプリケーションのために設計された高速でスケーラブルなNoSQLデータストレージを参照しているブログ:

Featured Event

2016年3 月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31