*

Datastoreの仕組み ~Consistencyについて~

公開日: : 最終更新日:2017/04/24 投稿者: Cloud Datastore, GAE ,

はじめに

スケーラビリティと可用性が高いと言われているGoogle Cloud Datastore。
しかし、それはなぜかと聞かれても、うまく答えられる方は少ないのではないでしょうか?
弊社ではGAEとともに、この3,4年ずっとDatastoreを活用したシステム開発に注力し、ノウハウを積み重ねてきました。
今回はそのDatastoreの仕組みについて少しお話しします。
特にACIDのConsistency(一貫性)に注視して説明します。
またこの記事は、Googleのこちらのページこちらの論文(pdf)を参考にして書かれています。
よかったらこの記事と読み比べてみて下さい。

一貫性って?

トランザクション処理を行う上で、データの一貫性を保つことは絶対必要です。
よくある一貫性の例で、「残高は減っているのに相手に送金できてない!」などはあってはいけないですよね。
このように重要な一貫性ですが、その強さには程度があり、一般的に以下の2つの定義があります。

  • Strong Consistency
    更新直後から必ず最新の情報を取ってこれる。
    ただし、逆を言えば、最新の情報が反映されるまでは情報を取れない。
  • Eventual Consistency
    更新後十分な時間が経過しないと最新の情報を取れない。
    しかし、古い情報かもしれないが、いつでも情報を取れる。

注意して頂きたいのは、どちらも一貫性は常に保たれます(データの辻褄は必ず合っています)。
ただ、更新情報がいつ反映されるのかが異なります。

Strongがいいの? Eventualがいいの?

一概に言えません。Case by Caseです。
大抵の場合は以下のような切り分けが出来ます。

  • Strong Consistency
    情報が最新かどうかが、ユーザに多大な影響を与えるような処理の場合。
    具体例としては、「支払が完了したかどうか」や「オンラインゲームで対戦相手のポイントがいくつか」など。
  • Eventual Consistency
    大量のデータで大雑把な処理をするとき。
    具体例としては、「どの友人が現在オンラインかどうか」や「何人この記事に+1してくれたか」など。

どちらが優れているというものではなく、設計の段階で一貫性をどの程度に強めるかを考えることが重要です。

Datastoreでは両方を使い分けられる!

ここでDatastoreの登場です。
Datastoreでは、StrongとEventualの両方の一貫性を扱えるようになってます。
つまり、開発者が最適なバランスを見つけて設計・開発することができます。
どのようにして使い分けできるかというと、取得APIによって一貫性の強さを変えられます。

Google Cloud Datastore API インデックスを使わない インデックスを使う
Global Query Eventual Eventual
Keys-only Global Query Eventual Eventual
Ancestor Query Strong Strong
Lookup by key Strong

それぞれのAPIについての詳細や使い方については、また別の機会とします。
ここからは、Datastoreがどのようにしてこの機構を実現しているのか、Datastoreの内部について説明していきたいと思います。

Datastoreの仕組み

もともとDatastoreは、RDBMSとNoSQLのいいとこ取りをしたかったという点があります。
つまり、RDBMSの

  • 利便性(conveniency)
  • 一貫性(consistency)
  • 可用性(availability)

と、NoSQLの

  • スケーラビリティ
  • レイテンシー

といった両方の特性を実現させるということです。

Construction of Datastore

では、この実現のためにどうしたかというと、DatastoreではEntity Groupというまとまりを利用しました。

簡単に説明すると、Datastoreの構成として基本的にはNoSQLの考えを用いるが、Entity Groupの中ではRDBMSの考えを用いる、というものです。

Entity Groupの仕組み

マクロな視点から

Entity Groupは、データセンター間のレプリケーションでもStrong Consistencyにデータが反映されます。

Entity Group from a macro-viewpoint

ミクロな視点から

Entity Group内にlocal indexがあり、Strong Consistencyを保ちたいデータはこの中に保存します。一方Eventual Consistencyで保ちたいデータは、Entity Group全体で共有されているglobal indexに保存します。

Entity Group from a micro-viewpoint

まとめ

今回は、Google Cloud Datastore の仕組みについてConsistency(一貫性)に着目して説明しました。
DatastoreではStrong ConsistencyとEventual Consistencyの両方の恩恵を得られる仕組みになっており、開発者はそのバランスを選択できます。
また、この仕組みの実現には、Entity Groupが利用されており、Entity Groupを使うか使わないかで、StrongとEventualな一貫性を使い分けることが出来ます。
次回はCloud Datastore について、具体的にコードを使った説明をしたいと思います。また、パフォーマンスチューニングの仕方や、Entity Groupの規模や更新頻度によって、レイテンシーがどう変化していくかについても検証して行きたいと思っています。

この記事を書いた人

kajimaru3
How toよりWhyが気になるエンジニア

関連記事

Datastoreモデル変更の影響調査

GoogleAppEngine(以下GAEと呼称)に限らず、開発を行なっていると『テーブルの構造を変

記事を読む

東京リージョンによってGAEの速度は早くなったのか!?

ついにGAEに東京リージョンが新設されました!!サービス開始からGAEを触れていたユーザにと

記事を読む

Cloud Loggingの利用方法

はじめに 本記事はGoogle Cloud Platformの公式ページで公開されている「Goog

記事を読む

Google App Engine コンソールの小技

みなさんご存知、GAEのコンソールにはさまざまな機能があります。 あなたがデプロイしたアプリケ

記事を読む

GAE負荷テスト その2「無料で何PVまで表示できるのか試してみた」

その1のアップからだいぶ日が経ってしまい、いつの間にか年すら変わっていましたね。。。 " GA

記事を読む

Search API詳細解説 Part6「Search API 詳細 限界値編」

みなさん、こんにちは。 前回はSearch APIの反映速度について調べてみましたが、いかがだった

記事を読む

GAE/JからBigQueryへのStream Insert

今回はGAE/JからBigQueryへのStream Insertを試してみます。 BigQuer

記事を読む

Google App EngineからのSpreadSheetの権限変更について

Google App Engine(以下GAE)からGoogleDocsのSpreadSheetを操

記事を読む

15分でできる!!GAE/GOで高速REST APIを構築するための簡単手順 〜前編〜

iOSやAndroid等のクライアントアプリを開発する場合、サーバ側の開発も必要となるケースは多

記事を読む

AppEngineでTwilioを試してみた(応用編)

AppEngineでTwilioを試してみた(基本編) AppEngineでTwilioを試し

記事を読む

PAGE TOP ↑