【入門編】 スナップショット分離の実装 – Cloud Spanner

こんにちは!クラウドの世界へようこそ。
世界中の巨大なシステムを支える「Cloud Spanner(クラウド スパナ)」について、今日は一緒に探検していきましょう。

データベースの世界で一番頭を悩ませる問題、それは「みんなが一斉にデータを書き換えているときに、古いデータを正確に読みたい」という矛盾です。

「難しそう……」と思いましたか?
大丈夫。ここをクリアすれば、Cloud Spannerのすごさと基本はバッチリマスターできますよ!
今日は、日常生活の例えを交えながら、Spannerの心臓部である「タイムスタンプによる読み取り一貫性(スナップショット分離)」の秘密を、一緒に解き明かしていきましょう。

—

1. なぜ「過去を読む」のがそんなに難しいのか?

まずは、想像してみてください。
あなたは人気のラーメン店の店長です。お店には、東京、大阪、福岡の3つの支店があり、メニューの値段や在庫の数はすべて同じシステム(データベース)で管理されています。

ある日、こんな状況が起きました。

  • Aさん(お客さん):「今日のスープの在庫はいくつあるかな?」とアプリで確認しようとした。
  • Bさん(スタッフ):「スープが新しく100杯分追加されたよ!」とリアルタイムでシステムを更新した。

もし、Aさんがデータを読んでいるまさにその瞬間に、Bさんがデータを書き換えてしまったらどうなるでしょう?
「在庫は50杯です」と表示された直後に「いや、150杯になりました」と数字がガチャガチャ変わってしまったら、お客さんは混乱してしまいますよね。

通常のデータベースでは、これを防ぐために「書き終わるまで誰も読んじゃダメ!(ロック)」や、「読んでる間は誰も書いちゃダメ!」という交通整理(排他制御)を行います。

しかし、世界中に何台ものサーバーがある巨大なシステムでこれをやると、大渋滞が起きてしまい、アプリの動きがカクカクになってしまいます。

2. Cloud Spannerの魔法:『過去の写真』を撮る

ここで登場するのが、Cloud Spannerの「スナップショット分離(Snapshot Isolation)」という技術です。

Spannerは、この交通渋滞をどうやって解決しているのでしょうか?
例えるなら、「一瞬でその瞬間の世界全体を写真(スナップショット)に収める魔法のカメラ」を使っているのです。

Spannerの頭の中では、すべてのデータ変更に「正確なタイムスタンプ(写真の撮影時刻)」が刻まれます。

1. Aさんが「在庫を教えて」とアクセスした瞬間:
Spannerは、「では、【2023年10月1日 12:00:00】時点のデータの世界を切り取った写真をあなたに見せますね」と、過去の完璧な状態をそっと差し出します。
2. Bさんがデータを書き換えている最中でも:
Aさんは、その裏でBさんがどう書き換えていようが関係なく、手元の「12:00:00時点の写真」を見ているだけなので、邪魔されることも、邪魔することもなく、穏やかに正確なデータを読み取ることができます。

これが、「ロックなしで読み取れる(ノンブロッキング・リード)」の正体です。誰の邪魔もしないし、誰にも邪魔されない。だから世界中で使っても絶対に遅くならないのです。

—

3. その魔法を支える裏の立役者:「TrueTime(トゥルータイム)」

「でも、世界中のサーバーで『同じ正確な時間』を合わせるなんて、時計のズレがあるから無理なんじゃないの?」

鋭いですね!その通り、普通のパソコンの時計は、どうしても少しずつズレてしまいます。東京のサーバーとニューヨークのサーバーで時間がコンマ数秒でもズレていたら、「どの写真が本当の過去か」分からなくなって大混乱です。

そこでGoogleが開発した秘密兵器が「TrueTime」です。

TrueTimeは、GPS衛星と原子時計を組み合わせることで、「絶対にズレない時間」ではなく、「ズレの幅(誤差の範囲)を極限まで小さく(数ミリ秒以下に)抑えた時間」を世界中に提供します。

Spannerは、このTrueTimeの仕組みがあるおかげで、地球の裏と表であっても、「データの記録された正しい順番」を完璧に理解できるのです。

—

4. 実務でどう使うの?コードで見てみよう

言葉だけだと抽象的かもしれないので、実際にCloud Spannerで「過去の特定の時点(スナップショット)」のデータを読み出すコードのイメージを見てみましょう。

Cloud Spannerでは、SQLを実行するときに「この時間のデータを読みたい」と指定することができます。

— 【実行例】過去の特定のタイムスタンプを指定してデータを読み取るSQL
— (※概念的なイメージコードです)

— 1. まず、データを書き込む(現在の時刻で記録される)
INSERT INTO Users (UserId, UserName) VALUES (1, ‘Alice’);

— 2. 数分後、事故や確認のために「過去の特定の瞬間」のデータをロックなしで覗き見る
— TrueTimeの保証があるため、「あの瞬間のデータは絶対こうだった」と言い切れる状態で取得できます。
SELECT
FROM Users
FOR SYSTEM_TIME AS OF TIMESTAMP ‘2023-10-01T10:00:00Z’;

このコードの何がすごいの?

通常のデータベースで「昨日時点のデータを見せて」とやろうとすると、過去のログをゴソゴソと探し出して、大掛かりな復元作業が必要になりがちです。

しかしCloud Spannerなら、TrueTimeとスナップショット分離の仕組みにより、過去のどの瞬間を指定しても、一瞬で、しかも今のシステムを止める(ロックする)ことなく、安全にデータを引っ張り出すことができます。
これは、バグの調査や、過去のデータに基づいた集計を行う際に、エンジニアにとって最高に心強い機能となります。

—

まとめ:今日の学びを振り返ろう!

  • スナップショット分離とは、データの「過去の写真」を切り取ることで、書き込みの邪魔をされずに安全にデータを読む仕組みのこと。
  • ロックをしないため、どれだけアクセスが多くてもシステムが渋滞しない(高いパフォーマンス)。
  • それを世界規模のサーバー間で完璧に成立させているのが、GPSと原子時計を使ったTrueTimeという神業。

「過去の状態を綺麗に切り取って、誰にも迷惑をかけずに読ませる」。この美しい仕組みがあるからこそ、Cloud Spannerは止まらない巨大システムを支え続けることができるのです。

ここをマスターできれば、Spannerの分散データベースとしての美しさがグッと見えてきたはずです。
次のステップも、この調子で楽しくクリアしていきましょう!

コメント

タイトルとURLをコピーしました