【入門編】 ポイントインタイムリカバリ (PITR) の内部構造 – Cloud Spanner

こんにちは!Cloud Spannerの世界へようこそ。
チーフアーキテクトの私です。

「Cloud Spannerって、なんだかすごそうだけど、大規模すぎて自分にはまだ早いかな…」なんて思っていませんか?大丈夫、安心してください。今日ここでお話しするポイントをしっかり押さえれば、Cloud Spannerの本質はバッチリマスターできますよ。

今回は、数ある強力な機能の中でも、私たちが日々安心して開発や運用を行うために絶対に欠かせない「ポイントインタイムリカバリ(PITR:ピーアイティーアール)」の裏側の仕組みについて、優しく紐解いていきましょう。

専門用語のジャングルに迷い込まないよう、身近な例えを交えながら、その感動的なまでの美しさを解説していきますね。

—

1. 「タイムマシン」のような復元機能、それがPITR

まずはイメージから入りましょう。
もしあなたが、うっかり大切なデータを消してしまったり、バグを含んだプログラムが動いてデータベースをめちゃくちゃにしてしまったとき……想像しただけで冷や汗が出ますよね。

普通のデータベースだと、昨日の夜のバックアップからデータを復元するしかありません。そうすると、「今日の昼から夕方までに頑張って登録したデータ」がすべて消えてしまいます。悲惨です。

ここで登場するのが、Cloud Spannerの PITR(Point-in-Time Recovery) です。
これは、いわば「データベース専用のタイムマシン」です。

  • 「昨日の14時15分00秒の状態に戻して!」
  • 「あのデータが消える直前の、1秒前の世界を見せて!」

これが、秒単位で指定して完璧に復元できるのです。一体、Cloud Spannerの内部では何が起きているのでしょうか?

—

2. 日常の例え:すべてのページに「修正履歴」が残る魔法のノート

Cloud SpannerのPITRの仕組みを、会社にある「魔法の業務ノート」に例えてみましょう。

普通のノートだと、消しゴムで消して上書きしたり、修正液を塗ったりしますよね。これだと、後から「昨日の朝はなんて書いてあったっけ?」と振り返るのは至難の業です。

しかし、Cloud Spannerが使っているノートは違います。

1. 上書きを絶対にしない
データを書き換えるとき、古い文字を消すのではなく、「新しいページに、新しい内容を書き足す」というルールになっています。
2. すべての行に「タイムスタンプ(時間)」が刻まれている
書き込まれたすべてのデータには、「いつ書かれたか」という厳密な時間がこっそり記録されています。

そのため、このノートをパラパラと過去のページにめくっていけば、「ある特定の時間、そのページに何が書いてあったか」を寸分狂わず再現できるのです。

これが、Cloud Spannerが「バージョン管理されたデータストア」と呼ばれる所以です。データを更新しても、過去のバージョンのデータが裏側でそっと(しかし確実に)保存されているからこそ、タイムスリップが可能になります。

—

3. 裏側でどう動いているのか?(少しだけアーキテクチャの話)

「でも、過去のデータをずっと取っておいたら、ノートの紙(ストレージ)がすぐパンクしちゃうんじゃないの?」

鋭いですね!その通り、無限に古いデータを置いておいたらディスクがいくらあっても足りません。
そこでCloud Spannerでは、「保持期間(最大で過去7日間など)」というルールを設けています。

  • ログの保持とバージョン追跡

裏側のストレージ層では、データが変更されるたびに、古いバージョンのデータに「有効期限」のラベルを貼って管理しています。

  • 自動お掃除機能(ガベージコレクション)

例えば「過去7日間のPITR」を設定している場合、7日を超えた古いバージョンのデータは、自動的に綺麗にお掃除(削除)されます。これにより、ディスク容量が無限に膨れ上がるのを防ぎつつ、直近1週間以内であれば「どのミリ秒の瞬間」にもタイムトラベルできる状態を保っているのです。

この「過去のデータを保持する仕組み」と「古いデータを賢く片付ける仕組み」の絶妙なバランスこそが、Cloud Spannerの分散アーキテクチャの真骨頂です。

—

4. 実際にどう使うの?(イメージコード)

難しい理屈はこれくらいにして、実際に私たちがどのようにこのタイムマシン機能を使うのか、簡単なイメージを見てみましょう。

Cloud Spannerでは、SQLを書くときに「この時間のデータを見せてね」と指定するだけで、過去のデータを覗くことができます(これを「Stale Read(古くなったデータの読み取り)」と呼びます)。

— 【例】昨日の「2023年10月1日 12:00:00 (UTC)」時点のユーザーテーブルを覗き見る
SELECT
FROM Users
— 魔法の呪文:このタイムスタンプ時点の世界を見る
FOR SYSTEM_TIME AS OF TIMESTAMP ‘2023-10-01 12:00:00Z’
WHERE user_id = ‘12345’;

【コードのポイント解説】

  • `FOR SYSTEM_TIME AS OF TIMESTAMP …` という部分が、タイムマシンの行先を指定する呪文です。
  • このクエリを投げると、Cloud Spannerは裏側の「魔法のノート」をめくり、指定した瞬間に存在していたデータをピンポイントで返してくれます。
  • データが誤って書き換えられてしまっていても、この機能を使って正しい状態のデータを救出し、現在のテーブルに書き戻す(復元する)ことが簡単にできるのです。

—

5. 先輩エンジニアからのメッセージ

ここまで、Cloud SpannerのPITRの仕組みについてお話ししてきましたが、いかがでしたでしょうか?

  • 古いデータを消さずに、タイムスタンプ付きで裏側に保存している
  • だから、過去のどの瞬間にもタイムスリップしてデータを復元できる
  • でも、一定期間を過ぎた古いデータは自動でお掃除されるので容量も安心

要するに、こういうことなんです。「仕組みの本質を知れば、恐れるものは何もない」というのは、エンジニアリングの大きな醍醐味の一つです。

ここをしっかりと理解できたあなたなら、もうCloud Spannerの運用に対して必要以上の不安を感じることはないはずです。いざという時のセーフティネットがあるという安心感を胸に、ぜひダイナミックで攻めたシステム開発に挑戦してくださいね。

それでは、次回のアーキテクチャ談義でお会いしましょう!

コメント

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