目次
はじめに
スケーラビリティと可用性が高いと言われている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の
- スケーラビリティ
- レイテンシー
といった両方の特性を実現させるということです。
では、この実現のためにどうしたかというと、DatastoreではEntity Groupというまとまりを利用しました。
簡単に説明すると、Datastoreの構成として基本的にはNoSQLの考えを用いるが、Entity Groupの中ではRDBMSの考えを用いる、というものです。
Entity Groupの仕組み
マクロな視点から
Entity Groupは、データセンター間のレプリケーションでもStrong Consistencyにデータが反映されます。
ミクロな視点から
Entity Group内にlocal indexがあり、Strong Consistencyを保ちたいデータはこの中に保存します。一方Eventual Consistencyで保ちたいデータは、Entity Group全体で共有されているglobal indexに保存します。
まとめ
今回は、Google Cloud Datastore の仕組みについてConsistency(一貫性)に着目して説明しました。
DatastoreではStrong ConsistencyとEventual Consistencyの両方の恩恵を得られる仕組みになっており、開発者はそのバランスを選択できます。
また、この仕組みの実現には、Entity Groupが利用されており、Entity Groupを使うか使わないかで、StrongとEventualな一貫性を使い分けることが出来ます。
次回はCloud Datastore について、具体的にコードを使った説明をしたいと思います。また、パフォーマンスチューニングの仕方や、Entity Groupの規模や更新頻度によって、レイテンシーがどう変化していくかについても検証して行きたいと思っています。