【入門編】 ノードリソース制限とスロットリング – Cloud Spanner

こんにちは!Cloud Spannerの世界へようこそ。
チーフアーキテクトの私です。

「世界中のどんなアクセスが来ても絶対に止まらない、しかも自動で大きくなってくれる魔法のデータベース」として有名なCloud Spannerですが、「じゃあ、限界を超えたらどうなるの?」という裏側の仕組みまで知っている人は、実はまだそれほど多くありません。

今回は、初心者の方でもスッと腑に落ちるように、専門用語を極力使わず、「Cloud Spannerのキャパシティ(容量)の限界と、ピンチのときの交通整理の仕組み」についてお話しします。

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

—

1. そもそもCloud Spannerの「リソース」ってなに?

データベースにとっての「リソース」とは、人間の「脳みそ(CPU)」と「机の広さ(メモリ)」のようなものです。

  • CPU(中央演算処理装置): 届いた注文(データを探す、書き込む、計算するなど)を猛烈なスピードで処理する脳みそ。
  • メモリ: 作業をするための机の広さ。よく使うデータをパッと取り出せるように広げておく場所。

Cloud Spannerは、データが増えたりアクセスが急増したりすると、この脳みそと机のセット(これを「ノード」や「コンピューティング容量」と呼びます)を自動で、あるいは私たちが指示してモリモリと増やしていくことができます。

—

2. もし、お店(Spanner)が超満員になったら?

想像してみてください。あなたが大人気のラーメン屋さんを開いたとします。
最初はカウンター5席(小さなSpanner)で十分回っていましたが、テレビで紹介された途端、行列ができてしまいました。

  • 厨房はてんやわんや(CPU使用率が100%に張り付く)。
  • 注文のメモ用紙を広げる机もいっぱい(メモリがひっ迫)。

このとき、お店が「もう無理です!ドカーン!」と壊れてしまっては困りますよね。現実世界のお店なら、「お並びの順番をお待ちください」「ただいま混み合っておりますので、少し提供にお時間がかかります」と入場制限をかけたり、順番待ちの列を作ったりするはずです。

Cloud Spannerの内部でも、まったく同じことが起きているんです。これを「スロットリング(負荷制御)」と呼びます。

—

3. Cloud Spannerの裏側で行われている「優しい交通整理」

Cloud SpannerのCPUやメモリが限界に近づきそうになると、システムはパニックを起こす代わりに、非常に冷静で賢い交通整理を始めます。

① 優先順位をつけた「お待たせ」テクニック

すべてのリクエストを無条件に受け付けてシステム全体をダウンさせる(これを「雪崩(なだれ)現象」と呼びます)のは、エンジニアとして一番避けたい事態です。

そのため、Spannerは過負荷を検知すると、内部で次のような調整を行います。

  • 急ぎの作業(重要度の高いトランザクション)を優先する。
  • ちょっと重くて後回しにできる分析用のデータ集計などは、「ちょっと待ってね」と少しだけ処理を遅らせる(スロットリング)。

これにより、システム全体がフリーズするのを防ぎながら、ギリギリのラインで踏みとどまります。

② エラーを返すことで「無理しないで」と伝える

それでもさばききれないほどの洪水のようなアクセスが来ると、Spannerはクライアント(アプリケーション)に対して、こう言います。

> 「ごめんね、今ちょっと頭がいっぱいだから、少し時間を置いてからもう一度トライして!」
> (エラーコード:`RESOURCE_EXHAUSTED` や `DEADLINE_EXCEEDED` などが返ってきます)

初心者の方は「エラーが出た!壊れた!」と焦ってしまうかもしれませんが、これはデータベース自身が自分を守るために発している「賢い防衛反応」なんです。

—

4. 私たちが実務で気をつけるべきこと

では、このSpannerの優しさ(スロットリング)に甘えきっていて良いかというと、もちろんそんなことはありません。アプリ側が何度も何度も休む間もなくリクエストを送り続けたら、お店の入り口に人が溢れかえってしまいますよね。

現場のプロとして、初心者のあなたに覚えておいてほしい鉄則は以下の3つです。

1. 「急な混雑」が予想されるなら、事前に容量(ノード数やProcessing Units)を増やしておく

  • セールやテレビ放映の時間が分かっているなら、事前にお店の席を増やしておきましょう(オートスケーリングに任せるのも手です)。

2. エラーが返ってきたら「リトライ(少し待ってからもう一度送る)」を実装する

  • Spannerから「ちょっと待って」と言われたら、1秒待って、2秒待って…と少しずつ時間を空けて再挑戦する仕組み(指数バックオフと呼びます)をプログラムに仕込んでおきます。これだけでシステムの安定感が劇的に変わります。

3. 無駄な重い処理を投げない

  • データベースの机(メモリ)を圧迫するような、効率の悪い検索クエリ(命令文)を書いていないか、常に気を配りましょう。

—

まとめ

いかがでしたでしょうか?
Cloud Spannerのリソース制限とスロットリングは、決して怖いものではありません。「限界を超えそうになったら、システムが知恵を絞ってお店を守ってくれる安全装置」なんだと捉えてもらえればバッチリです。

この仕組みを理解しているだけで、トラブルが起きたときにも「あ、今Spannerが自分で自分を守ってくれているんだな、じゃあアプリ側でリトライを入れよう、あるいは容量を少し増やそう」と冷静に対処できるようになります。

ここをクリアしたあなたなら、もうCloud Spannerの基本は完全にマスターしていますよ!自信を持って次のステップへ進んでくださいね。それではまた次回の記事でお会いしましょう!

コメント

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