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

スケーラビリティとコスト管理 Google Cloud Spanner 費用最適化の取り組み

gree_tech
October 13, 2023

スケーラビリティとコスト管理 Google Cloud Spanner 費用最適化の取り組み

GREE Tech Conference 2023で発表された資料です。
https://techcon.gree.jp/2023/session/TrackB-2

gree_tech

October 13, 2023
Tweet

More Decks by gree_tech

Other Decks in Technology

Transcript

  1. 自己紹介 結城 慎一郎 (ゆうき しんいちろう) 株式会社WFS / ゲーム開発部 / Server

    Engineering グループ シニアエンジニア 経歴 Webサービス会社から2013年グリー株式会社に入社。 Webゲーム開発を経て、スマホゲーム「消滅都市」のほか、複数の IPタイトルのゲームバックエンド開発を担 当。 2
  2. 発表内容 1. Cloud Spanner の概要とTCO 2. Cloud Spanner 費用について 3.

    コンピューティングノード費用 4. ストレージ費用 5. ストレージ容量の最適化 6. コンピューティング費用の最適化 7. まとめ 4
  3. Cloud Spanner の概要 • Google Cloud で提供されるリレーショナルデータベース • フルマネージド •

    ノード増減による高いスケーラビリティ • ノード分散と強整合性の両立 • SQLが使用可能 ◦ Google Standard SQL ◦ PostgreSQL • 非常に高い99.99%のSLA(Service Level Agreement) ◦ マルチリージョン構成なら 99.999% 6
  4. Cloud Spanner の概要 • Google Cloud Platform (GCP)で提供するリレーショナルデータベース • フルマネージド

    • ノード増減による高いスケーラビリティ • ノード分散と強整合性の両立 • SQLが使用可能 (GoogleSQL / PostgreSQL) • 非常に高いSLA (99.99%) ◦ マルチリージョン構成なら 99.999% 7
  5. 管理コストを大幅に削減 TCO (Total Cost of Ownership) で考えることが大事 10 Total Cost

    of Ownership 導入 検証 構築 移行 維持 費用 習得 メンテ 作業 障害 復旧 サポート セキュ リティ
  6. どこに費用がかかるのか? Cloud Spannerは処理を行う コンピュートノードと ストレージが分離しているため、 費用は3つに分かれます。 1. コンピューティングノード ◦ 処理ノード数

    2. ストレージ ◦ 使用ストレージ容量 3. ネットワーク ※ネットワーク費用は通信量によるため今回取り上げません。 19 instance node1 node2 node3 storage storage storage
  7. コンピューティングノード費用 23 ※2023年9月現在、146JPY/USDで算出 項目 単価 1ヶ月(30日) コンピューティングノード (1ノード/時) $1.17 $842.4

    ¥122,990 例) 東京・シングルリージョンで1ノード利用した場合 100処理ユニットの場合、上記の 1/10単位での計算になります。
  8. コンピューティングノード費用 確約利用割引(Committed use discounts / CUDs) Committed use discounts |

    Cloud Spanner • 確約値を設定することで割引になる ◦ オートスケール時に最小になる数値を設定するとよい ◦ 確約値の超過分についてはオンデマンド費用と同等 • 変更の可能性もあるので、詳しくは公式ドキュメントをご確認ください 24
  9. コンピューティングノード費用 CPU 使用率の目安 https://cloud.google.com/spanner/docs/launch-checklist?hl=ja#ensure_monitoring_is_in_place > シングルリージョン インスタンスでは 65% 未満 >

    マルチリージョン インスタンスでは 45% 未満に保つことをおすすめします。 パフォーマンスが劣化するので超えないようノード数を調整したほうがよい 25 ※開発環境の例です 25
  10. 項目 単価 1ヶ月 データベースストレージ (GB/月) $0.39 $399.36 ¥58,306 バックアップストレージ (GB/月)

    $0.10 $102.4 ¥14,950 ストレージ費用 31 ※2023年9月現在、146JPY/USDで算出 例) 東京・シングルリージョン、1TBを使用した場合
  11. ストレージの容量割当上限 実は昨日(2023/10/12(木)) 公式ブログで新たな発表がありました Cloud Spanner is now half the cost

    of Amazon DynamoDB, and with strong consistency and single-digit ms latency https://cloud.google.com/blog/products/databases/announcing-cloud-spanner-price-perform ance-updates/?hl=en • コンピュートで50%のスループット向上 • 1ノードごとに4TB→10TBの容量割当(上限) • 数ヶ月以内に全ユーザーに展開する見込み 本資料は2023/10/13発表時点での4TBを前提にしております。ご了承下さい。 33
  12. その1:セカンダリインデックスを見直す ユースケースを精査し、created_atの取得は不要だったため、除外した例 39 CREATE INDEX gifts_by_expiration ON gifts (user_id, expired_at)

    STORING (item_id, created_at); https://cloud.google.com/spanner/docs/reference/standard-sql/data-definition-language#alter-index ALTER INDEX gift_by_expiration DROP STORED COLUMN created_at;
  13. その3:TTLを設定する • バッチ処理を書かなくてもバックグラウンドで消してくれる • 仕様として保持期限を設けられる場合に非常に有効 • テーブル設計時に意識しておくことで消しやすくできる 43 CREATE TABLE

    gifts ( user_id STRING(36) NOT NULL, gift_id STRING(36) NOT NULL, item_id INT64 NOT NULL, expired_at TIMESTAMP NOT NULL ) PRIMARY KEY (user_id, gift_id), ROW DELETION POLICY (OLDER_THAN(expired_at, INTERVAL 7 DAY)); 例) expired_atカラムの日時が7日間を経過したら削除される giftsテーブル
  14. その3:TTLを設定する 例) gifts テーブルの例 44 user_id gift_id item_id expired_at 7b9952c0-7a98-4c4b-b

    033-036a05938dec 55711ba2-0723-4292-b cf1-5182bcd8ac8f 101 2023-10-10T07:12:34.567890Z ROW DELETION POLICY (OLDER_THAN(expired_at, INTERVAL 7 DAY)); このときはexpired_atの7日後以降、つまり 2023-10-17T07:12:34.567890Z 以降に削除されます。
  15. その3:TTLを設定する • 毎日バックグラウンドプロセスが起動しTTL対象レコードを削除する ◦ 優先度は「低」で実行される • 期限を過すぎれば即座に消えるわけではない ◦ したがって「有効かどうか」は別途ロジックで保証する必要がある •

    ミューテーション上限を超える量を削除する場合は小分けしてリトライ • 詳しくはこちらの公式ブログを参照ください。 ◦ https://cloud.google.com/blog/products/spanner/reduce-costs-and-simplify-compl iance-with-managed-ttl-in-spanner 45
  16. 1. 該当ユーザーの対象データを取得 (SELECT) 2. JSON化してGCSへアップロード 3. 直後に念のためGCSからダウンロードして内容に問題ないか検証 4. 「退避済み」としてマークし基礎テーブル更新 5.

    該当ユーザーの基礎テーブル以外の全データを削除 (DELETE) 実際にデータ退避したときの話 49 JSONアップロード JSONダウンロード
  17. 1. 該当ユーザーの対象データを取得 (SELECT) 2. JSON化してGCSへアップロード 3. 直後に念のためGCSからダウンロードして内容に問題ないか検証 4. 「退避済み」としてマークし記録テーブル更新 5.

    該当ユーザーの記録テーブル以外の全データを削除 (DELETE) 実際にデータ退避したときの話 50 JSONアップロード JSONダウンロード 「退避状態」 全データ削除
  18. オートスケーラー 弊社では「上げ下げくん」というツールを使って管理しています Cloud Spanner をより便利にする運用支援ツールの紹介 / GREE Tech Conference 2021

    • CPU使用率に上下範囲の閾値を設け、超えた場合に閾値に収まるよう増減 • イベントの開始時など指定スケジュールに合わせて予めノード数を増減 • ログインボーナスなどデイリーで想定される負荷に予めノード数を設定 • SpreadSheetで管理 54
  19. オートスケーラー Autoscaler tool for Cloud Spanner (公式) https://cloud.google.com/spanner/docs/autoscaling-overview?hl=ja • Cloud

    Functions や GKE 上で動く想定 • Monitoring API を監視(Polling) して台数増減。 Spanner Autoscaler (メルペイ様) https://github.com/mercari/spanner-autoscaler • Kubernetes Operator として Kubernetes上に構築される • 同様に負荷に応じてノード数を増減。 • スケジュール設定も可 55
  20. 58