Table Of Contents

Previous topic

サーバプログラム

Next topic

レプリケーションの設定方法

This Page

追記専用ファイルモード

一般的な情報

追記専用ファイルは、Redisを強固にするオプションです。意味が分からない?では、一緒に観ていきましょう:

標準のRedisでは、データセットをDiskにバイナリでdump.rdbに保存します(初期設定の場合)。データセットに対して、60秒で100回変更が有った時、もしくわ1000秒で1回変更があった時にファイルに保存します、この設定は変更することも出来ます。この動作を”Snapshotting”と呼びます。

Snapshottingは、堅牢性が高いとは言えません。もし、あなたのPCでReidsが動いている最中に電源コードが抜けたら? もし、間違って”killall -9 redis-server”を間違って実行してしまったら?Redisに保存されている最新のデータセットは失われてしまいます。これは、アプリ側に取ってはうれしい話ではありません。There are applications where this is not acceptable and Redis was not an option for this applications.

その問題を解決する為に、Snapshottingに追記専用ファイルを使用します。使うためには?

  • Ver.1.1のみで使用できます。
  • 設定ファイルで、” appendonly yes”の項目を有効化します。
  • Redisがコマンドを受け取るたびにすべてのコマンドをファイルに追記していきます。Redisを再起動した場合には、コマンドをすべてリプレイしデータセットの状態をリビルドします。

ログの書き換えについて

データセットに変更があるたびに追記すると、ご想像の通りログファイルはドンドン大きくなります。”mykey”というキーにバリューを‘1’, ‘2’, ‘3’....と増やし提起‘100000000000’まで増やしていったときログファイルは数バイトですみます。

Redisは興味深い機能を持っています。追記型のログファイルのリビルドは、クライントからのコマンドプロセスを停止させずにバックグラウンドで動作います。

時間が経つに連れLogがドンドン大きくなってきます。たまにリビルドを行うことで安全に古いログを保管できます。(ただし、Ver1.1のベータの機能で提供されています)

ちょっと待って。でもどうやって使うの?

基本的に、Snapshottingはいつもcopy-on-writeと同じような挙動をとります。

  • Redisは、親要素と子要素をフォークします。
  • テンポラリーファイルの子要素に新規のログを追加します。
  • メモリー内で親要素はすべての新規子要素を集めます。
  • 子要素が集まったらファイルを書き換えます。親要素は書き換え完了を受け取るとメモリー内で子要素がファイルに書き込み完了したことを記録します。
  • プロフィット!: Redisは、古いファイルと新しいファイルのリネーム作業などをすべて自動で行ないます。

追記専用ログファイルを使うとどれくらい安全?

redis.confを見てみよう。あなたはいつでもコンフィギュレーションを変更できます、fsync()に関しては、3つのオプションがあります。

  • Fsync() evry time は、すべてのコマンドをログファイルに追記していきます。とてもとても遅いですが、とても安全です。
  • Fsync() one time は、毎秒毎にログファイルに追記していきます。十分に高速に動作します。最悪1秒間のデータが失われます。
  • Never Fsync() 標準のOSのファイルシステムで保存するモノです。最高に速いですが安全ではありません。

デフォルトの設定では”毎秒”が設定されています。それは、スピードと安全性でバランスの取れた設定です。”always”オプションはとても遅いのです。Redis2.0では、より速い実装が予定されています。

もし不正動作に見舞われたら?

無いとは言えません。追記専用ファイルの書き込み時にサーバがクラッシュして、Redisで読み込み不能なファイルが作成された場合などです。もしこのような事態になった場合は以下の手順を試してください。

  • 追記専用ファイルのバックアップコピーを作成してください。
  • オリジナルファイルに対してフィックスをかけます。
./redis-check-aof --fix <filename>
  • フィックスしたオリジナルファイルとバックアップファイルの2つでDiffを取り差分をチェックしてください。
  • フィックスしたファイルでサーバをリスタートしてください。