*

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が気になるエンジニア

関連記事

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

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

記事を読む

GAE/GOでTwitter Botを作ってみる~後編~

今回のapps-gcpは「GAE/GOでTwitter Botを作ってみる」の後編記事です。

記事を読む

GAE/GOでVideo Intelligence APIを操作してみた!!〜事前準備編〜

先週のGCP Next 17’でGoogleから新しい機械学習APIが発表されました!その名

記事を読む

たったの15分でできるGAE/GO入門 標準APIその1

知っておけば必ず開発が楽になる! GAE/Go入門の本連載ですが、前回は第一弾として「PaaS最前

記事を読む

Google App Engine Modules in Javaを試す WebToolsPlatform編

みなさんこんにちは。 2013年の7月に、Google App Engine1.8.2がリリー

記事を読む

AppEngine Security Scan Tool

AppEngine Security Scan Toolが利用出来るようになりました。ついては、GA

記事を読む

東京リージョン内でのGAE・GCS・GCE間の通信はこのくらいだった

11月8日に Google Cloud Platform にて待ちに待った日本リージョンがリ

記事を読む

Search APIの「Faceted Search」を使ってみた

Search API詳細解説シリーズは完結しましたが、2015年2月19日のAppEngine SD

記事を読む

1つのエンティティにプロパティをいくつまで作れるか

1つのエンティティにプロパティをいくつまで作れるか 1つのエンティティにプロパティをいくつまで

記事を読む

Search API詳細解説 Part5「Search API 詳細 反映速度編」

Search API詳細解説シリーズ タイトル Part1Search API 概要説明

記事を読む

PAGE TOP ↑