Slide 1

Slide 1 text

Megastore 2021.08.20@a2ito

Slide 2

Slide 2 text

Publication Megastore: Providing Scalable, Highly Available Storage for Interactive Services Jason Baker, Chris Bond, James C. Corbett, JJ Furman, Andrey Khorlin, James Larson, Jean-Michel L´eon, Yawei Li, Alexander Lloyd, Vadim Yushprakh Proceedings of the Conference on Innovative Data system Research (CIDR) (2011), pp. 223-234

Slide 3

Slide 3 text

Megastore 概要 ● 分散KVS ○ strong consistency と high availability ● Google Cloud の Datastore は Megastore を用いて実装されている

Slide 4

Slide 4 text

Google Cloud Technology Innovations https://speakerdeck.com/googlecloudjapan/mobairu-kpi-fen-xi-falsexin-biao-zhun-fluentd-plus-google- bigquery-number-gcpraibu-number-gcpja?slide=6

Slide 5

Slide 5 text

参考:Datastore の特徴 ● 任意のストレージ容量 ● ACIDトランザクション ● 強整合性と結果整合性 ● マルチテナンシ ● オートスケーリング ● 暗号化 ● 冗長性(リージョナル、マルチリージョナル)

Slide 6

Slide 6 text

参考:Datastore のユースケース ● ユーザプロファイル ● リアルタイムインベントリ ● ユーザセッション管理 ● 状態のミューテーション ○ ユーザのランキング処理 ● キャッシュ

Slide 7

Slide 7 text

参考:Firestore ● 従来の Datastore は Firestore に統合されている ○ リブランディング ○ ネイティブモードとDatastoreモード ● モバイルアプリやウェブアプリの場合は、ネイティブモードが推奨 ○ 数百万のクライアント同時実行までオートスケール ○ そうでない場合は、Datastoreモードで。 ● あとからはモード変更できない ● 料金体系は同じ ○ 容量とオペレーションに依存

Slide 8

Slide 8 text

参考 https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-google-cloud-2019124-129066005

Slide 9

Slide 9 text

Datastore: Kind・エンティティ・プロパティ ● Kind:シートやテーブル ● エンティティ:行 ● プロパティ:列 https://www.school.ctc-g.co.jp/columns/nakai2/nakai207.html

Slide 10

Slide 10 text

Ancestorパス (祖先パス) ● エンティティは親子関係を設定できる ● エンティティを識別できる「種類と識別子のペア」をAncestorパス(祖先パス)と 呼ぶ [User:alice, TaskList:default, Task:sampleTask] ● 基本戦略としては、関連性の高いデータは”エンティティグループ”にまとめること ○ 例:特定のユーザに紐づくプロファイルデータ

Slide 11

Slide 11 text

グローバルクエリとAncestorクエリ ● グローバルクエリ ○ ある Kind に含まれるすべてのデータを検索対象とするもの ○ 結果整合 ○ 例 ■ SELECT * FROM Book WHERE pages > 999 ● Ancestorクエリ ○ エンティティグループを指定して検索 ○ 強整合 ○ 例 ■ SELECT * FROM Book WHERE pages > 999 AND __key__ HAS ANCESTOR Key('Organization', 'Flywheel', 'User', 'Alice')

Slide 12

Slide 12 text

本棚アプリ ● ユーザ毎に本棚の情報を記録 ● エンティティグループによって、ツリー状にデータを関連付け

Slide 13

Slide 13 text

Megastore のアーキテクチャ ● 複数のデータセンターにデータを分散 配置 ● エンティティグループ毎にパーティショニ ング ● バックエンドにはBigtableを利用 ● Paxosによって複製処理を効率化 ○ 過半数のセンタに書き込みが完了したらレ スポンスを返却

Slide 14

Slide 14 text

強整合の実現 ● データレプリケーションの状態はエンティティグループ単位で管理される ● Bigtableのテーブル上では、ルートエンティティに対応する行にレプリケーション の状態を示す情報が記録されている ● 最新のデータが反映されたことを確認した上で検索処理を実行する

