redisの持続化


Redisは高性能のkey-valueのストレージシステムで、データはすべてメモリの中に存在して、もし突然ダウンタイムしたら、データはすべて消えて、だからredisは1種の持続化のメカニズムを提供して、データが故障のために失われないことを保証します.
目次
永続化メカニズム
1.RDBモード:
rdbモードのバックアップがいつ発生するか
2.AOFモード
aofファイルをどのように処理しますか?
オペレーティングシステムのCOWメカニズム
永続化メカニズム
  • RDBモード(スナップショット):メモリのデータをバイナリシーケンス化してディスクにコンパクトに格納する方法です.
  • AOFモード:インクリメンタルログ、redisのメモリ修正命令が記録されています.

  •  
    1.RDBモード:
    redisがdumpを保存する必要がある場合.rdbファイルの場合、サーバは以下の操作を行います.
  • redisは、スナップショットの永続化を処理するために使用されるサブプロセスをforkします.メモリのデータ
  • は変更されません.
  • 親プロセスはクライアントの命令を受け続け、メモリデータを修正するが、オペレーティングシステムのCOWメカニズムを運用し、サブプロセス
  • に影響を与えない.
  • サブプロセスは、一時的なdumpにデータを書き込むだけである.rdbファイル
  • サブプロセスが完了すると、新しいrdbファイルが以前のrdbファイル
  • に置き換えられる.
     
    rdbモードのバックアップがいつ発生するか
    save 900 1
    save 300 10
    save 60 10000
  • 自動:デフォルトではredis.confファイルでは、redisの構成は900秒ごとに更新され、300秒ごとに10回更新されるか、60秒ごとに10000回更新されると自動的にrdbのバックアップがあります.
  • プロアクティブ:クライアントがrdbバックアップをプロアクティブに開始
  • save命令:クライアントのメインプロセスをブロックし、このときクライアントの要求
  • を処理できない.
  • bgsave命令:バックグラウンドfork 1つのプロセスはバックアップを処理し、メインプロセスをブロックせず、クライアント要求
  • を処理することができる.

     
    2.AOFモード
    aofはログ形式でクライアントの修正命令をファイルに書き込み,更新を失うことを防止するためmysqlのようなメカニズムで命令を先にパラメータペアリングし,エラーがなければ命令をaofログに先に書き込み,その後メモリのデータを修正する.
    redisでconfのファイルには、次のようなaof構成があります.
    appendonly yes  ##   aof    
    # appendfsync always ##             
    appendfsync everysec ##           
    # appendfsync no ##                       
    
    

    厳密に言えば、aof書き込みログはまずオペレーティングシステムのキャッシュに命令を書き込むもので、linuxはfsync関数を提供し、fsync関数はキャッシュを強制的にディスクをリフレッシュすることを指定することができ、性能に影響を与えるが、結局ディスクIOは相対的に遅いので、appendfsyncの設定はあなたのredisの持続化とredisの性能に影響を与える.
     
    aofファイルをどのように処理しますか?
  • 自動:redisのプロファイルredis.confにはaofファイルの書き換えを構成する関連構成
  • がある.
    auto-aof-rewrite-percentage 100 ##       aof       ,                    
    auto-aof-rewrite-min-size 64mb ##     rdb            ,          
  • アクティブ:クライアントはrewriteaofコマンドを送信し、aofファイルを圧縮します.実際には、複数のマージ可能なコマンドを1つにし、データ結果に影響を与えません.

  •  
    最後にredisが再起動すると、rdbのファイルの内容が先にロードされます.結局、rdbファイルは一定期間のフルバックアップであり、ロード後にaofログファイルが読み込まれ、データの一致と損失がないことを保証します.
     
    問題外:
    オペレーティングシステムのCOWメカニズム
    書き込み時のレプリケーション(Copy-on-write)は、複数のプロセスがメモリデータを共有し、あるプロセスが修正する必要がある場合にのみ、変更のためにコピーがコピーされ、他のプロセスが読み取ったデータは変更されません.だからredisのrdbモードのバックアップ、forkは1つのサブプロセスで、親プロセスはサブプロセスと1部のデータを共有して、親プロセスが修正する必要がある時だけ、メモリデータを1部コピーして修正に供して、サブプロセスが見たメモリデータは変わらないで、引き続きメモリデータを2進圧縮してディスクファイルに書きます.