Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Google Cloud Spanner FAQ

Google Cloud Spanner FAQ

Google Cloud Spannerをまだあまり知らない人向けに、FAQを軸にして概要とTipsを発表しました。
https://docs.google.com/presentation/d/1baCbSRJupSOrXgkOXgxODPzu3FyKotyQLnLRHLfyDmc/edit#slide=id.p

Avatar for Tatsunori Sunagawa

Tatsunori Sunagawa

September 23, 2018
Tweet

More Decks by Tatsunori Sunagawa

Other Decks in Programming

Transcript

  1. What’s Cloud Spanner ? • Google Cloud PlatformのRDB製品 ◦ SQL

    ◦ 強整合性 ◦ 高可用性 ◦ スケーラブル ◦ フルマネージド 2
  2. Cloud SpannerはRDBですか? 6 RDBの顔 • SQL • トランザクション • 強整合性

    KVSの顔 • アーキテクチャ • 水平スケールが容易 • 外部キー制約が使えない RDBの皮をかぶったKVS
  3. Cloud SpannerはRDBですか? 7 RDBの顔 • SQL • トランザクション • 強整合性

    KVSの顔 • アーキテクチャ • 水平スケールが容易 • 外部キー制約が使えない RDBの皮をかぶったKVS
  4. Cloud SpannerはRDBですか? Entry Point Node 8 Node Node コンピューティング層 ストレージ層

    Split Split Split Split Split Split Split Split Split 1 - 100 101 - 200 201 - 250 ※Colossus 分散ファイルシステム上にある 251 - 300 301 - 400 401 - 500 501 - 600 601 - 700 701 - 800
  5. Cloud SpannerはRDBですか? Entry Point Node 9 Node Node コンピューティング層 ストレージ層

    Split Split Split Split Split Split Split Split Split 1 - 100 101 - 200 201 - 250 ※Colossus 分散ファイルシステム上にある 251 - 300 301 - 400 401 - 500 501 - 600 601 - 700 701 - 800 • レコードをsplit単位で管理している • 読み書き処理の実行を行う • スケールアウトの単位になっている
  6. Cloud SpannerはRDBですか? Entry Point Node 10 Node Node コンピューティング層 ストレージ層

    Split Split Split Split Split Split Split Split Split 1 - 100 101 - 200 201 - 250 ※Colossus 分散ファイルシステム上にある 251 - 300 301 - 400 401 - 500 501 - 600 601 - 700 701 - 800 • テーブルのレコードが分割されて格納されている • PKのレンジで分割される • 分割は自動的で行われる • 負荷状況に対応して再分割される • 1つのNodeに紐づく
  7. Cloud SpannerはRDBですか? • Splitの具体例 11 company_id (PK) name tel 1

    hoge 001-0000 2 fuga 002-0000 3 piyo 003-0000 ... 101 foo 101-0000 102 bar 102-0000 103 baz 103-0000 ... company_id: 1 ~ 100 のSplit company_id: 101 ~ 200 のSplit
  8. Cloud SpannerはRDBですか? Entry Point Node 12 Node Node コンピューティング層 ストレージ層

    Split Split Split Split Split Split Split Split Split 1 - 100 101 - 200 201 - 250 251 - 300 301 - 400 401 - 500 501 - 600 601 - 700 701 - 800 Split Split Split 1 - 50 51 - 100 101 - 200 テーブルごとに分割の範囲は異なる
  9. https://gcpug.jp 14 GCP Databaseの系譜 (sinmetalの主観) Bigtable Datastore Spanner Realtime DB

    Firestore 2006年 論文公開 2011年 リリース 2013年 論文公開 2017年 リリース 引用
  10. 既存のDDL/SQLやテーブル設計のノウハウは使えますか? 18 company_id (PK) name tel employee_id (PK) name 1

    hoge 001-0000 1 1 Taro 1 2 Jiro 2 fuga 002-0000 2 3 Saburo 3 piyo 003-0000 ... company_id (PK) employee_id (PK) name 1 1 Taro 1 2 Jiro 2 3 Saburo company_id (PK) name tel 1 hoge 001-0000 2 fuga 002-0000 3 piyo 003-0000 Companyテーブル Employeeテーブル Splitでの物理的な配置 親子関係にあるレコードが同じSplitにあることが保証される その結果、JOIN処理が安定して速くなる
  11. 既存のDDL/SQLやテーブル設計のノウハウは使えますか? • シーケンシャルなPKは使えない ◦ ホットスポットが発生してしまう 21 Entry Point Node Node

    Node コンピューティング層 ストレージ層 Split Split Split Split Split Split Split Split Split 1 - 100 101 - 200 201 - 250 251 - 300 301 - 400 401 - 500 501 - 600 601 - 700 701 - 800 (1, “hoge”, “001-0000”) (2, “fuga”, “002-0000”) (3, piyo, “002-0000”) … とシーケンシャルなPKが連続で挿入された このNodeだけに集中して負荷がかかる = ホットスポット
  12. https://gcpug.jp 22 • PKにしたい値から、分散する値を生成する ◦ ハッシュ ▪ Hash(1) -> Xjead

    = Xjead@1 ◦ 逆順 ▪ ID + 小分類 + 中分類 + 大分類 ◦ Shard ▪ crc32c(2018/06/10 18:36:37 …) % 10 = Modulo @2018/06/10 18:36:37 … PKの戦略 引用
  13. 既存のDDL/SQLやテーブル設計のノウハウは使えますか? • セカンダリインデックスもテーブル 23 company_id (PK) name tel 1 hoge

    001-0000 2 fuga 002-0000 3 piyo 003-0000 key PK fuga 2 hoge 1 piyo 3 ベーステーブル nameカラムに貼ったセカンダリインデックス インデックスを使った参照 1. keyから対象レコードのPKを特定 2. PKを使ってベーステーブルのレコードを参照
  14. 新規/既存サービスでの選択肢としてどうですか? • ユースケースは変わり得るためテーブル設計は慎重に ◦ インターリーブは不可逆です! 40 company_id (PK) name tel

    employee_id (PK) name 1 hoge 001-0000 1 1 Taro 1 2 Jiro 2 fuga 002-0000 2 3 Saburo 3 piyo 003-0000 ... 再掲)Splitでの物理的な配置 インターリーブを使った場合、 子レコードだけのレンジスキャンは遅い
  15. まとめ • アーキテクチャ ◦ RDB on KVS • 得意なこと ◦

    大量データを扱える ◦ 特定のJOIN処理を大量にさばける ◦ マルチリージョンで強整合性を担保できる • 現在地とロードマップ ◦ 現状、開発周りは発展途上の段階 ◦ Productionで要求される機能を揃えつつある 43