Structuring Data for Strong Consistency
Google App EngineのHigh Replication Datastoreにおける一貫性の振る舞い
Google App EngineのHigh Replication Datastoreは複数のデータセンター間でデータの同期を行い、読み込みと書き込みの高可用性を実現しているが、コミットした書き込みが全てのデータセンターで見れるようになるには遅延が生じる、これは、複数のエンティティグループにまたがる更新は結果整合性となる為である。よって、時々変更が反映されていないデータをクエリーで抽出する事となる。
強一貫性をクエリーの結果に与える為には、一つのエンティティグループに限られている先祖クエリーを用いる事が必要である。これは、エンティティグループをトランザクショナリティーに一貫性を持たせる事が出来る。全てのデータに対する処理は、エンティティーグループに適用される。よって、エンティティグループの全てのデータが更新されるまで、先祖クエリーは結果を返さない。特定のクエリーが強一貫性に依存している場合は、先祖クエリーをいかせるようにデータモデルの設計について考慮する必要がある。
・GQLを使う例
greetings = db.GqlQuery("SELECT * "
"FROM Greeting "
"WHERE ANCESTOR IS :1 "
"ORDER BY date DESC LIMIT 10",
guestbook_key(guestbook_name))
・Ancestor Filtersを使う例
q = db.Query()
q.ancestor(ancestor_key)
・NDBを使った例
q = Greeting.query(ancestor=ancestor_key)
上記のクエリーを実行するとMainページで表示するGreetingのリストは必ず最新のデータを表示する事が出来る。
前回のトランザクション分離で話したコミットプロセスにおいて、先祖クエリもトランザクション内での処理同様に、下記の2つのマイルストーンで行われる。
・Milestone A エンティティに対する変更が適用された地点
・Milestone B インデックスに対する変更が適用された地点
トランザクション内部ではMilestone AとMilestone Bの間で更新された値をキーに抽出するようなクエリでは、抽出されたりされなかったりというのが起こるのだが、先祖クエリでは、クエリの実行後に確実に適用されることを保証している。
ただし、先祖クエリを実行するのには注意が必要だ。
先祖クエリーを実行するのは、1秒に一回程度にしておくべきである。(エンティティグループでサポートされている限度)もし頻繁に更新を行うような目的で先祖クエリを使用するなら他の方法を考えた方がいい。例えば、最新の更新は有効期限付きのmemcacheをつかって、最新のデータとデータストアからのデータを表示するとか、cookieのキャッシュを使うとか、URLに状態を持っておくなど。目的は、ユーザーが書き込みを行っている期間の為に、現在のユーザーにデータを提供するキャッシングソリューションを見つけることである。トランザクション内であれば、いつでも最新の書き込みデータが見れることを覚えておく必要がある。(先祖クエリの代替案として)
もう一回、一貫性とトランザクション分離についてまとめると
・先祖クエリ(Read policy選択可)
一貫性:強い一貫性
トランザクション分離レベル:SERIALIZABLE
・トランザクション内での単一エンティティグループに対するクエリ
一貫性:強い一貫性結果整合性
トランザクション分離レベル:SERIALIZABLE
・トランザクション内でのクエリ(先祖クエリ以外)
一貫性:結果整合性
トランザクション分離レベル:SERIALIZABLE
・トランザクション外部でのクエリ(先祖クエリ以外)
一貫性:結果整合性
トランザクション分離レベル:READ_COMMITTED
実際に強一貫性と結果整合性のクエリを発行した際の挙動を調べてみたが、実際のところ先祖クエリを頻繁に実行したところでエラーになったり、遅延が発生したりってのは、体験できなかった。
また結果整合性についても同様で、古いデータが返ってきたりってのはなかった。
おそらく何百ミリ秒という世界でレプリケーションが完了してしまうからであろう。
ただし、確実に最新のデータが必要な場合は先祖クエリにてクエリを発行する必要があるので、データモデルの設計については考慮が必要である。
引き続き、High Replication Datastoreの基盤となっている、Google Megastoreについて、さらにHigh Replication Datastoreについて掘り下げていきたい。
Comments
Add Comment