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

Cloud Spanner 導入の裏話/ColoplTech-02-01

COLOPL Inc.
February 16, 2022

Cloud Spanner 導入の裏話/ColoplTech-02-01

※資料内の参照リンクを選択し閲覧する場合は、ダウンロードをお願いいたします

\積極的に技術発信を行なっております/
▽ Twitter/COLOPL_Tech
https://twitter.com/colopl_tech

▽ connpassページ
http://colopl.connpass.com

▽ COLOPL Tech Blog
http://blog.colopl.dev

COLOPL Inc.

February 16, 2022
Tweet

More Decks by COLOPL Inc.

Other Decks in Technology

Transcript

  1. もくじ • Cloud Spanner と ? • Cloud Spanner 使うまで

    道(メイン) • 検証で発見したサプライズ紹介
  2. Cloud Spanner と ? Google Cloud が提供しているデータベースサービス 特徴 • SQL・DML・DDL

    が使える • 負荷に応じて自動でシャーディングしてくれるすごいやつ • フルマネージトサービス
  3. Spanner を使うまで 道 既存タイトルDB分割多すぎ(64分割)問題 • スケールイン・アウトが大変 • 技術的な設計にやたら時間がかかる ◦ 分散

    transaction が辛い(特に異常系 動作確認) ◦ primary / replica 切り替え ◦ replica 遅延考慮 • コードが荒れる
  4. Spanner を使うまで 道 検証フロー • laravel framework DBドライバーを書いてみる • 既存タイトル

    コードに入れてみる • 遊べるようになるまで粛々と直していく
  5. Spanner を使うまで 道 実際に運営してみた感想 • オペレーション楽! • 全然落ちない! • コードすっきり!

    • 今後 タイトル 全部 Spanner で良い で ? ◦ 実際これ以降 新規タイトルに使うことになる
  6. デフォルトパラメータが設定できない • アプリ側でモデル new した時にセットすることで対応 • ふーん🤔 まぁ問題なしかな ◦ と思ってたら・・・

    ◦ 必然的にカラム追加で not null が指定不可 i. nullable で作る → UPDATE で全レコードに値を入れる → not null にする で対応するしかない サプライズ
  7. テーブル作成が遅い • laravel が1テーブル毎にスキーマ作って送っていた ◦ 約100テーブル作る に30分以上かかっていた • gcloud spanner

    databases create 時に --ddl オプションをつけて まとめて処理させると30秒で終わった ◦ 作成時にしか使えない ◦ 開発中 migrate で なく全部リセットして対応 😢 サプライズ
  8. サプライズ Query Optimizer がスマートで ない • クエリーに FORCE_INDEX つけないと index

    使ってくれない • 最初 ツライと思ったけど・・・ • 明示的でむしろいいかもしれない? 🤔 最近 自動で使ってくれるようになってます(Optimizer v3)
  9. サプライズ 親子関係(interleave)をもってるテーブル場合、 子テーブルに親テーブル PKカラムを追加しないといけない CREATE TABLE User ( userId INT64

    NOT NULL, ) PRIMARY KEY (userId); CREATE TABLE UserItem ( userId INT64 NOT NULL, userItemId INT64 NOT NULL, ) PRIMARY KEY (userId, userItemId), INTERLEAVE IN PARENT User;
  10. サプライズ 親子関係(interleave)をもってるテーブル場合、 子テーブルに親テーブル PKカラムを追加しないといけない • つまり ◦ 親テーブルで ID という

    PK を作ると 子テーブルで ID という PK 作れない • な で基本 {table名}Id を PK にすることに • Rails、Laravel デフォルト ID な で違和感 • しゃーないで割り切る 🐌