【入門編】 MVCC(多版同時実行制御) – Cloud Spanner

Cloud Spannerの「時をかけるデータベース」? MVCCの秘密をこっそり教えちゃいます!

やあ、みんな! Cloud Spanner の世界へようこそ!

今日は、データベースの「裏側」で、みんなが快適にデータを扱えるように、こっそり頑張ってくれている「MVCC(Multi-Version Concurrency Control)」という仕組みについて、とびきり分かりやすく解説しちゃうよ。

「MVCC? なんか難しそう…」って思ったかもしれないけど、大丈夫! 日常の出来事に例えながら、まるで魔法のようにスルスルと理解できるように、先輩エンジニアの僕が優しく導いていくからね。

ここをクリアすれば、Cloud Spanner の基本的な仕組みが「なるほど!」って腑に落ちるはず。さあ、一緒にデータベースの秘密を探求しに行こう!

そもそも、なぜ「バージョン管理」が必要なの?

まず、MVCC を理解するために、データベースで「複数の人が同時にデータを触ったら、どうなっちゃうの?」という問題を考えてみよう。

例えば、みんなで一つの「おもちゃ箱」を共有していると想像してみて。

  • Aさん: おもちゃ箱から「赤いブロック」を取り出して、新しい作品を作ろうとしている。
  • Bさん: 同じタイミングで、おもちゃ箱から「赤いブロック」を取り出して、別の作品を作ろうとしている。

この時、もし「今、おもちゃ箱に赤いブロックは1個しかない」というルールだったらどうなる? Aさんが取った瞬間にBさんは取れなくなっちゃうし、Bさんが取った瞬間にAさんは困るよね。これだと、みんなで仲良く遊べない。

データベースも同じで、たくさんの人が同時にデータを読み取ったり、書き換えたりしようとすると、お互いの邪魔をしてしまって、データがめちゃくちゃになってしまう可能性があるんだ。

そこで登場するのが、MVCC という「賢い仕組み」なんだ。

MVCCって、いったい何者? ~「時をかけるデータベース」の秘密~

MVCC の一番のポイントは、「データの『過去の姿』もちゃんと取っておく」ということ。

さっきのおもちゃ箱の例で言うと、MVCC はこんな風に働くんだ。

  • Aさんが「赤いブロック」を取る。
  • この時、MVCC は「『赤いブロック』は、Aさんが今、手に持っている状態」という記録を残す。
  • Bさんが「赤いブロック」を取ろうとする。
  • MVCC は、「Aさんが今、赤いブロックを持っている」という記録を見る。
  • でも、MVCC は「Bさん、大丈夫! Aさんが取る前の『元の状態の赤いブロック』は、まだおもちゃ箱に残っているよ!」と教えてくれる。
  • だから、Bさんは Aさんの邪魔をせずに、元の状態の「赤いブロック」を取って、自分の作品を作ることができるんだ。

つまり、MVCC は、

  • 書き込み をするときに、元のデータを消さずに、新しいバージョンのデータを作る。
  • 読み取り をするときに、「今、この瞬間に最新で、かつ自分が見ても大丈夫なバージョン」のデータを見る。

ということを自動でやってくれるんだ。

これにより、

  • 読み取る人 (Aさん) は、書き込み中のデータに邪魔されずに、最新のデータを見ることができる。
  • 書き込む人 (Bさん) は、読み取っている人の邪魔をせずに、新しいデータを追加できる。

まるで、それぞれが「自分だけの時間」の中で作業しているみたいだよね。だから、「時をかけるデータベース」なんて呼んじゃうくらい、すごい仕組みなんだ!

Cloud Spanner の MVCC は、もっと賢い! ~「タイムトラベル」の裏側~

Cloud Spanner の MVCC は、さらに一歩進んでいるんだ。

多くのデータベースが、データを更新するたびに「いつ」「誰が」「どのデータを」「どう変えたか」という情報を細かく記録して、それを元にバージョンを管理している。これはこれで賢いんだけど、ちょっと手間がかかるんだ。

