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

分散DBって何者なんだ... Spannerから学ぶRDBとの違い

Avatar for kensho kensho
November 18, 2025

分散DBって何者なんだ... Spannerから学ぶRDBとの違い

Avatar for kensho

kensho

November 18, 2025
Tweet

More Decks by kensho

Other Decks in Programming

Transcript

  1. • はじめに • 普通のRDBMS • 分散DB(NoSQL ) • 余談 •

    Cloud Spanner ◦ メリット ◦ デメリット • まとめ アジェンダ
  2. • はじめに • 普通のRDBMS • 分散DB(NoSQL ) • 余談 •

    Cloud Spanner ◦ メリット ◦ デメリット • まとめ アジェンダ
  3. スケーリング • 垂直スケーリング ◦ すぐできるが、サーバースペックの上限がある ◦ ダウンタイムとメンテナンス時間が… • 水平スケーリング ◦

    リードレプリカ ▪ そもそも書き込みがボトルネックであれば対処できない ▪ Writer一台だと将来的には限界が来るかも ◦ シャーディング ▪ アプリで実装、むずかしい ▪ データベースで統一の整合性を捨てる覚悟 RDBMS が苦手なこと
  4. • はじめに • 普通のRDBMS • 分散DB(NoSQL ) • 余談 •

    Cloud Spanner ◦ メリット ◦ デメリット • まとめ アジェンダ
  5. • 水平スケール ◦ テーブルを自動パーティショニングして、書き込み読み込みを複 数のノードへ分散 ◦ エンジニアを、スケールアウトの難問から解放 • 地理分散の容易さ ◦

    RDBMSでは難しかったマルチリージョン対策もお手の物 ◦ リージョン単位の障害にも対応 ◦ コンソールでポチッとするだけ • スキーマが柔軟 ◦ DDL更新時のLockなどが発生しない 分散DB(NoSQL の良さ)
  6. • 整合性が取りづらい ◦ CHECK制約などがなし ◦ 更新順序を守るために、強い整合性読み取り をすると追加課金が必要 • トランザクションに制限あり ◦

    DynamoDB: トランザクションはあるが制限あり(最大25項目/合計4MB) ◦ Bigtableは複数行に渡るTxなし • 初期設計が命 ◦ あらかじめ定めたパーティションキーやセカンダリインデックス前提の検索 ▪ アドホックなクエリがやりたいときに辛い ◦ スキーマレスはメリットであり、デメリットにもなる 分散DB(NoSQL のつらみ)
  7. • 整合性 ◦ データを不整合から守る責務は、DBに任せたい ◦ 中途半端なデータを弾く(FK, UNIQUE, CHECK) ◦ Commitされていない変更はちゃんと消す

    ◦ Commitされた最新のデータを読み込める • 柔軟な検索インターフェース ◦ データは書き物ではなく、読み物 ◦ アドホックな検索にも対応できると、障害対応時や分析が楽になる • 拡張性 ◦ サーバーの限界を超えることができる、水平スケーリングが容易であると、 ソフトウェアエンジニアが考慮すべき事項が一気に減る (個人的)データベースの重要ポイント
  8. 整合性 検索柔軟性 スケーリング RDBMS ◎ ◯ みんな大好きSQL。 JOINをやりすぎるとひ どく遅くなるけど、大体 は対応できる。

    △ 自前でシャーディングす るの難しい。 シャーディングしてノー ドを分けたら、DBで統 一の整合性が犠牲にな る。 NoSQL △ 強い整合性読み取り (DynamoDB)などもあ るけど、お金かかるし制 限ある。 △ アクセスパターンを先出 しした初期設計が必要。 複雑な検索をやりた かったらDWHへ。 ◎ RDBMS vs 分散DB(NoSQL )
  9. • はじめに • 普通のRDBMS • 分散DB(NoSQL ) • 余談 •

    Cloud Spanner ◦ メリット ◦ デメリット • まとめ アジェンダ
  10. CAP定理 CA CP AP サービス例 単一ノードのRDBMS 複数ノードのAuroraや RDS DynamoDB 解説

    分断の概念がないた め、常に一貫性を提 供できる。 分散システムでは、 CAのサービスは原理 的に存在しない。 可用性を犠牲にして、 一貫性を体に入れる。 ネットワーク分断時に は、フェイルオーバー が走って、可用性が損 なわれる可能性があ る。 一貫性を犠牲にして、 可用性を手に入れる。 ネットワーク分断時に は、それぞれのノード に書き、読みが発生。 古いデータを返す可 能性がある。 最終的には、一貫性 を保とうとする。
  11. • はじめに • 普通のRDBMS • 分散DB(NoSQL ) • 余談 •

    Cloud Spanner ◦ メリット ◦ デメリット • まとめ アジェンダ
  12. TrueTime APIは、 “誤差つきの時刻”を返す分散時計API(Googleの社内インフラ)。 実現にGPS受信機や原子時計を使っていることで話題。 TT.now() → [earliest, latest] 現在時刻は、earliestとlatestのどこかであることを明示する。 例:TT.now()

    = [10:00:00.496, 10:00:00.504] 順序判定用ヘルパ TT.after(t):今が確実に t を過ぎたなら true(≒ earliest > t)。 TT.before(t):今が確実に t より前なら true(≒ latest < t)。 True Time
  13. TrueTime APIは、 “誤差つきの時刻”を返す分散時計API(Googleの社内インフラ)。 実現にGPS受信機や原子時計を使っていることで話題。 TT.now() → [earliest, latest] 現在時刻は、earliestとlatestのどこかであることを明示する。 例:TT.now()

    = [10:00:00.496, 10:00:00.504] 順序判定用ヘルパ TT.after(t):今が確実に t を過ぎたなら true(≒ earliest > t)。 TT.before(t):今が確実に t より前なら true(≒ latest < t)。 True Time “いまが確実にある時刻を越えた /まだ来てない ”を分散環境で判定できる
  14. Commit Wait = “時刻 s が世界的に過去になった”ことの確認待ち。 • TT.now() → [earliest,

    latest] ◦ **今の“誤差つき時刻区間”**を返す(今はこの範囲のどこか)。 • s = max(now_latest, latest_time_stamp +δ) ◦ TT.now().latest…“未来から抜かれない”ための安全下限 ◦ last_commit_ts + δ…単調増加(前回より必ず新しい)を保証 ▪ 大きい方を s に採用。 • TT.after(s) ◦ 「今が確実に s を過ぎた」判定(≒ TT.now().earliest > s)。 Commit Wait
  15. Commit Wait = “時刻 s が世界的に過去になった”ことの確認待ち。 • TT.now() → [earliest,

    latest] ◦ **今の“誤差つき時刻区間”**を返す(今はこの範囲のどこか)。 • s = max(now_latest, latest_time_stamp +δ) ◦ TT.now().latest…“未来から抜かれない”ための安全下限 ◦ last_commit_ts + δ…単調増加(前回より必ず新しい)を保証 ▪ 大きい方を s に採用。 • TT.after(s) ◦ 「今が確実に s を過ぎた」判定(≒ TT.now().earliest > s)。 Commit Wait timestampの時刻が確実に過去になってから更新をかけることで、 それよりあとの Txは原理的にそれ以降の時刻で読み書きすることになる。
  16. Spanner Data Boost + BigQuery View + External Query で

    簡単に分析を環境構築できる Spanner Data Boost は、Spannerインスタンスとは別の独立したコンピューティングリソー ス。 アプリケーションのワークロードに影響を与えることなく、 Spannerのストレージに対してクエリ を発行することができるマネージドサービス。 BigQueryでは、外部接続という概念でSpannerとの連携ができる。 その際、コンピュートとしてインスタンスではなく、 Data Boostを選択できる。 魅惑のSpanner - BQ との超簡単連携
  17. ただし都度External Queryを書くのは大変。 なので、あらかじめBQのViewとしてExternal Queryのクエリ文を保存する。 もともとのテーブル名と同じ名前のViewを作っ ておくと、 SELECT * FROM `datasetname.tests

    `; のようなクエリをかける。 外部接続(Data Boost)+ External Queryを 使った状態でも、非常にシンプルにクエリを発 行できる。 魅惑のSpanner - BQ との超簡単連携
  18. そんなあなたに Granular Instance Sizing + Spanner CUD Granular Instance Sizing

    は、Spannerのノード「処理ユニット」単位で 分割して使用できる仕組み。1ノード1000PU。 最小単位は100PUなので0.1ノードの値段で使用できる。 Spanner CUD はリザーブドインスタンスのようなもの。 使用の確約をすると割引がされる。 1年確約で20%引き。3年確約で40%引き。 意外と安い? Spanner
  19. 0.1ノード(100PU)で3年確約のCUDを契約する ミニマムの構成であれば、 $854 * 0.1 * 0.6 = $51(約8000円) +

    ストレージ使用量 意外と安い? Spanner 思ったよりも安いのでは?
  20. • はじめに • 普通のRDBMS • 分散DB(NoSQL ) • 余談 •

    Cloud Spanner ◦ メリット ◦ デメリット • まとめ アジェンダ
  21. • はじめに • 普通のRDBMS • 分散DB(NoSQL ) • 余談 •

    Cloud Spanner ◦ メリット ◦ デメリット • まとめ アジェンダ
  22. • RDBは整合性、一貫性に重きを置いたデータベース • NoSQLは、可用性、拡張性が非常に高いデータベース • Spannerは多機能ですごい ◦ 尺の都合で割愛したが、Spannerには無停止垂直スケーリングや INTERLEAVEな どの他の特徴もある

    ◦ そして最小構成なら意外とお安い • Spannerを始めとしたNewSQLは、RDBとNoSQLの良いところを掛け合わせたような データベース ◦ TiDBやAlloyDB、CockroachDBもNewSQL • 最初からある程度の規模になることが見込まれて、簡単なスケーリングの仕組みが欲し いプロダクトなら、導入しても良いのでは? まとめ
  23. • Google「Cloud Spanner と CAP 定理」 (https://cloud.google.com/blog/ja/products/gcp/inside-cloud-spanner-and-the-cap-theore m) • Google

    「Data Boost の概要」 (https://docs.cloud.google.com/spanner/docs/databoost/databoost-overview?hl=ja) • Google「Spanner の仕組み: 厳格な直列化可能性と外部整合性について理解する」 (https://cloud.google.com/blog/ja/products/databases/strict-serializability-and-external-co nsistency-in-spanner) • Google「Spanner の料金」(https://cloud.google.com/spanner/pricing?hl=ja) • Google 「Spanner: TrueTime と外部整合性」 (https://docs.cloud.google.com/spanner/docs/true-time-external-consistency?hl=ja) • IBM「CAP定理とは何ですか?」(https://www.ibm.com/jp-ja/think/topics/cap-theorem) • @kumagi 「Spanner」(https://qiita.com/kumagi/items/7dbb0e2a76484f6c522b) • Yasui Michitaka「フツーのデータベースとしての Spannerを使うには」 (https://zenn.dev/google_cloud_jp/articles/2f85d7dcd0ced7) 参考文献