GCP上のKey-Value型データベースCloud Datastore
AWS DynamoDBとの比較
AWS DynamoDBとは、Amazon Web Servicesで提供されるKey-Value型の管理型データベースです。Cloud Datastoreと同じく、スキーマレスな構造でスケーラビリティと可用性において優れているという特徴があります。
Cloud Datastore | DynamoDB | |
---|---|---|
データベースの構造 | スキーマレス | スキーマレス |
プライマリキー | 1カラムから構成されるKey | 2カラムで構成されるKeys(Hash Key+Range Key) |
リストプロパティの作成 | 可能 | 可能 |
選択できる一貫性の種類 | ・結果整合性 ・強一貫性 | ・結果整合性 ・強一貫性 |
データセンター間をまたぐトランザクション処理 | 可能(Entity Group) | 可能(Transaction Library) |
単一プロパティに対するインデックス作成 | 可能(自動生成) | 可能 |
複数プロパティに対するインデックス作成 | 可能(カスタムでインデックスを登録する) | 可能(Local Secondary Index、Global Secondary Index) |
課金対象 | ・読み込み/書き込み操作 ・データ容量 | ・読み込み/書き込みスループットの容量 ・データ容量 |
一貫性
Cloud Datastore、DynamoDBのいずれも、一貫性については結果整合性を採用していていますが、場合により強一貫性を選択できるようにもなっています。
インデックス生成
Cloud Datastoreでは、単一プロパティに対してはインデックスが自動で生成されますが、DynamoDBでは、Local Secondary IndexあるいはGlobal Secondary Indexというインデックスを予め登録しておく必要があります。
課金体系
Cloud Datastore、DynamoDBのいずれも、データの読み込み/書き込み操作と保存したデータ量を課金対象としています。Cloud Datastoreにおいては、読み込み/書き込み操作の回数で計算されるのに対して、DynamoDBにおいては、プロビジョンされた読み込み/書き込みスループットの容量で計算されるという違いがあります。例えば、1日あたり100万回の書き込みは、1秒あたり平均11.6回の書き込みとなり、12の書き込み容量ユニットが必要です。東京リージョンでは、12の書き込み容量ユニットは1日あたり$0.2173かかることになります。
読み込み | 書き込み | データ容量 | |
---|---|---|---|
Cloud Datastore | 1日50,000回まで無料 それ以上$0.06/100,000回 | 1日50,000回まで無料 それ以上$0.06/100,000回 | 1GBまで無料 それ以上1GBにつき$0.18/月 |
DynamoDB | 25回/秒まで無料 それ以上は1回/秒ごとに$0.0544 毎月 | 25回/秒まで無料 それ以上は1回/秒ごとに$0.5432 毎月 | 25 GB/月まで無料 それ以上1GBにつき$0.285/月 |
データベース設計におけるベストプラクティス
RDBMSにおけるカラム方向の走査は、Cloud Datastoreではサーバをまたいだ処理となり、非効率です。「エンティティ間のJOINがない」「集計関数がない」「クエリの全文検索ができない」などのCloud Datastoreのデメリットは、こういった非効率性に起因しています。反面、同じサーバ内のデータを走査するような場合は、Self-merge Joinなどデータの取得を効率的に行う仕組みが提供されています。Cloud Datastoreにおいては、非効率な操作を避け効率的な操作のみ行うことが重要です。
スケーラビリティのためにはDatastore APIを使用する
Cloud Datastoreが備えるスケーラビリティの恩恵を受けるためには、GQLではなくDatastore APIのほうが適しています。Datastore APIはデータ参照の速度も速く、また非同期による読み込み/書き込みをサポートしているため、スケーラブルなアプリケーション開発が可能になります。また、キャッシュの自動化やトランザクション処理も備えており、Cloud Datastoreのパフォーマンスを最大限に発揮するにはDatastore APIの使用が望ましいです。
正規化しない
Cloud Datastoreにおいて、正規化は必ずしも必要ではありません。RDBMSにおける1対多あるいは多対多の関係性を実現する仕組みとして、KeyPropertyやリストプロパティという手法が提供されており、これらを使って非正規化を行います。Cloud Datastoreのデータベース設計において優先されるのは、データのatomicity(不可分性)ではなく、あくまで操作のefficiency(効率性)です。
一貫性を使い分ける
Cloud Datastoreでは、強度の異なる一貫性がありDatastore APIを利用して使い分けます。常に最新の情報をデータベースに反映させる必要がある場合は強一貫性を、そうでなければ結果整合性を選択します。
トランザクションが必要になったときにEntity Groupを使用する
Cloud DatastoreにおけるEntity Groupは、データセンターをまたいだトランザクション処理を実現させるための仕組みです。すべてのデータの操作に対して、トランザクション処理を行うのではなく、トランザクションが必要になったときのみEntity Groupを使用し処理を行うのが望ましいです。
【参考文献】
「Paxos Algorithm」
http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/archive/paxos_made_live.pdf
「Self-merge Join」
https://dl.google.com/io/2009/pres/W_0415_Building_Scalable_Complex_App_Engines.pdf