【入門編】 読み取り専用トランザクション – Cloud Spanner

皆さん、こんにちは!チーフアーキテクトの〇〇です。
Cloud Spannerという、ちょっと特別なデータベースについて、皆さんと一緒に楽しく学んでいきましょう。

「データベース」と聞くと、なんだか難しそう…と思うかもしれませんが、実は私たちの身の回りにある様々なサービスを支えている、とっても大切な土台なんです。
Cloud Spannerは、その中でも特に「すごい」と評判のデータベース。何がすごいかというと、世界中に散らばった大量のデータを、いつでも、誰でも、全く同じように、そしてものすごく速く見ることができるという、まるで魔法のような能力を持っているんです。

今回は、その魔法の中でも特に「データを読み取る」という部分に焦点を当てて、「読み取り専用トランザクション」という仕組みと、それを支える「TrueTime」という時間合わせの技術について、一緒に紐解いていきましょう。
ここをクリアすれば、Cloud Spannerの基本はバッチリマスターできますよ!

—

🚀 なぜ「読み取り」がそんなに難しいの?

突然ですが、皆さんで同じ本を同時に読むことを想像してみてください。

Aさんが1ページ目を読んでいる間に、Bさんが3ページ目を読んで、Cさんが2ページ目を読んでいる…これなら問題ありませんよね? みんなが好きなページを好きな時に読めます。

でも、もしその本が「最新の情報」にどんどん更新されていくニュース記事だったらどうでしょう?
Aさんが記事の冒頭を読んでいる間に、編集者が最新情報を追記して、記事の後半がガラッと変わってしまったら? Aさんは記事の冒頭は古い情報、後半は新しい情報が混じった、ちぐはぐな記事を読んでしまうことになりますよね。

これが、データベースの世界で「データを読み取る」ということが、実は奥深い理由なんです。
たくさんの人が同時にデータを読み書きする中で、「みんながちゃんと、その瞬間の正しい情報を見られるようにする」って、実はとても難しいことなんです。

特にCloud Spannerは、世界中にデータを散らばせて管理しているので、この「みんなが同じ瞬間を見ている」という保証が、さらに難しくなります。

—

🔒 ロックなしで一貫性を保つ「読み取り専用トランザクション」の魔法

そこで登場するのが、Cloud Spannerの「読み取り専用トランザクション」という仕組みです。
「トランザクション」という言葉はちょっと専門的ですが、ここでは「データを見るための一連の作業のお約束」くらいに思ってください。

通常のデータベースでは、誰かがデータを書き換えたり、あるいは特定のデータをじっくり読んだりする際には、「ロック」という仕組みを使うことがあります。
これは、「私がこのデータを触っている間は、他の人はちょっと待っててね!」と、一時的に他の人のアクセスを制限するようなものです。

でも、このロック、たくさんの人が同時にデータを見たい時には、ちょっと困りものなんです。
「あの人が終わるまで待つ」「この人が終わるまで待つ」…これでは、データの読み取りが遅くなってしまいますよね。

Cloud Spannerの「読み取り専用トランザクション」は、このロックを使わずに、「ある一瞬のデータの姿」を正確に、そしてものすごい速さで私たちに見せてくれる魔法のような仕組みなんです。これを「スナップショット読み取り (Snapshot Read)」と呼びます。

📸 決定的瞬間を切り取る「スナップショット読み取り」

「スナップショット」という言葉、聞いたことがありますか?
スマートフォンの画面を写真に撮る「スクリーンショット」と似ていますね。
スナップショット読み取りは、まさにデータベース全体の「ある一瞬の写真」をパシャッと撮って、その写真を見ているようなイメージです。

想像してみてください。あなたは、あるお店のオンライン在庫システムを見ています。
今、この瞬間の在庫数を正確に知りたいとしますよね。
もし誰かが同時に商品を注文して在庫が減ったり、お店に新しい商品が届いて在庫が増えたりしても、あなたが「在庫を見たい!」と思ったその瞬間の在庫数が、世界中のどこから見ても、全く同じ形で表示されるんです。

  • 他の人の影響を受けない: 誰かがデータを書き換えていても、あなたは自分が「見たい」と指定した瞬間の、古いデータであっても、新しいデータであっても、その時点の状態だけを見ることができます。途中でデータが書き換わる心配がありません。
  • ロック不要で超高速: 「写真」を見るだけなので、他の人がデータを書き換えようが、別の「写真」を撮ろうが、あなたの邪魔にはなりません。そのため、ロックで待たされることなく、あっという間に結果が返ってきます。
  • 世界中で一貫した情報: たとえデータが地球の裏側に分散して保存されていても、全てのデータが「同じ瞬間の写真」として扱われるので、「こっちのサーバーではAという情報、あっちのサーバーではBという情報」といった、ちぐはぐな状況は起こりません。

これが、Cloud Spannerが「世界規模で一貫性のある読み取り」を実現できる理由の一つなんです。

—

⏰ 世界中の時間を合わせる「TrueTime」の魔法

さて、ここまで「ある一瞬の写真」という言葉を使って説明してきましたが、ここで一つ疑問が浮かびませんか?

「その『一瞬』って、どうやって決めるの? 世界中に散らばったサーバーの時間がずれてたら、どうなるの?」

ごもっともな疑問です!
もし、東京のサーバーとニューヨークのサーバーの時計が少しでもずれていたら、「同じ瞬間」を切り取ったつもりが、実は少し違う時間のデータを見てしまう…なんてことになりかねません。

