【入門編】 バックアップにおけるスナップショット分離 – Cloud Spanner

こんにちは!Cloud Spannerの世界へようこそ。私はこれまで数多くの巨大なシステムを設計してきましたが、その中でもCloud Spannerは「宇宙で最も美しいデータベースの一つ」だと確信しています。

今日は、Spannerの魔法の根幹にある「バックアップと時間の不思議な関係」についてお話ししましょう。

「バックアップを取っている間は、データの更新を止めてください」
昔のデータベースでは、そんなことが当たり前でした。でも、世界中で24時間365日動くサービスでは、一秒たりとも止まることは許されません。

Spannerはどうやって、猛スピードで更新され続けるデータの中から「ある一瞬の完璧な姿」を切り取っているのか。その秘密を、日常の例えを交えて紐解いていきましょう。ここを理解すれば、あなたもSpannerマスターへの第一歩を確実に踏み出せますよ。

—

1. 「一瞬を切り取る」ことの難しさ

想像してみてください。世界中に数千人のダンサーがいて、全員で一つの壮大なダンスを踊っているシーンを。

あなたは、その「完璧な一瞬」を写真に収めたいと思っています。しかし、カメラマン(バックアップ担当)がシャッターを切る瞬間、あるダンサーはまだ動いている最中かもしれませんし、別の場所では少し遅れてポーズを決めているかもしれません。

データベースでも同じことが起こります。
「Aさんの銀行口座から1,000円引き落として、Bさんの口座に1,000円入れる」という処理の途中でバックアップを取ってしまうと、「Aさんの金は減ったが、Bさんの金はまだ増えていない」という、あってはならない瞬間が記録されてしまう可能性があるのです。

これを防ぐのが「スナップショット分離」という技術です。

2. Spannerの魔法のカメラ:スナップショット分離

Spannerのスナップショット分離は、まるで「時間が止まったパラレルワールド」を作るようなものです。

バックアップが始まると、Spannerはこう宣言します。
「今から『10時00分00秒』時点のデータをバックアップするよ。それ以降に届いた更新は、バックアップ用の世界には入れないでね」

こうすることで、現実にどんどん新しいデータが書き込まれていても、バックアップ処理は「10時ちょうど」の静かな世界を見続けることができるのです。

3. 世界中の時計を合わせる「TrueTime」

ここで一つ、大きな問題が出てきます。「10時ちょうど」って、誰の時計で決めるのでしょうか?

アメリカのサーバーの時計と、日本のサーバーの時計が1秒でもズレていたら、さっきの「完璧な一瞬」は崩れてしまいます。分散システムにおいて、世界中の時計を完璧に合わせることは、実は至難の業なのです。

そこでSpannerが使っているのが、Googleが誇る究極の技術「TrueTime」です。

  • GPS時計と原子時計: Googleのデータセンターには、専用の原子時計とGPSが備わっています。
  • 誤差の受け入れ: 「今の時間は10時00分00秒です」と断定するのではなく、「今は10時00分00秒から10時00分00秒0.5の間です」という風に、「時間の幅(不確実性)」を考慮して動きます。

Spannerは、この極めて正確な「共通の時計」を使うことで、世界中のどこで動いているデータに対しても「はい、ここが共通の10時ちょうどだよ」という印をつけることができるのです。

4. 実際にどうやって「過去」を見るのか

エンジニアの皆さんがSpannerを使うとき、この複雑な仕組みを意識する必要はほとんどありません。Spannerが裏側で全てやってくれるからです。

例えば、バックアップ以外でも「10分前のデータが見たいな」と思ったら、コードでこう指定するだけです。

from google.cloud import spanner
import datetime

Spannerのクライアント設定
instance_id = ‘my-instance’
database_id = ‘my-database’
client = spanner.Client()
instance = client.instance(instance_id)
database = instance.database(database_id)

「10分前」の時間を計算
ten_minutes_ago = datetime.datetime.utcnow() – datetime.timedelta(minutes=10)

スナップショット(読み取り専用の取引)を開始
ここで「exact_staleness」や「read_timestamp」を指定するのがポイント!
with database.snapshot(read_timestamp=ten_minutes_ago) as snapshot:
# 10分前の時点のデータを検索
results = snapshot.execute_sql(
“SELECT UserId, Balance FROM Accounts WHERE UserId = ‘User_A'”
)

for row in results:
print(f”10分前の Aさんの残高は {row[1]} 円でした。”)

この間、他の人がどれだけ送金していても、この処理で見えるのは「10分前」の姿だけです。

バックアップ機能も、これと同じ原理を使っています。
「バックアップ開始時点」のタイムスタンプを固定して、その瞬間のデータを世界中から集めてくる。だから、サービスを一切止めることなく、整合性のとれた(データが矛盾していない)バックアップが取れるのです。

ここをクリアすれば、Spannerはバッチリ!

Spannerのバックアップとスナップショットの仕組みについて、イメージが湧きましたか?

大事なポイントは3つだけです。
1. 止まらなくていい: 更新中も、バックアップは裏でひっそり、完璧に行われる。
2. スナップショット: 「ある一瞬」のデータの姿を、写真のように固定して読み取る。
3. TrueTime: 世界中の時計を原子時計で合わせているから、地球規模で「一瞬」を定義できる。

この「時間」を操る感覚こそが、Cloud Spannerを扱う醍醐味です。一見難しそうに見えますが、Spannerは常に「正しい時間」を味方につけて、あなたのデータを守ってくれます。

次はぜひ、実際にバックアップを作成して、その手軽さを体感してみてください。あなたが作ったシステムが、世界規模で、止まることなく動き続ける未来を楽しみにしています!

コメント

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