こんにちは!Redisの世界へようこそ。
日々、膨大なデータを高速に処理してくれるRedisですが、「データのセーブ(保存)」について、実はすごく重要な落とし穴があるのを知っていますか?
今回は、Redisの裏側を支える重要な仕組みの一つ、`SAVE`コマンドについてお話ししますね。
「本番環境でこれをやっちゃうと大惨事になる…かもしれない」という現場の裏話も含めて、優しく、かつ深く噛み砕いて解説していきます。
ここをクリアすれば、Redisのデータ永続化の基本はバッチリマスターできますよ!ぜひ最後までついてきてくださいね。
—
1. Redisのデータって、どこにいるの?
まず大前提として、Redisは「超高速なメモリー(RAM)」の上で動くデータベースです。
メモリーの上で動いているからこそ、電光石火の速さでデータの読み書きができるのですが、ここで一つ弱点があります。
それは、「電源を切ったり、サーバーがクラッシュしたりすると、メモリーのデータは全部消えてしまう」ということです。デスクトップパソコンでWordのファイルを保存せずに電源を切ったら消えちゃうのと同じですね。
そこでRedisは、メモリー上のデータを定期的に、あるいは手動で、安全なハードディスク(SSD)に「写真(スナップショット)」として保存する機能を持っています。このファイルのことを、Redisの世界ではRDB(Redis Database)ファイルと呼びます。
—
2. 例え話:美術館の「館内一斉フリーズ撮影」
このRDBファイルを作る方法の一つが、今回主役の`SAVE`コマンドです。
この`SAVE`コマンドの動きを、日常の例えで説明しましょう。
想像してください。あなたは、ものすごく来客数が多い「超人気の美術館(=Redis)」の館長さんです。
お客さん(=クライアントからのリクエスト)が次々とやってきて、「この絵を見せて!」「この彫刻の感想を教えて!」と休む暇なく話しかけてきます。
ここで、館長であるあなたに指令が出ました。
「今すぐ館内の展示品すべてを完璧な写真に収めて記録しなさい(=`SAVE`の実行)」
真面目なあなたはこう考えました。
「よし!ミスがあってはいけないから、今から美術館の入り口を完全にシャッターで閉めて、お客さんを一人も動かさないようにピタッと止まらせてから、じっくり写真を撮ろう!」
これが、まさに`SAVE`コマンドの正体です。
—
3. `SAVE`コマンドが抱える「ヤバい」特徴
`SAVE`コマンドを実行すると、何が起きるでしょうか?
1. 完全な同期処理(ブロック)
Redisはシングルスレッド(基本的には1人で仕事をこなす優秀な職人)で動いています。`SAVE`が実行されると、その職人は「写真撮影」という重労働に全神経を集中させます。
2. 他の仕事が一切できなくなる
職人が写真撮影に没頭している間、新しくやってきたお客さんの「データをちょうだい」「データを書き換えて!」というリクエストは、すべて美術館の外(待ち行列)で完全にストップ(ブロック)させられます。
どんないいこと? どんないいこと…いや、悪いこと?
- メリット: メモリーのデータがそのまま一瞬のズレもなく完璧にディスクに書き込まれます。
- デメリット: データ量が数ギガバイトなど大きくなると、ディスクへの書き込みに数秒〜数十秒かかります。その間、Redisに接続しているすべてのアプリケーションがフリーズします。
実務の現場で、もし何百万件もある巨大なRedisに対してうっかりこの`SAVE`コマンドを打ってしまうと、Webサイト全体が数秒〜数十秒の間、完全に応答しなくなるという「プチ障害」を引き起こしてしまうのです。怖ろしいですね……!
—
4. 実際に触ってみよう(安全な環境で!)
百聞は一見にしかず。ローカルのテスト環境やDockerなどで、実際に動かしてみましょう。
Redisの操作ツール(`redis-cli`)を開いて、コマンドを叩いてみます。
データをいくつか登録する
127.0.0.1:6379> SET user:1 “Alice”
OK
127.0.0.1:6379> SET user:2 “Bob”
OK
手動でSAVEコマンドを実行する
127.0.0.1:6379> SAVE
OK
たったこれだけで、裏側でスナップショットファイル(通常は `dump.rdb` という名前)がディスク上に生成されます。
実行結果として `OK` が返ってくれば保存完了ですが、裏でどれだけRedisが汗をかいていたかは、データ量次第というわけです。
—
5. 先輩エンジニアからの実務アドバイス:じゃあどうすればいいの?
「じゃあ、安全にバックアップを取るにはどうすればいいんですか?」という疑問が湧きますよね。
本番環境で安全にスナップショットを取りたいときは、`SAVE`ではなく、その兄弟分である`BGSAVE`(Background Save)コマンドを使います。
- `BGSAVE` の仕組み:
Redisの職人は、「あ、写真撮るのね? 分かった、コピーロボット(別プロセス=fork)を1体作るから、そいつに写真撮影を任せるよ! ボクは引き続きお客さんの相手をするね!」と、裏側(バックグラウンド)でこっそり保存作業を行わせます。これならお客さんを待たせずに済みますよね。
実は、Redisの設定ファイル(`redis.conf`)のデフォルト設定でも、この仕組みがうまく使われています。
例えば、「過去60秒以内に10000回データが書き換わったら、自動で `BGSAVE` を裏で走らせてね」といった賢いルール(セーブポイント)があらかじめ設定されているのです。
—
まとめ
- `SAVE`コマンドは、同期的に(=自分を完全に止めて)RDBスナップショットを作る。
- 実行中はRedisが他のリクエストを受け付けなくなるため、データ量が多い本番環境での手動実行は絶対にNG!
- 本番では裏でこっそりやってくれる `BGSAVE` や、自動設定に任せるのがプロの作法。
データベースの裏側の仕組みを知ると、インフラを触るのがぐっと楽しく、そして安全になります。
この知識があれば、もううっかり本番環境でサービスを止めてしまう心配はありませんね。
Redisの基本は、こうした「仕組みの裏側」を少しずつ知っていくこと。一緒に一歩ずつ、確実マスターしていきましょう!
コメント