今年に入って、AmazonがDynamoDBを発表しました。NoSQLでSSD使ってて、スループットを自在に変更できて、、等なにか凄いようなよくわからないようなサービスなわけですが、いろいろ使ってみたりネットを参照してみたりしてようやくその姿が見えてきました。
データの型
扱えるデータの型はString, int, Set(String, int)の4種類です。SetについてはJavaではHashSetしか使えないようです。LinkedHashSetを利用したら、書き込みはできましたが読み込みでエラーが出ました。 何か勘違いしてるかもしれませんが、、、
検索キー
テーブルの検索キーは最大2つ設定できます。具体的には
- HashKey・・・検索の Hash値として完全一致で特定するKey。
- RangeKey ・・・ 大小関係や前方一致などで範囲を指定して検索できるKey
の2種類が存在します。そして、その組み合わせは2種類のみです。
【HashKeyのみ】
1つのAttributeをKeyにします。その値は必ず1意にならなければなりません。
【HashKey+RangeKey】
2つのKeyを組み合わせることで一意になるようにキーを設定されます。この方法の場合
HashKey単体では1意にならなくて良いが、2つのKeyの組み合わせは必ず一意にならなければならない。
検索の方法と注意点
次の2種類です。
- Query ・・・ Keyを対象にした検索
- Scan ・・・ Key以外に対する検索
DynamoDBは幾らでもデータを増やすことができ、しかも検索スループットが保証されるという特徴としてあります。しかしこれは、キーを検索キーとした場合です。Scanを利用すると、このメリットは受けられません。Dynamodbの特徴を活かすのであれば、Scanの利用はオススメできないようです。
なお、一度の検索で最大1MBしか呼び出せないとマニュアルには書いてあります。ということは、1つのアイテムを1KBとした場合、最大でも1000件しか呼べないということになりますよね?じゃあ、1000件を超えることが予想されるデータの場合、どうすればよいのか?それはRangeKeyを利用して範囲検索を繰り返すことができるような設計が必要になるでしょう。
S3との連携は不可欠か?
アイテムの最大サイズは64KBらしく、数値と文字列しか入らないのでこの値が大きいのか小さいのか、、、まあ、画像とかバイナリーデータとか、ファイルなどの管理はここではやらず、S3を使えってことでしょう。これはまあ、SimpleDBのころからそういう流れですからAWSのユーザーであればなんてことはないですね。あと、多くの項目を格納しておきたいのであれば、S3にXMLで保存しておくのもアリだと思いますね。
課金対象と注意事項
課金が実は一番気になるところですが、一言でいうと、
- 「データベースのサイズ」と「設定した検索のスループット」が課金対象
となります。後者がわかりにくいですが、データベースを使おうが使うまいが、テーブルを作成すると設定したスループットに基づいて時間単位で課金されていきます。そして注意すべき点は、課金対象はテーブル毎に設定されたスループットの総和です。無料枠がReadで10, Writeで5となってますが、テーブルごとではなくその総和に対してです。しかもテーブルに設定するスループットの最低値が5となっているということ。テーブルを増やすほどスループット値は増えていきます。RDBの感覚でホイホイテーブル作ってると即課金対象になります。コストを抑えたいならテーブルをむやみに増やさないデータベース設計がポイントでしょう。ちなみに、read/writeをそれぞれ最低の5にしたテーブルを4~5つほど作っておくと、1ヶ月で10ドル超えます。
また、DynamoDBはスループットを柔軟に上げ下げできるという利点がありますが、ちょっと盲点があります。スループットを高くする場合は短時間で反映されますが、スループットを下げる時は1日ほど時間がかかるということ。つまり、細かく上げ下げしてコストを抑えるという方法が難しいということです。
というわけで、意外ととっつきにくい雰囲気のあるDynamoDBですが、おちラボでは今後、DynamoDBを研究用の基盤DBとして運用することに決めました。RDB的な使い方から脱却すればこんなに魅力のあるDBは他にないなというのが、現在の印象です。今後、DynamoDB周りでプログラミングノウハウが見つかれば、このBLOGでも紹介したいと思います。
0 件のコメント:
コメントを投稿