そこで登場するのが、Cloud Spannerのもう一つの魔法「TrueTime(トゥルータイム)」です。

🎻 オーケストラの指揮者のようなTrueTime

TrueTimeは、例えるなら世界中のCloud Spannerのサーバーの時間を、完璧に合わせるためのオーケストラの指揮者のような存在です。

私たちの普段使っている時計も、少しずつずれていくことがありますよね。
Cloud Spannerは、世界中のデータセンターに配置されたサーバーの時計を、原子時計(地球上で最も正確な時計!)とGPS(衛星からの電波で時間を補正)という二つの超高性能な時間源を使って、限りなく正確に同期させています。

しかもただ同期させるだけでなく、「このサーバーの時間は、今から未来の0.000007秒(7マイクロ秒)の間は、絶対にズレがないと保証できる!」といった具合に、時間のずれの幅(誤差)まで厳密に計算して教えてくれるんです。

この「誤差の保証」が、Cloud Spannerの「スナップショット読み取り」の根幹を支えています。

⏱️ スナップショットとTrueTimeの連携

では、このTrueTimeがどうやってスナップショット読み取りと連携するのでしょうか?

1. あなたが「今この瞬間のデータを見たい!」とCloud Spannerにリクエストを送ります。
2. Cloud SpannerはTrueTimeに「今、何時何分何秒と判断すれば、世界中のどのサーバーでも確実に『今』と言える最も新しい時刻を教えて!」と尋ねます。
3. TrueTimeは、世界中のサーバーの時間を調整し、誤差まで考慮した上で、「はい、この時刻(タイムスタンプ)を『今』としてください!」と、ズレがないことを保証できる、まさに決定的な瞬間を教えてくれます。
4. Cloud Spannerは、そのTrueTimeが保証した正確な時刻の「写真」を撮り、世界中に散らばったデータの中から、その時刻よりも前に書き込まれた最新のデータだけを、あなたに提供してくれるんです。

これによって、たとえデータが地球の裏側に保存されていても、「世界中のどこから見ても、全く同じ、ある一瞬のデータ」を、ものすごい速さで、そして確実に手に入れることができるわけです。

—

💻 実際のコードで見てみよう!

では、実際にCloud Spannerでデータを読み取る場合、どんな風に使うのでしょうか?
普段のSQL文とほとんど変わりません!

— 例: オンラインストアで、商品「魔法のランプ」の現在の在庫を確認する
SELECT product_name, stock_quantity
FROM Products
WHERE product_id = ‘magic_lamp_001’;

— このシンプルなSELECT文の裏側で、Cloud Spannerはこんな魔法を使っています!
— 1. TrueTimeに「今」の時刻(タイムスタンプ)を問い合わせ、ズレのない「決定的瞬間」を特定。
— 2. その「決定的瞬間」のデータベース全体の「スナップショット(写真)」を準備。
— 3. 世界中のどこにデータが保存されていても、その写真に写っている「魔法のランプ」の在庫数を集めてきて、あなたに表示します。
— 他の人が同時に在庫を更新していても、あなたはロックで待たされることなく、
— あなたがクエリを実行した「その瞬間」の在庫情報を、正確に見ることができるんです。

もし、少し前の時点のデータを見たい場合は、こんな書き方もできます。(ちょっと応用編ですが、Spannerのすごさが分かります!)

— 例: 昨日の午後3時時点の「魔法のランプ」の在庫を確認する
SELECT product_name, stock_quantity
FROM Products
WHERE product_id = ‘magic_lamp_001’
AS OF TIMESTAMP ‘2023-10-26T15:00:00Z’; — ここで、特定の過去の時刻を指定!

— Spannerは、TrueTimeが保証した過去のその時刻の「写真」を、まるでタイムマシンに乗ったかのように探し出してくれます。
— 過去のデータも、まるでアルバムをめくるように、正確に振り返ることができるんです。

—

🎉 まとめ! Cloud Spannerの読み取りはまさに魔法!

今回は、Cloud Spannerの読み取りの魔法「読み取り専用トランザクション」と、それを支える「スナップショット読み取り」、そして「TrueTime」という時間合わせの技術について見てきました。

  • 読み取り専用トランザクション(スナップショット読み取り):
  • データベースの「ある一瞬の写真」を切り取り、その写真を見るようにデータを読み取ります。
  • 他の人の書き込みに邪魔されず、ロックなしで超高速に、そして一貫性のあるデータを読み取ることができます。
  • TrueTime:
  • 世界中のSpannerサーバーの時間を、原子時計とGPSを使って限りなく正確に合わせます。
  • さらに、その時刻の「ズレの保証」まで行うことで、「決定的瞬間」を世界中で共有できる仕組みです。

この二つの技術が組み合わさることで、Cloud Spannerは「世界中に分散したデータを、いつでも、誰でも、全く同じ瞬間の情報として、高速に読み取れる」という、他のデータベースではなかなか真似できない、まさに究極のデータベースとして機能しているんです。

どうでしたか? Cloud Spannerの「読み取り」の奥深さと、その魔法のような仕組みの一端を感じていただけたでしょうか。
ここをクリアすれば、Cloud Spannerの基本はバッチリマスターできますよ!

次回は、今度はデータを「書き込む」時のCloud Spannerの魔法について、さらに深掘りしていきましょう。お楽しみに!

コメント

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