Slide 15

Slide 15 text

グローバルクエリの概要 ● グローバルクエリ(ANCESTOR句が含まれないもの)は結果整合となる ○ グローバルインデックス ● エンティティグループ間のトランザクションが非同期で実行される

Slide 16

Slide 16 text

Transactions and Concurrency Control ● serializable ACID ● WALログを実装 ● MVCCを採用 ○ Bigtable のタイムスタンプ別に valueを保存できる機能を利用 ● Read は current, snapshot, inconsistent の3種類を提供 ○ current : write 適用後 ○ snapshot : 最新のタイムスタンプ ● 2PCも使えるけど基本非推奨

Slide 17

Slide 17 text

トランザクションの流れ 1. Read ○ 最新のタイムスタンプとログ位置を確認 2. Application logic ○ Bigtable から値を読んで、writes を準備 3. Commit ○ Paxos によるデータ複製 (to log) ○ OCC (Optimistic Concurrency) による排他 4. Apply ○ Bigtable に書き込み 5. Clean up ○ 不要なデータを削除

Slide 18

Slide 18 text

Megastoreのインスタンス ● two full replicas と one witness replica ● Client library が Bigtable に書き込むことで Paxos operation を実行 ● 通信コスト最小化のため、Remote Bigtable へは Replication Server 経由

Slide 19

Slide 19 text

Replicated Logs ● log エントリの各レプリカを Bigtable に格納 ● Quorum によって consensus を形成 Write Ahead Log

Slide 20

Slide 20 text

Reads (current read) 1. Query Local ○ local replica が最新かどうかを Coordinator から確認 2. Find Position ○ a) local replica を読む ○ b) 最適なポジションを確認 (Optional) 3. Catchup ○ ログのキャッチアップ 4. Validate ○ up-to-date の印をつける ○ 返事は待たない 5. Query Data ○ timestamp を使って replica を読む

Slide 21

Slide 21 text

Writes 1. Accept Leader ○ 値が最新であれば step 2 をスキップ 2. Prepare (Optional) ○ Paxos Prepare phase 3. Accept ○ 残りのノードに値を受け入れてもらう 4. Invalidate (Optional) ○ Quorum にならなければ無効化 5. Apply ○ 値を適用

Slide 22

Slide 22 text

Coordinator Availability ● Coordinator プロセスダウンは可用性の低下に繋がる ● Failure Detection ○ NW分断検知のため、out-of-band protocol を使用 ■ Chubby lock service ● Validation Races ○ 競合するリクエストの扱い ○ ログの位置によって判定

Slide 23

Slide 23 text

Operational Issues ● レプリカ障害or通信断による Megastore のパフォーマンス影響を減らしたい ○ 対策1.クライアントに影響のあるレプリカを利用させないようにする ■ Chubby lock を持ったままかもしれない ○ 対策2.レプリカの coordinators を無効化 ○ 対策3.レプリカを完全に使わなくさせる

Slide 24

Slide 24 text

Production Metrics ● more than 100 production applications ● 右図:Read/Write毎の可用性 ● テスト環境やバッチ処理などの失敗を含 む

Slide 25

Slide 25 text

Production Metrics ● 通常の平均レイテンシ ○ Read 10ms程度 ○ Write 100-400ms程度 ○ データ量によって変わる ● Read/Write のアプリケーションの平 均レイテンシ

Slide 26

Slide 26 text

Experience ● テスト容易性を重視して開発 ○ アサーション、ロギング ● 疑似乱数を用いた探索的テストによって多くの問題を発見 ○ Through running thousands of simulated hours of operation each night, the tests have found many surprising problems.

Slide 27

Slide 27 text

まとめ ● a scalable, highly available なデータストア Megastore ● Paxos によるレプリカの同期及び fast failover ● Bigtable を使用 ○ ACID、インデックス、キューを追加 ● エンティティグループによるサブデータベース分割 ● 内外含め100以上のアプリケーションが利用している