Cloud Spanner は、もっとスマートに、「トランザクション ID」というものを活用している。

トランザクション ID とは、一連のデータベース操作(例えば、「Aさんの口座からBさんの口座へ送金する」といった一連の処理)に付けられる、ユニークな「受付番号」みたいなもの。

Cloud Spanner は、このトランザクション ID を使って、

  • 書き込み: 新しいデータを書き込むときは、そのデータに「いつ(どのトランザクション ID が書き込んだか)」という情報をつける。
  • 読み取り: データを読み取るときは、「自分が見ているトランザクション ID よりも『前』の ID で書き込まれた、最新のデータ」を見る。

ということをしている。

例えるなら、

  • お店のレジで、お客様が「注文」をするたびに、ユニークな「整理番号」が発行される。
  • 調理場では、その「整理番号」ごとに、料理を作っていく。
  • お客様が「自分の料理はまだ?」と聞くと、レジは「あなたの整理番号より前に作られている、最新の料理」を渡してくれる。

こんなイメージかな。

この仕組みのおかげで、Cloud Spanner は、読み取りと書き込みの競合を劇的に減らし、高速で一貫性のあるデータアクセスを実現しているんだ。

MVCC と「ガベージコレクション」 ~「過去のデータ」のお掃除隊~

さて、MVCC のおかげで、私たちはいつでも最新のデータにアクセスできるようになった。でも、ちょっと待って。

「過去のデータも全部取っておく」ってことは、おもちゃ箱に「過去の姿のおもちゃ」がたくさん溜まっていくことになるよね? ずっとそのままにしておくと、おもちゃ箱がいっぱいになって、新しいおもちゃを入れられなくなってしまう。

データベースも同じで、古いバージョンのデータがどんどん溜まっていくと、ストレージ(データを保存する場所)を圧迫してしまうんだ。

そこで登場するのが、ガベージコレクション (Garbage Collection, GC) という「お掃除隊」の役割!

ガベージコレクションは、

  • 「もう誰もこの『過去のデータ』を見ていないな」
  • 「このデータは、もう必要ないな」

と判断した古いバージョンのデータを、自動的に削除してくれるんだ。

例えるなら、

  • おもちゃ箱の「片付け係」が、「もう誰も遊んでいない、壊れたおもちゃ」や、「ずっと昔のバージョンのおもちゃ」を見つけて、綺麗に処分してくれる。

こうすることで、おもちゃ箱(データベースのストレージ)は常にスッキリ整理された状態を保ち、新しいおもちゃ(新しいデータ)をどんどん追加できるようになるんだ。

Cloud Spanner のガベージコレクションは、非常に効率的に動作するように設計されているから、ユーザーが意識することなく、データベースのパフォーマンスを維持してくれるんだよ。

まとめ:MVCC が支える Cloud Spanner の「安定感」

今日は、Cloud Spanner の MVCC という仕組みについて、ちょっとだけ深掘りしてみたけど、どうだったかな?

  • MVCC は、データの「過去の姿」を保持することで、複数の人が同時にデータを触っても、お互いに邪魔しないようにする賢い仕組み。
  • Cloud Spanner は、トランザクション ID を活用することで、さらに効率的で高速な MVCC を実現している。
  • ガベージコレクションが、不要になった古いデータを削除することで、データベースのストレージを圧迫しないようにしている。

これらの仕組みのおかげで、Cloud Spanner は、大量のデータを扱いながらも、高い一貫性と可用性を維持できる、まさに「堅牢なデータベース」として君臨しているんだ。

「ここをクリアすれば、Cloud Spanner の基本はバッチリマスターできる」って言ったけど、この MVCC の理解は、まさにその通り!

もし、もっと Cloud Spanner の内部構造について知りたいことがあったら、いつでも気軽に聞いてね。みんなが Cloud Spanner をもっと好きになってくれるように、これからも色々な「極限の知見」を伝えていくから!

それでは、また次の記事で会おう!

コメント

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