こんにちは!Redisの奥深い世界へようこそ。
今日は、現場でエンジニアが冷や汗をかく瞬間――そう、「暴走したプログラムをどう止めるか」というテーマについてお話しします。
取り上げるのは`SCRIPT KILL`というコマンドです。
「なんだか物騒な名前だな…」と思いましたか?その通り、こいつは緊急停止ボタンです。
でも、安心してください。今日ここでお話しする内容をしっかり理解すれば、万が一のトラブルでも冷静に対処できるようになります。さあ、一緒にRedisの裏側を覗いてみましょう!
—
1. なぜLua(ルア)スクリプトは暴走するのか?
Redisには、複数の操作をまとめて一瞬で実行する「Luaスクリプト」という強力な機能があります。
例えるなら、「職人がパパッと手際よく複数の仕事を一瞬で片付けるマジック」のようなものです。
しかし、この職人、たまにうっかりミスをします。
- 無限ループに入ってしまい、いつまで経っても仕事が終わらない(「あれ?終わらないぞ…?」)。
- 処理するデータが多すぎて、Redisが固まってしまった。
職人がフリーズしてしまうと、他の人からの注文(ほかのクライアントからのリクエスト)が一切受け付けられなくなってしまいます。Redisは基本的に「一人でコツコツ働く職人タイプ(シングルスレッド)」なので、ひとつの仕事でフリーズすると、店全体がストップしてしまうのです。
そんなときに出番となるのが、`SCRIPT KILL`(緊急停止ボタン)です。
—
2. `SCRIPT KILL` の正体と、その「優しいルール」
この緊急停止ボタン、押すときにはとても大切なルールがあります。
それは、「まだ何もデータを書き換えていない(読み取り専用の)ときだけ止めていいよ」というルールです。
なぜこんなルールがあるのでしょうか?日常の例えで考えてみましょう。
> 【レストランの厨房のたとえ】
> 料理人がスープの味見(データの読み取り)をしている途中で、「あ、それ違う!」と止めるのは簡単です。スープを捨てるだけですからね。
> しかし、すでに肉を切り分け、お皿に盛り付け、ソースをかけ始めている(データの書き込み・更新を行っている)途中で、無理やり「ストップ!」と包丁を取り上げたらどうなるでしょう?
> 厨房はぐちゃぐちゃになり、料理は中途半端な状態で台無しになってしまいます。
Redisもこれと全く同じです。
もしスクリプトがすでにデータベースのデータを書き換えている途中で強制停止させたら、データが中途半端に壊れてしまう危険性があります。そのため、書き込みが始まってしまったスクリプトは、`SCRIPT KILL` では止められないようになっているのです。
—
3. 実際に使ってみよう(コードと解説)
それでは、実際にこのコマンドを使う場面をシミュレーションしてみましょう。
ステップ1:暴走したスクリプトを放り込む(イメージ)
例えば、終わりが見えないループをするスクリプトをRedisに実行させたとします。
— 終わらない無限ループの例(絶対に真似しないでね!)
while true do
— 何もしないでぐるぐる回る
end
ステップ2:別の窓から「止まれ!」と叫ぶ
Redisがフリーズしたら、別のターミナル(操作画面)から、あのコマンドを実行します。
緊急停止コマンドを送信!
SCRIPT KILL
うまくいくと、Redisは以下のように答えてくれます。
OK
これで暴走したスクリプトが無事に停止し、Redisに平和が戻ります!
もし「書き込み」が始まっていたら…?
もし、そのスクリプトがすでにデータの書き換えを行っていた場合、`SCRIPT KILL` を押してもRedisは冷たくこう返してきます。
(error) ERR Unsupported command or
not possible to sync / kill currently
running script.
(訳:「ごめん、すでに書き込みが始まってるから、データが壊れちゃうからこのボタンじゃ止められないよ!」)
こうなってしまった場合の最終手段は、Redisサーバー自体を再起動すること(`SHUTDOWN NOSAVE` など)になりますが、これは最終手段中の最終手段です。
—
先輩からのメッセージ
いかがだったでしょうか?
`SCRIPT KILL` は、いわば「安全装置付きの緊急停止ボタン」です。
「データを壊さないために、書き込み中の暴走は止められない」というRedisの優しさ(堅牢性)を知っておくと、単なるコマンドの暗記ではなく、設計思想まで理解できたことになります。
ここをクリアできれば、あなたはもうRedisの仕組みの核心を捉えています。自信を持って次のステップに進んでくださいね。
それでは、また次回の現場でお会いしましょう!
コメント