【入門編】 appendfsync設定 – Redis

こんにちは!Redisの世界へようこそ。
データベースの世界では、「データをどこに、どうやって保存するか」がエンジニアの腕の見せ所です。

今回は、Redisの心臓部とも言える永続化設定、その中でも最も重要な`appendfsync`(アペンド・エフシンク)について、徹底的に噛み砕いてお話ししますね。

ここをクリアすれば、Redisのデータ保存の仕組みはバッチリマスターできますよ。肩の力を抜いて、一緒に見ていきましょう!

—

そもそも、Redisってデータをどこに置いているの?

Redisが「超高速」な理由、それはメモリ(RAM)の上でデータをすべて動かしているからです。
メモリは電光石火のスピードで読み書きできますが、弱点があります。それは「電源を切ると、中身がすべて消えてしまう」ということ(揮発性)。

「じゃあ、電源が落ちたらデータが全部消えちゃうの? 困るよ!」
そうですよね。そこでRedisには、メモリ上のデータを安全にハードディスク(またはSSD)に書き出して保存する仕組み(永続化)が用意されています。その仕組みの一つが AOF(Append Only File) という、操作ログをひたすらノートに書き留めていく方法です。

そして、その「ノート(AOFファイル)に書いた内容を、いつ確実にハードディスクのインクで定着させるか」を決めるスイッチが、今回テーマにする `appendfsync` なんです。

—

日常の例えで理解する `appendfsync` の3つのモード

ハードディスクにデータを書き込む作業は、実はOSやコンピュータにとって結構「重い(時間がかかる)」処理です。毎回カチカチとディスクに書きに行っていると、Redisのせっかくのスピードが落ちてしまいます。

そこでRedisは、一度OSの「一時的なメモ帳(カーネルバッファ)」にデータを預けておき、後からまとめてディスクに反映させます。

この「メモ帳から、いかにガッチリとしたディスクへ書き移すか」のポリシーが、以下の3つの設定です。

1. `always`(常に慎重派:絶対にデータを失いたくない!)
2. `everysec`(バランス派:1秒に1回、現実的な落とし所。Redisのデフォルト!)
3. `no`(お任せ派:OSの機嫌にすべてを委ねるスピード狂)

カフェの注文のメモを例に、それぞれの特徴を見ていきましょう。

—

1. `always` —— 「お客さんの注文を1件受けるたび、金庫に鍵をかける」

  • 動き: クライアントから書き込み命令が来るたびに、「今すぐディスクに書き込んで!」とOSに命令します。書き込みが完了するまで、次の処理には進みません。
  • メリット: データの安全性が極限まで高いです。万が一、次の瞬間に停電が起きても、直前のデータまで完璧に残ります。
  • デメリット: ディスクへの書き込みを毎回待つため、Redisの最大の武器である「スピード」がガタ落ちします。SSDの寿命も縮まりやすいです。
  • こんな現場で使う: 金融取引や絶対に1件のデータもロスできない厳格なシステム。

2. `everysec` —— 「1秒に1回、まとめて金庫にしまう」(★デフォルト)

  • 動き: データの書き込み命令はどんどん受け付けますが、ディスクへの定着は「1秒に1回」まとめて行います。
  • メリット: スピードと安全性のいいとこ取り(ベストバランス)です。
  • デメリット: 万が一、停電などの障害が発生したとき、「直近の最大1秒間分のデータ」だけは消えてしまう可能性があります。
  • こんな現場で使う: ほとんどのWebサービスや一般的なシステム。「1秒以内のデータ消失なら、他の仕組みでリカバリーできるからOK」という現場の9割はこれです。

3. `no` —— 「お仕事お疲れ様!あとはOSくんにお任せするよ」

  • 動き: Redisはディスクへの書き込みタイミングを一切コントロールしません。「データはメモ帳に書いたから、あとはOSくんがいい感じのタイミングでディスクに保存しといてね」と丸投げします。
  • メリット: ディスクの書き込み待ちが発生しないため、Redisが発揮できる最高のパフォーマンスが出せます。
  • デメリット: OSが「よし、今だ!」とディスクに書き込む前に電源が落ちると、数秒〜数十秒単位のデータがごっそり消えるリスクがあります。
  • こんな現場で使う: 「最悪データが消えても、元のマスターデータから再構築できるからスピード優先!」という割り切ったキャッシュサーバーなど。

—

設定ファイル(redis.conf)での書き方

実際の現場では、設定ファイルである `redis.conf` の中で以下のように指定します。

永続化ファイルに書き込むタイミングの指定
選択肢: always / everysec / no

appendfsync everysec

たったこれだけの1行ですが、システム全体の運命を左右する非常に重みのある設定です。

—

先輩エンジニアからのアドバイス:迷ったらどうする?

「どれにすればいいか分からないよ……」と迷ったら、まずはRedisが最初から用意してくれているデフォルトの `everysec` を選んでおけば間違いありません。

実務の現場でも、9割以上のシステムで `everysec` が採用されています。「速さ」と「安全性」のバランスが絶妙に保たれている、先人たちの知恵が詰まった黄金律だからです。

もし、システムの規模が大きくなって「最近、書き込みが重いな…」と感じたり、「いや、ここは絶対にお金を動かすシステムだから `always` にしよう」という要件が出てきたら、その時に初めてこの設定を思い出して変更してみてください。

Redisのデータ構造と、この永続化の仕組みが頭の中でつながると、トラブルが起きた時も「あ、ここがボトルネックだな」と冷静に対処できるようになります。

基礎をしっかり押さえたあなたなら、もう大丈夫。自信を持ってRedisを使いこなしてくださいね!

コメント

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