Amazon SimpleDBについて調べたことをまとめました
こんにちは。大橋です。
最近、セールスフォース関連の仕事でAmazon SimpleDBの話題がでることがあったのですが、
EC2やS3に比べると情報が少ないなぁ、というのを実感しました。
そこで、SimpleDBについていろいろ勉強してみました。ただ、量が多いので分割して
記事にしたいと思います。今回の記事ではSimpleDBとは何かということ、RDBと比較しながら
データモデルの説明、そしてどのような操作(API)があるのか、制約、メリットなど、
調べたことをまとめたいと思います。
【SimpleDBとは?】
SimpleDBはHTTPベースのAPI(REST/SOAP)で操作できる構造化されたデータストアです。
Amazonのページによると以下のように説明があります。
Amazon SimpleDB は可用性、拡張性、柔軟性の高い、非リレーショナル型データストアで、
データベース管理の負荷を軽減します。開発者は簡単なwebインターフェイスを使ってデータの保存や参照を行うだけで、
後はAmazon SimpleDB が残りの部分を担当します。
RDBではないのですが、ある程度構造化されたデータをHTTPベースのAPIで
簡単に扱うことができるデータベースというところです。
では、中身を追っていきます。
【データモデル】
Amazon SimpleDBのデータモデルをRDBと比較しながら説明します。
例として以下のような書籍データベースを考えてみます。
RDB的には以下の表そのものがテーブルに該当します。フィールドは書籍名(Name)、価格(Price)、商品のURL(URL)、著者名(Author)で、主キーにあたるところがISBN(Item Name)にあたると考えてください。
SimpleDBでは、上記の表のようなデータについて以下のように考えます。
(やや乱暴な言い方ですが、)RDBのテーブルに該当するのが「ドメイン」です。上記の表の1レコード1レコードは1つのアイテムです。
アイテムにはアイテムを一意に決めるユニークなキーがあります。それがItemのNameです。
ここはユニークでないといけません。この書籍のデータではISBNを入れています。
アイテムは複数の属性(Attribute)を持ちます。これが書籍名(Name)、価格(Price)、商品のURL(URL)などのフィールド(カラム)に該当します。各属性には名前と値があり、Price(名前)=3780(値)というように指定します。また、値はすべて文字列で、インデクシングされます。RDBならば各属性には1つの値しか入れることはできませんが、SimpleDBでは1つの属性に複数の値を入れることができます。上記の表では著者名(Author)が該当します。
なんとなく分かりましたでしょうか。乱暴な言い方をすれば、以下のように考えればよいかと。
- テーブルがドメイン
- RDBのレコードにあたるものがアイテム(Item)
- 主キーにあたるところがItem Nameでドメイン内ではユニークでないといけない
- 各フィールド(カラム)のことは属性(Attribute)という。
- 1つのアイテムのある属性の値は複数持つことができる
- 属性の値は文字列だけ。すべての値はインデクシングされる。
【SimpleDBの機能】
次に、SimpleDBがアプリ開発者に提供している機能を紹介します。ドメイン操作に関することと、アイテムなどデータを操作に関することの大きく2つの機能群があるのでそれぞれ説明します。
ドメイン操作
ドメイン操作には以下の4種類の機能がAPIとして提供されています。
- CreateDomain
ドメインを作成します
- DeleteDomain
ドメインを削除します
- ListDomains
アクセスキー、秘密キーでアクセスできるドメインのリストをできます。
- DomainMetaData
ドメイン名、ドメイン内のアイテム数や属性値の数など、ドメインに関するメタ情報を取得できます。
データ(Item)操作
データ操作には以下の操作がAPIとして提供されています。
- PutAttributes
アイテムと属性を登録するか、アイテム名を指定して属性を登録/更新します。
- GetAttributes
アイテムのNameを指定して、アイテム情報を1件取得できます。
- BatchPutAttributes
複数のアイテムをまとめて登録/更新できます。(1回の操作で25件)
- Select
SimpleDB用のselect文でアイテムを取得できます。
- DeleteAttributes
アイテムから属性を削除します。また、アイテムそのものを削除します。
- BatchDeleteAttributes
複数のアイテムについて属性削除からアイテムそのものを削除します。
【ドメイン/アイテムに関する制約事項、気をつけるポイント】
ここまで、「どんなことができるか」を簡単に説明してきましたが、それなりに制約もあります。
以下に気をつけたほうがいい制約事項を列挙します。
- APIのリクエストサイズは1MBを超えることはできません。(BatchPutAttributesあたりで関係します)
- 1つのアイテムにつき、属性は最大256個までです。
- 1つのドメインに10億アイテムまで格納できます。つまり、それを超えた場合はドメイン名を変更するなど対処が必要です。
- ドメインごとに最大10GBのユーザデータを持つことができます。
- 1つのアカウントにつき100件のドメインを作成できます。ただし、AWSのサポートに連絡すれば追加ドメイン作成もお願いできるようです。※ http://aws.amazon.com/contact-us/simpledb-limit-request/ でお願いできるみたいです。
- 1つのクエリ(select)で取得できるアイテム数は最大2500です。
- RDBではないので、joinはできません。工夫してデータモデルの設計を行いましょう。
- RDBのようにスキーマを事前に定義するわけではありません。いわゆるスキーマレスなデータベースになります。
それと、Wikipediaに以下のように記載がある通り、CAP定理に置ける一貫性は成立していないです。この辺がクラウド的(?)です。
CAP定理において、一貫性が成立していなく、それゆえ、書き込みをしても、一貫性読み込みを指定しない限り、読めるようになるまで1秒程度以下の時間がかかる。
【うれしいポイント】
制約も説明したので、個人的にうれしいと思っているポイントも列挙しておきます。
- 管理が簡単
インストールとかセットアップとかほとんど不要です。
バッファとか一所懸命調整しなくても十分なパフォーマンスが出ます(出るらしいです)。
- 高い可用性
Amazon S3やSQSと同じように高い可用性があります。
データは地理的に分散された環境の保存されるのでMySQLで
一所懸命レプリケーション設定する、みたいなことはしなくてよいです。
- EC2と使うのであれば高速
同一リージョンであればLAN内アクセスと同程度の遅延でアクセスできます。
- HTTPベースなのでEC2以外からも容易にアクセスできる
オンプレミスの環境やセールスフォースなど他のクラウド環境からも
REST/SOAPのAPIを通じて簡単にアクセスできます。
SimpleDBを介したデータ連携なども容易にできます。
(注意しないとセキュリティ上危険なことにもなりそうですが)
- すごく安い
あとで説明しますが、すごく安いです。
Amazonのデータベースサービスでは他にAmazon RDSが
ありますが、それと比べてもずっとずっと安いです。
【課金体系】
詳細は以下を見てください。安いです。
http://aws.amazon.com/jp/simpledb/#pricing
US価格だとデータ転送は送信に限り、0.15ドル/GB(US価格)、データ保存は1ヶ月に0.25ドル/GBです。それぞれ最初の1GBは無料です。それと、PUT/GET/Selectなどのクエリを実行するのに使ったSimpleDBのマシン稼働時間も課金対象です。毎月、最初の25時間は無料で、そのあとは1時間あたり0.140ドルです。
【まとめ】
今回はSimpleDBについてその概要的なことを説明しました。
joinができない、スキーマレス、一貫性、あたりにとまどいが出てしまう面はありますが、
簡単に使えて、Amazonクォリティの可用性があるデータベースということで、けっこう魅力があると思っています。特に、EC2だけでなく多様な環境が入り交じったときなどにHTTPベースのAPIで操作できることは大きなメリットがあるのではないかと考えています。
次回からはコマンドラインでの使い方やプログラムからの使い方など
より実戦で使いそうな内容を書いていきたいと思います。
コメント