【入門編】 Change Streamsの内部アーキテクチャ – Cloud Spanner

こんにちは!Cloud Spannerの世界へようこそ。
今日は、データベースの中で日々起こるデータの変化を、まるで優秀な監視カメラのように逃さずキャッチしてくれる機能「Change Streams(チェンジストリーム)」の内部の仕組みについてお話ししますね。

「データベースの変更を追う」って聞くと、なんだか難しそうに聞こえるかもしれません。でも、ここをクリアすれば、Cloud Spannerの基本はバッチリマスターできますよ!
さあ、専門用語のジャングルを避けて、日常の例えを交えながら本質へとご案内しましょう。

—

1. 「Change Streams」って、一言で言うと何?

いきなりですが、みなさんは「宅配便の追跡サービス」を使ったことがありますか?
荷物が「発送されました」「〇〇の営業所に到着しました」「いま配達中です」と、刻一刻とステータスが変わっていくあの仕組みです。

Cloud SpannerのChange Streamsは、まさに「データベースの中の荷物の追跡サービス」です。
テーブルの中で「誰かがデータを作った(INSERT)」「データを書き換えた(UPDATE)」「データを消した(DELETE)」というすべてのイベントを、時系列のログとして綺麗に記録し、リアルタイムで外の世界(アプリケーションや他のシステム)に届けてくれる機能なんですよ。

—

2. なぜ普通の仕組みじゃダメなの?(Spannerならではの課題)

ここで少し立ち止まってみましょう。
「データの変更履歴を残す」なんて、昔からある普通のデータベースでもできそうな気がしませんか?

普通のデータベースなら、変更があった瞬間に「あ、今書き換えたよ!」とメモを1枚のノートに書けばおしまいです。
しかし、Cloud Spannerは世界中に何台ものサーバーを並べて動かす、超巨大な分散データベースです。

  • 東京のサーバーでデータが書き換わり、同時刻にアメリカのサーバーでもデータが書き換わる。
  • ネットワークの遅延があって、届く順番が前後するかもしれない。

こんなカオスな状況の中で、「すべての変更を、世界中で絶対に矛盾のない正しい順番(タイムスタンプ順)で並べて、一滴も漏らさずに届ける」というのは、実はコンピュータサイエンス的にめちゃくちゃ難しい挑戦なんです。

それをサラッとやってのけるのが、Spannerの内部アーキテクチャのすごいところです。

—

3. 内部で何が起きているのか?(極限の仕組みを優しく解剖)

では、Spannerの内部で、Change Streamsがどうやって動いているのかを覗いてみましょう。

① 分割されたデータの「スパイ(監視役)」たち

Cloud Spannerの中では、データは「スプリット」と呼ばれる小さな断片に分けられ、世界中の色々なマシンにちらばって保存されています。

Change Streamsを有効にすると、Spannerはこのスプリット一つひとつに「監視カメラ(内部のイベントキャプチャ機構)」をこっそり取り付けます。
この監視カメラは、自分の担当エリアで「INSERTされた!」「UPDATEされた!」という事実が起きるたびに、休むことなくメモ用紙に書き留めていきます。これがイベントの生成です。

② 「TrueTime」という魔法の時計

ここで問題になるのが、「どのカメラのメモが先か?」という時間の順番です。世界中のマシンの時計をぴったり合わせるのは、実は物理的に不可能です。

しかし、Cloud Spannerには「TrueTime(トゥルータイム)」という、誤差を極限まで小さく抑えた世界共通の超高精度な時計があります。
Spannerはこの時計を使って、すべての変更イベントに「世界中で絶対にズレない正確なタイムスタンプ」を刻印します。

③ 整理整頓係(マージ処理)によるパズルの組み立て

各監視カメラがバラバラに記録したメモは、そのままでは順番がバラバラです。
ここで、裏方で働く「整理整頓係(ストリーミングの配信エンジン)」が登場します。

整理整頓係は、TrueTimeのタイムスタンプを頼りにして、世界中から集まってくるバラバラのメモを「起きた時間順」に完璧に美しく並べ替えます(マージ)。

パズルのピースが正しい順番で綺麗に並んだら、それを「はい、お届け物です!」と、外で待っているあなた(のアプリケーション)へ流し込んでいくのです。

—

4. 実際にどう使うの?(簡単なイメージ)

「なるほど、裏ですごいことになってるのは分かったけど、どうやって使うの?」という方のために、雰囲気だけコード(SQL)で見てみましょう。

Cloud Spannerでは、変更を監視したいテーブルに対して、次のような簡単な指示(DDL)を出すだけでChange Streamsが動き出します。

— 「Users」テーブルの変更をすべてキャプチャするストリームを作るよ!
CREATE CHANGE STREAM UserActivityStream
FOR Users;

これだけで、Spannerは裏側で先ほど説明した「監視カメラ」と「整理整頓係」を稼働させ始めます。
あとは、アプリケーション側でこのストリームを読み取るプログラムを動かすだけです。

— 流れてくる変更イベントを覗き見するクエリのイメージ
SELECT
FROM SPOON_READ_USER_ACTIVITY_STREAM(
table_name => ‘Users’,
start_timestamp => …
);

(※実際の構文はAPIやSDKを介して行われます)

これにより、「ユーザーが新規登録された瞬間に、ウェルカムメールを送る」「データの変更を別の分析用データベースにリアルタイムでコピーする」といったモダンなシステムが、驚くほど簡単かつ堅牢に作れてしまうのです。

—

おわりに

いかがでしたでしょうか?
Cloud SpannerのChange Streamsは、単に「変更ログを取る機能」ではありません。

  • TrueTimeという物理の限界に挑む仕組み
  • 世界中に散らばるデータをきれいに束ねる分散処理の技術

これらが裏側で完璧に調和しているからこそ、「いつでも、どんな規模でも、絶対に正しい順番でデータを届けられる」という信頼性が担保されています。

この仕組みの本質がわかっていれば、今後さらに巨大なシステムを設計・運用することになっても、迷うことはありません。
さあ、この強力な武器を手に、あなたのシステムをさらに進化させていきましょう!

コメント

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