【入門編】 分散トランザクションプロトコル – Cloud Spanner

こんにちは!クラウドの世界へようこそ。
今日は、Googleが誇る最強のデータベース「Cloud Spanner(クラウド・スパナー)」の心臓部について、お話ししていきますね。

「Cloud Spannerって名前は聞くけれど、裏側でどうやってデータを安全にやり取りしているんだろう?」
「分散データベースって難しそう……」

そんな風に思っていませんか?大丈夫。今日は専門用語をできるだけ使わず、私たちの日常の「あるシーン」に置き換えて、そのスゴさと仕組みを優しく解き明かしていきます。

ここをクリアすれば、Cloud Spannerの基本はバッチリマスターできますよ!ぜひ最後までお付き合いください。

—

1. なぜSpannerの仕組みを知る必要があるの?

私たちが普段使っているスマホアプリやWebサービスは、裏側でたくさんのサーバーがチームを組んで動いています。もし世界中のユーザーが一斉にアクセスしてきたら、1台のコンピューターではパンクしてしまいますよね。

だからデータを世界中に分散して保存するのですが、ここで大きな問題が発生します。
「遠く離れたサーバー同士で、どうやって正確に足並みを揃えてデータを書き換えるの?」 という問題です。

例えば、東京とニューヨークの店舗間で同時に在庫を移動させるとき、「あっちでは成功したけど、こっちでは失敗した」なんてことが起きたら大変ですよね。

Cloud Spannerは、この「世界規模での足並み合わせ」を驚異的な精度でやり遂げます。その秘密が、「Paxos(パクソス)」と「2相コミット(2PC)」という2つの強力な仕組みのコンビネーションなんです。

—

2. 日常で例えてみよう:世界をまたにかける「サプライズ計画」

この複雑な仕組みを、すごく簡単な例えで考えてみましょう。

あなたは、東京、ロンドン、ニューヨークに住む親友3人(A君、B君、C君)を驚かせるため、全員で同時に「一斉にプレゼントの箱を開ける」というサプライズ計画を立てたとします。

  • 条件1: 全員が「せーの」のタイミングで同時に開けないと、サプライズが台無しになる。
  • 条件2: 誰か1人でも「やっぱり無理!」と言ったら、全員が計画を白紙に戻さなければならない。

この計画を成功させるために、あなた(コーディネーター役)と3人(参加者役)は、どうやってコミュニケーションを取るでしょうか?

これがそのまま、Cloud Spannerが内部で行っている分散トランザクションの動きそのものです。

—

3. スパナーの頭脳:「Paxos」という名の信頼できるメッセンジャー

まず、東京・ロンドン・ニューヨークのそれぞれの拠点には、データが「コピー(複製)」されて安全に置かれています。もし東京のサーバーが火事で燃えても、別の場所にあるコピーが生きていればサービスは止まりません。

この「複数あるコピーの間で、どれが正しいデータかを決めるルール」が Paxos(パクソス) です。

  • 日常の例え:

A君のチームの中で、「今日のお昼はラーメンにするか、カレーにするか」を決めるとき、みんなで話し合って多数決を取り、リーダーが決定を下しますよね。途中でリーダーが倒れても、別のメンバーがすぐに引き継ぎます。

Cloud Spannerは、データのグループ(スプリットと呼びます)ごとにこのPaxosグループを作り、地球の裏側同士であっても「今のデータの状態はこれだ!」という合意を、超高速で取っているのです。

—

4. 本番の儀式:「2相コミット(2PC)」で絶対にミスを防ぐ

データの置き場所(Paxosグループ)が決まったら、いよいよ本番です。複数の場所にまたがるデータを同時に書き換えるとき、Spannerは 2相コミット(Two-Phase Commit / 2PC) というプロトコルを使います。

名前は難しそうですが、要するに「2段階の確認ステップ」を踏むだけです。結婚式の誓いの言葉をイメージしてください。

第1段階:準備フェーズ(みんなの意思確認)

  • コーディネーター(司令塔): 「みんな、これからデータを『A』から『B』に書き換えるよ。準備はいいかい?」
  • 参加者(各サーバー): 「よし、ディスクの空きも確認できた!いつでもいけるよ(=Yes)」または「ごめん、今ちょっと忙しくて無理!(=No)」

ここで、参加者全員が「Yes」と答えないと、次のステップには進みません。1人でも「No」と言えば、全員が作業を中止して元に戻します。これでデータのズレを完全に防ぎます。

第2段階:実行フェーズ(一斉のせーの!)

  • コーディネーター: 「全員OKだね!それじゃあ、今だ、一斉に書き換えて!」
  • 参加者: 「了解!書き換えたよ!」

この2つのステップを踏むことで、地球規模で離れたサーバー同士であっても、「全員が同時に書き換えた」ということが保証されるのです。これが、Spannerが銀行のシステムなどでも信頼される理由です。

—

5. 実際のコードイメージで見てみよう

Cloud Spannerを操作するとき、私たちはこのような複雑な2PCやPaxosの存在を、実は意識する必要がありません。Spannerが魔法のように裏側で全部やってくれるからです。

例えば、次のようなトランザクション(一連の処理)コードを書くだけです。

PythonでCloud Spannerのトランザクションを実行するイメージ
def update_balances(transaction, account_a, account_b, amount):
# 口座Aから残高を引く
current_a = transaction.read_row(“Accounts”, key=account_a, columns=[“Balance”])
new_a = current_a – amount
transaction.update(“Accounts”, {“AccountId”: account_a, “Balance”: new_a})

# 口座Bに残高を足す
current_b = transaction.read_row(“Accounts”, key=account_b, columns=[“Balance”])
new_b = current_b + amount
transaction.update(“Accounts”, {“AccountId”: account_b, “Balance”: new_b})

Spannerにトランザクション(2PCの管理含む)をおまかせで実行!
database.run_in_transaction(update_balances, “account-001”, “account-002”, 100)

> ここがプロの視点:
> 開発者はただ「トランザクションの中でデータを安全に更新してね」とSpannerにお願いするだけ。Spannerのエンジンが、裏でどのサーバーがデータを持っているかを自動で探し出し、コーディネーターと参加者をアサインして、先ほどの「準備・実行」のプロセスをコンマ数秒で完結させてくれます。

—

まとめ:Spannerの本質は「究極の調律師」

いかがでしたでしょうか?
Cloud Spannerの分散トランザクション(2PC + Paxos)は、一見すると複雑なパズルのようですが、本質はとてもシンプルです。

1. Paxosで、それぞれの地域のデータグループを堅牢にまとめ上げる。
2. 2相コミットで、地域をまたいだ複数のグループ間で足並みを完全に揃える。

この2つがガッチリ噛み合っているからこそ、私たちは「世界中どこからアクセスしても、いつでも正確で一貫性のあるデータ」をストレスなく利用できるのです。

Cloud Spannerという巨大で複雑なシステムも、基本の原理を紐解けば、私たちが日常で行っている「丁寧なコミュニケーション」の延長線上にあることが分かりますよね。

この基本さえ押さえておけば、Spannerを使ったアーキテクチャ設計や運用で迷うことはもうありません。ぜひ、自信を持って次のステップへ進んでください!

コメント

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