こんにちは! Redisの世界へようこそ。
今回は、Redisの心臓部の一つである「データの保存(永続化)」、そしてその裏側で起きたトラブルをどう防ぐかという、とっても大切なお話をしますね。
「バックグラウンドでの保存が失敗したとき、Redisは書き込みを拒否するのか?」
一見すると難しそうなテーマですが、日常のたとえ話を交えながら、優しく、そして本質までしっかりと紐解いていきましょう。
ここをクリアすれば、Redisの運用における「万が一への備え」はバッチリマスターできますよ!
—
1. Redisの「メモ帳」と「ノート」の仕組み
まず、Redisが普段どうやってデータを記憶しているかをおさらいしましょう。
Redisは、超高速にデータを読み書きするために、パソコンの「メモリ(RAM)」という場所をメインの作業机として使っています。メモリは電光石火のスピードで動きますが、弱点があります。それは「パソコンの電源を切ると、中身が全部消えてしまう」ということです。
これでは困るので、Redisは時々、机の上の大切なメモ(データ)を、消えないように引き出し(ハードディスクやSSD)にしまい込みます。
この「引き出しにしまう作業」を、Redisの世界では永続化(BGSAVEなど)と呼びます。
2. 「引き出しの故障」という悪夢
ある日、こんなトラブルが起きたと想像してください。
あなたは会社の重要な伝言メモを、慌てて引き出しにしまおうとしました。ところが……。
「あ、やばい! 引き出しがいっぱいで閉まらない!」 あるいは 「引き出しの鍵が壊れて入らない!」 という状況です。
さあ、あなたならどうしますか?
1. 「まあ、いっか!」 と言って、新しい重要な伝言メモをその辺の机の上にポイッと捨て続けますか? それとも、
2. 「ちょっと待って! 引き出しが壊れて保存できないから、これ以上新しいメモを受け取ると、いざというときに全部消えちゃうよ! だから直るまで新しいメモの受付を一時ストップしよう!」 と判断しますか?
Redisの設計者たちは、当然 2番 を選びました。なぜなら、データベースにとって「データがこっそり消えてしまうこと」が一番の罪だからです。
3. 主役の登場:`stop-writes-on-bgsave-error`
この「引き出し(ディスク)に保存するバックグラウンド処理が失敗したとき、新しい書き込み(メモの受付)をどうするか?」をコントロールするのが、今回のお題である設定、`stop-writes-on-bgsave-error` です。
名前を直訳すると、「バックグラウンド保存のエラー時に、書き込みを止める」ですね。
- `yes` に設定した場合(デフォルト)
「保存に失敗したら、これ以上データがズレたり消えたりすると困るから、新しい書き込みを拒否(エラーを返す)する!」という、安全第一のガードマンモードです。
- `no` に設定した場合
「保存は失敗したみたいだけど、とりあえず目の前のアプリからの書き込みは受け付け続けよう!」という、可用性(動き続けること)優先モードです。
どっちがいいの?
初心者の方からすると、「書き込みが拒否されるなんて怖い! `no` の方が安全なんじゃ?」と思うかもしれません。しかし、ここがエンジニアの腕の見せ所であり、深いところです。
- `yes`(デフォルト)が選ばれている理由:
ディスクの容量不足や権限エラーなどで「保存」が失敗している状態というのは、Redisの足元がグラついている危険な状態です。ここで書き込みを続けさせると、「メモリ上の最新データ」と「ディスク上の古いデータ」の乖離がどんどん広がっていきます。いざサーバーが再起動したとき、データがめちゃくちゃになってしまいます。だから、「おかしなことになったら、まず止めて管理者に知らせる」方が、結果的にデータを守ることにつながるのです。
—
4. 実際の環境をのぞいてみよう
この設定は、Redisの設定ファイル(`redis.conf`)に書かれています。実際のコードと設定を見てみましょう。
redis.conf の設定例
バックグラウンドでのスナップショット(RDB)保存が失敗した場合、
Redisは書き込みを停止するかどうかを制御します。
stop-writes-on-bgsave-error yes
もし、何らかの理由でこの挙動を確認・変更したい場合は、次のようにRedisに直接問いかけることもできます(Redisのコマンドラインからの操作)。
現在の設定がどうなっているか確認する
127.0.0.1:6379> CONFIG GET stop-writes-on-bgsave-error
1) “stop-writes-on-bgsave-error”
2) “yes” # デフォルトでは「yes(書き込みを止める)」になっています
もし運用方針として「どうしても書き込みを止めず、アラートだけ検知したいんだ」という場合は、次のように動的に変更することも可能です(※実務では慎重に行ってくださいね)。
設定を一時的に「no」に変更する
127.0.0.1:6379> CONFIG SET stop-writes-on-bgsave-error no
OK
—
5. 先輩エンジニアからの実務アドバイス
現場でRedisを運用していると、この `stop-writes-on-bgsave-error` が原因で、ある日突然アプリケーションからエラーが返ってくるという洗礼を受けることがあります。
大抵の場合、原因はRedisそのものではなく、以下のようなインフラ側のトラブルです。
- ディスクの空き容量が100%になってしまった!
- ディスクの書き込み権限がおかしくなった!
- メモリが足りなくなって、OSがバックグラウンド保存を邪魔した(OOM Killerなど)
もし「書き込みが拒否された!」というエラーに遭遇したら、Redisを責めるのではなく、まずは「おや、Redisの引き出し(ディスク)が何か悲鳴を上げているぞ」と気づいてあげてください。
まとめ
- `stop-writes-on-bgsave-error` は、バックグラウンド保存失敗時の「安全装置」。
- デフォルトの `yes` は、「中途半端な状態でデータを壊さないために、あえて書き込みを止める」という親切設計。
- トラブルが起きたときは、設定をいじる前にディスクの容量や状態を疑うのがプロの第一歩。
これで、Redisの永続化エラーに対する挙動は完璧ですね。
日々の運用で万が一の事態が起きても、慌てず騒らず、この「引き出しのたとえ」を思い出してください。
あなたのエンジニアライフが、より一層素晴らしいものになりますように!
コメント