【入門編】 直列化可能分離の保証 – Cloud Spanner

こんにちは!Cloud Spannerの世界へようこそ。
データベースの世界では「最強クラス」と称されるこのCloud Spannerですが、名前を聞くだけで「なんだか難しそう…」「分散データベースって何?」と身構えてしまう方も多いのではないでしょうか。

大丈夫、安心してください。今日は、Cloud Spannerの心臓部であり、最も重要な魔法である「直列化可能分離(シリアライザブル)」について、専門用語をできるだけ排除して、私と一緒に優しく紐解いていきましょう。

ここをクリアすれば、Cloud Spannerの基本はバッチリマスターできますよ!

—

1. そもそも「直列化可能分離」ってなに?(日常の例え)

いきなり難解な漢字が並んでいますが、意味はとってもシンプルです。

想像してみてください。あなたは人気ラーメン店の店主です。
今日のお昼時、カウンターの席がたったの1席しか空いていません。そこに、お腹をペコペコにしたAさんとBさんが、ほぼ同時に「いらっしゃい!」と入ってきました。

もし、あなたがうっかり混乱して、AさんとBさんの注文を同時に作り始め、麺をどんぶりの中でごちゃ混ぜにしてしまったらどうなるでしょう? 大惨事ですよね。

ラーメン店として正しい動きはこうです。
1. 「先にドアを開けたのはAさんだな。じゃあAさんの注文を完全に仕上げて、お会計まで終わらせよう」
2. 「それが終わったら、次にBさんの注文に取り掛かろう」

つまり、「たとえ何人ものお客さんが同時にバラバラのタイミングでやってきても、まるで『1人ずつ順番に(直列に)処理した』かのように矛盾なく結果を合わせる」こと。これが「直列化可能分離(Serializable)」の本質です。

データベースの世界でも全く同じことが起き行われています。世界中のユーザーが一斉にデータを書き換えたり読み込んだりしても、データがごちゃ混ぜになって壊れてしまわないようにする、最強の交通整理のルールなのです。

—

2. なぜCloud Spannerの仕組みはすごいの?

通常のデータベースでは、この「順番待ちの交通整理」をするために、全員の列を作ったり、他の人をストップさせたりします。これをやると、お店(データベース)がすごく混雑して、行列が長くなり、処理が遅くなってしまいますよね。

特にCloud Spannerは、世界中のサーバーがチームを組んで動く「巨大な分散データベース」です。東京のサーバーと、アメリカのサーバーが同時にデータを処理しているのに、どうやって「きれいな順番」を決められるのでしょうか?

ここでCloud Spannerが使っているのが、「2相ロック」と「タイムスタンプ順序付け」という、ちょっとかっこいい技術のコンビネーションです。

タイムスタンプという名の「絶対的な時計」

Cloud Spannerには、世界中で完全に同期された「TrueTime(トゥルータイム)」という特殊な時計があります。

先ほどのラーメン店の例で言うと、お客さんの手に「世界中どこにいても絶対に狂わない、超高精度な整理券(タイムスタンプ)」を配るようなものです。
「あなたは12時00分00秒001、次の人は12時00分00秒002」という風に、厳密に時間の順序を決めます。

衝突が起きたときの「2相ロック」

もし、同じデータを同時に書き換えようとする人が現れたらどうなるでしょうか?
Cloud Spannerは、先ほど配った「整理券の順番」を確認し、「後から来た人は、先に来た人が終わるまでちょっと待っててね(ロック)」という交通整理を自動で行います。

ただし、やみくもに全部を止めるわけではありません。タイムスタンプできれいに順番が整理されているため、「あ、この人とこの人は別の場所のデータだから同時に進めて大丈夫だな」という判断も超高速で行えるのです。

結果として、「世界中にサーバーが散らばっているのに、まるで1台の巨大なノートパソコンで1つずつ丁寧に処理したかのように、絶対にデータの矛盾が起きない」という奇跡のような状態を作り出しています。

—

3. 実務でのイメージを掴んでみよう

ここで、Cloud Spannerを実際に使うときのイメージを、簡単なSQL(データベースにお願いする言葉)とコードで見てみましょう。

例えば、口座の残高をやり取りするトランザクションを考えてみます。

— トランザクションの開始(お店に入って注文を決めるイメージ)
— Cloud Spannerでは、この中でデータの読み書きを行います。

— 1. 口座Aの残高を確認する
SELECT balance FROM accounts WHERE id = ‘A’;

— 2. 口座Aから100円引いた額にアップデートする
UPDATE accounts SET balance = balance – 100 WHERE id = ‘A’;

— 3. 口座Bに100円足した額にアップデートする
UPDATE accounts SET balance = balance + 100 WHERE id = ‘B’;

— コミット(無事に処理を完了し、レシートを受け取るイメージ)
— この瞬間に、Cloud Spannerの「タイムスタンプ」と「ロック」が働き、
— 他の人の邪魔をせずに安全に記録が確定します。

もし、この瞬間と全く同じタイミングで、別の人があなたのお財布(口座A)を覗き見たり書き換えようとしたりしても、Cloud Spannerの直列化可能分離が裏側でガッチリとガードしてくれます。
「データがおかしくなっていたらどうしよう…」というエンジニア最大の夜中の悪夢から、私たちを解放してくれるのです。

—

最後に:先輩からのメッセージ

いかがでしたでしょうか?
「直列化可能分離」と聞くと難しく感じますが、要するに「みんながバラバラにアクセスしても、順番をきれいに整理して、絶対にデータの辻褄を合わせるCloud Spannerの仕組み」のことです。

この仕組みがあるおかげで、私たちは「世界中のユーザーが一瞬でアクセスするような巨大なシステム」であっても、データの整合性を心配することなく、安心して開発に集中することができます。

ここを理解できれば、Cloud Spannerのアーキテクチャの最も美味しい部分はもうあなたのものです。
ぜひ、この確かな自信を持って、次のステップへ進んでいきましょう!応援しています!

コメント

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