Google App Engineでアプリケーションを実行するまで
Google App Engine上で動くアプリケーションを開発するには、Google App Engine SDKをGoogle App Engineのサイトから取得する必要があります。図9にローカルのPCでの開発環境とGoogleサーバでの実行環境の関係を示しました。
管理コンソールでは、データストアに保存されたデータ、リソースの使用量、アプリケーションが出力したログなどをアプリケーションごとに参照できます。
Datastore
Datastoreはスキーマレスなデータベースで、そのバックエンドではGoogleが独自で開発したスケーラブルな分散ストレージであるBigtableが使用されています。Bigtableは、Googleが独自に開発したスケーラブルな分散ストレージ型データベースです。
Bigtableはシステムにサーバを簡単に増設し、再設定なしで追加したリソースを自動的に利用し始めるように設計されているので、数百から数千台のサーバのペタバイトまでの大規模データを容易に扱い、運用することを可能にしています。天文学的な量のデータを扱うGoogleのサービスを支えているのはこのスケーラブルなデータベースであるBigtableであるといっても過言ではないでしょう。
Bigtableは、OracleやMySQL、PostgreSQLのような一般的なリレーショナルデータベースではなく、キー(Key)と呼ばれる値を基に、それに対応する値を格納する形式の、いわゆるKey-Value型データベース(Key-Value Storage)です。
Kind、Entity、Property
Datastoreは、Kind、Entity、Propertyなどの概念を導入することによって、アプリケーションからBigtable上のデータを扱いやすくなるようなAPIを提供しています。以下の表に、Datastoreで使用される概念をまとめました。
名前 | 説明 |
Kind | RDBMSのテーブルに該当する。プログラム上では、クラスによって表現される。 |
Entity | Kindがインスタンス化されたもの。アプリケーションで扱うデータは、インスタンスとそのプロパティとしてDatastoreに保存される。 |
Property | インスタンスが保持する属性 |
トランザクション
Datastoreでは、Entity Groupという概念を導入し、Entity Groupの保存に関してのみトランザクションを保証しています。Entity Groupとは、ツリー状に階層化されたエンティティの集まりのことをいいます。Entity Groupを保存すると、同一Entity Groupのデータは、同一ノード上に保存されます。
DatastoreとBigtableのバックエンド
Bigtable は、アプリケーションからみると、巨大なテーブルのイメージですが、実際はタブレットと呼ばれる複数の行を1つの単位とした固まりとして分割され、保存されています。そして、そのタブレットの物理データは、分散ファイルシステムのGFS上に保存されます。これらの関係を図11に示しました。
タブレットサーバ
1つのタブレットサーバは、10~1000個のタブレットを管理し、1つのタブレットは100MB~200MBのサイズです。タブレットはGFS上に保存されますが、そのタブレットはSSTableという読み込み専用の単純な検索テーブルとして複数のファイルに保存されます。タブレットサーバは、タブレットごとにメモリ上にmemtableという読み書き可能な小さなテーブルを用意し、タブレットの内容の読み書きをそのテーブルのデータの上で実行します。memtableの読み書きの内容は、コミットログとしてGFS上に保存されるので、タブレットサーバが故障した場合も、コミットログによってその内容が復元されるようになっています。タブレットサーバは、memtableが大きくなった場合に、新しい SSTableに、そのデータ内容を書き出す「マイナーコンパクション」を実行し、データを保存します。
Google File System(GFS)
Bigtableの内容は、GFSに物理ファイルとして保存されます。GFSは、ロック機構を持たず、追記型でデータを次々と追加していく仕組みにすることで、巨大なディスク空間としてのスケーラビリティを実現しています。GFSは、多数のチャンクサーバ(Chunk Server)から構成されていて、それらのサーバに接続されたディスクに情報が保存されます。データの書き込みはGFSの機能で、3台のチャンクサーバにコピーされるので、1台のチャンクサーバが故障したとしても、他のチャンクサーバにデータは保存されているので、データの保全性は保たれることになります。