本日の発表は、インターネット時代のスケーラブルなアプリケーションのために設計された高速かつスケーラブルな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を読み込み、オブジェクトへのリファレンスを作成します。
テーブルの作成には、テーブル名、キーの設定、スループット設定の3つの引数が必要です。
$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を用いてステータス等の情報の取得ができます。
こちらがそのPHPオブジェクトの結果です。
(
[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が使えます)
{
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のキーでデータを取得するのも簡単です。
{
$Key = array('HashKeyElement' => array(AmazonDynamoDB::TYPE_STRING => (string) $i));
$Item = $DDB->get_item(array('TableName' => TABLE,
'Key' => $Key));
print_r($Item->body->Item);
}
PHPオブジェクトとして戻る各アイテムはこのようになります。
(
[RecordId] => CFSimpleXML Object
(
[S] => 44
)
[Square] => CFSimpleXML Object
(
[N] => 1936
)
)
DynamoDBのAPIは、queryやscan関数も含んでいます。query関数は、主キーの属性値をクエリーし、比較演算を利用できます。scan関数は、テーブル全体を検索し、フィルタリングをかけます。一般的にクエリーのほうがスキャンよりも効率的です。
また、アイテムの更新、複数アイテムの取得、アイテムの削除、複数アイテムの削除も行えます。条件付き更新も使えますが、詳しくは、Amazon DynamoDB Developer Guideを参照ください。
いかがでしょうか?このDynamoDBは米国東リージョンで利用できますが、東京リージョンではまだ利用できません。しかしながら、ぜひ日本からもDynamoDBを使ってみて、フィードバックを頂ければと思います!
玉川憲 (@KenTamagawa)

テスト
投稿情報: Lnkusu | 2012/01/18 19:33