Redisシリーズの----Redisの2つの持続化機構(RDBとAOF)

6703 ワード

Redisの2つの永続化機構(RDBとAOF)
永続化とは
Redisのデータはメモリに格納されており、メモリのデータはサーバの再起動やダウンタイムとともに存在しなくなり、本番環境ではサーバのダウンタイムが頻繁に発生するため、Redisはメモリから何らかの形でディスクに保存し、再起動時にディスクのファイルレコードをロードしてデータを復元できるようにしたいと考えています.この過程はRedisの持続化である.Redisは2つの永続化機構をサポートし,1つはRDBであり,もう1つはAOFである.RedisはデフォルトでRDB方式で永続化される.2つの永続化は、そのうちの1つを単独で使用してもよいし、両方を組み合わせて使用してもよい.以下、この2つの永続化メカニズムをそれぞれ紹介する.
RDB方式
RDB方式の永続化はスナップショット(snapshotting)方式で行われ、一定の条件を満たすとredisはメモリ内のデータ生成のコピーを自動的にディスクに格納し、このプロセスは「スナップショット」である.Redisは、次のような状況でデータをスナップショットします.
  • 構成規則に従ってスナップショット
  • を自動的に行う.
  • ユーザーはSAVEまたはBGSAVEコマンドを実行する.
  • FLUSHALLコマンドを実行します.
  • コピーを実行する場合.

  • 1)ルールに従ってスナップショット条件をカスタマイズする
    ユーザはスナップショット条件をカスタマイズすることができ、スナップショット条件を満たすとRedisはスナップショット操作をredisで実行する.confプロファイルには、次のような構成と説明があります.
    It is also possible to remove all the previously configured save
    #   points by adding a save directive with a single empty string argument
    #   like in the following example:
    #
    #   save ""
    
    save 900 1
    save 300 10
    save 60 10000
    
    # By default Redis will stop accepting writes if RDB snapshots are enabled
    # (at least one save point) and the latest background save failed.
    # This will make the user aware (in a hard way) that data is not persisting
    # on disk properly, otherwise chances are that no one will notice and some
    # disaster will happen.

    saveコマンドの後ろに2つの数字、saveを追加します.例えば、save 900 1は、900秒以内に1つ以上のキーが変更された場合にスナップショット動作を実行することを示す.
    2)SAVEまたはBGSAVEコマンドの実行
    1、saveコマンドがsaveコマンドを実行するとredisはスナップショット操作を同期して実行し、クライアントからの要求をすべてブロックし、サーバは実行が完了するまで他の処理に応答できない.データ量が小さい場合は、このコマンドで何の違いも感じられないかもしれませんが、データ量が大きい場合は、このコマンドを慎重に使用する必要があります.2、bgasveコマンドbgsaveコマンドを実行すると、redisはバックアップの操作を完了するためにサブプロセスをforkし、redisが他の要求を処理することに影響しません.
    3)FLUSHALLコマンドの実行
    FLUSHALLコマンドを実行すると、Redisはデータベース内のすべてのデータを消去します.データベースを空にするプロセスが自動スナップショット条件をトリガーしたかどうかにかかわらず、スナップショット条件が存在する限り、スナップショット操作を実行します.スナップショット条件がない場合、FLUSHALLはスナップショットを実行しません.
    4)複製実行時
    マスタスレーブモードが設定されている場合、Redisはレプリケーション初期化時に自動スナップショットを行い、自動スナップショット条件が設定されていない場合でもスナップショット操作を実行します.
    保存パス:Redisのデフォルトでは、現在のプロセスの作業ディレクトリにスナップショットファイルが保存されます.rdbファイルでは、dirとdbfilenameの2つのパラメータを構成することで、スナップショットファイルの格納パスとファイル名をそれぞれ作成できます.例えばredis.confファイルの構成とコメント:
    # The filename where to dump the DB
    dbfilename dump.rdb
    
    # The working directory.
    # DB  dbfilename             ,
    # The DB will be written inside this directory, with the filename specified
    # above using the 'dbfilename' configuration directive.
    # Note that you must specify a directory here, not a file name.
    dir ./

    スナップショットの実行
  • Redisはfork関数を使用して現在のプロセス(親プロセス)のコピー(サブプロセス)をコピーします.
  • 親プロセスはクライアントからの要求を引き続き受け入れ、サブプロセスはメモリ内のデータをハードディスク(HDD)の一時ファイルに書き込むことを開始する.
  • サブプロセスの書き込みが完了すると、古いrdbファイルがその一時ファイルに置き換えられます.

  • redisは、スナップショットの実行中にRDBファイルを変更することはなく、スナップショットの終了後に置き換えられます.従って、RDBファイルは、通常、Redisのデータバックアップを実現するためにも使用され、RDBファイルは圧縮されたバイナリフォーマットであるため、メモリ内のデータよりもスペースが小さい.
    Redisが起動するとRDBファイルが読み込まれ、ディスクからメモリにデータがロードされます.通常、1000万文字列のタイプキーが記録された1 GBのスナップショットファイルをメモリにロードするのに20~30秒かかります.ロード時間はサーバのパフォーマンスやRedisのデータ構造によって異なります.
    RDBの長所と短所:1大規模なデータ復旧に適している.2ビジネスがデータ整合性と一貫性に対する要求が高くない場合、RDBは良い選択です.
    欠点:1データの整合性と一貫性は高くありません.RDBは最後のバックアップでダウンタイムになる可能性があります.2バックアップ時にメモリを使用します.Redisはバックアップ時に独立してサブプロセスを作成し、一時ファイルにデータを書き込み(メモリのデータは元の2倍ですよ)、最後に前のバックアップファイルを一時ファイルに置き換えます.
    AOF方式
    プロセス終了によるデータ損失のリスクを低減するために、RedisはAOF方式で永続化を提供し、AOFはRedisが実行する各コマンドをハードディスクファイルに追加することができ、このプロセスはredisの性能を低下させるが、データの安全性からこの影響は許容できる.
    AOFファイルの保存アドレスはRDBファイルの場所と同じで、dirパラメータによって設定され、デフォルトファイル名はappendonlyである.aof. 次のようになります.
    appendonly no
    
    # The name of the append only file (default: "appendonly.aof")
    
    appendfilename "appendonly.aof"
    

    デフォルトでは、RedisはAOFをオンにすることなく、redisを変更することができる.confプロファイルのappendonlyパラメータはyesで起動します.
    aofファイルがまだ生成されていない場合は、コマンド設定を使用します../redis-cli config set appendonly yes
    aofファイルが開くのは、次のとおりです.
    *2
    $6
    SELECT
    $1
    0
    *3
    $3
    SET
    $3
    age
    $2
    28
    *3
    $3
    SET
    $2
    cc
    $2
    vv

    AOFファイルにはRedisの実行命令が純テキスト形式で記録する、AOFファイルの内容はRedisクライアントがRedisに送信元の通信プロトコルの内容であり、同じkeyに対して複数回の付与操作を行うとaofもこれらの命令を記録するが、実際には最後の値だけを記録することを望んでいるため、Redisはredisにある.confファイルには、AOFファイルを自動的に書き換えるためのパラメータが用意されています.
    #     AOF            AOF              
    auto-aof-rewrite-percentage 100
    #      AOF   AOF    
    auto-aof-rewrite-min-size 64mb

    Redisは起動時にAOFファイルのコマンドを1つずつ実行してハードディスク(HDD)のファイルをメモリに書き込むため、読み込み速度が比較的遅い.
    
    # The fsync() call tells the Operating System to actually write data on disk
    # instead of waiting for more data in the output buffer. Some OS will really flush
    # data on disk, some other OS will just try to do it ASAP.
    #
    # Redis supports three different modes:
    #
    # no: don't fsync, just let the OS flush the data when it wants. Faster.
    # always: fsync after every write to the append only log. Slow, Safest.
    # everysec: fsync only one time every second. Compromise.
    # The default is "everysec", as that's usually the right compromise between
    # speed and data safety. It's up to you to understand if you can relax this to
    # "no" that will let the operating system flush the output buffer when
    # it wants, for better performances (but if you can live with the idea of
    # some data loss consider the default persistence mode that's snapshotting),
    # or on the contrary, use "always" that's very slow but a bit safer than
    # everysec.
    #
    # More details please check the following article:
    # http://antirez.com/post/redis-persistence-demystified.html
    #
    # If unsure, use "everysec".
    
    # appendfsync always
    appendfsync everysec
    # appendfsync no

    次の説明に注意してください.
    The fsync() call tells the Operating System to actually write data on disk
    # instead of waiting for more data in the output buffer. Some OS will really flush
    # data on disk, some other OS will just try to do it ASAP.

    データベースコンテンツの操作を変更するたびに、redisはAOFファイルに更新を記録しますが、オペレーティングシステムのキャッシュメカニズムのため、データは実際にディスクに書き込まれず、システムのハードディスクキャッシュに入ります.デフォルトでは30秒ごとに同期動作が実行されますが、この30秒以内にシステムが異常になるとハードディスクキャッシュ内のデータが失われます.AOFコマンドを使用するのは、データの損失を最小限に抑えるためです.そのため、redisはappendfsyncパラメータを提供して同期メカニズムを設定します.デフォルトではeverysecが使用されます.つまり、1秒に1回の同期操作を実行し、キャッシュからディスクにデータを更新します.Alwaysは、書き込みを実行するたびに同期操作が実行されることを示します.これは最も遅く、最も安全な方法です.Noは、アクティブに実行しないことを示し、オペレーティングシステムに渡して実行します.これは最も安全ではありません.一般的にシステム性能を両立させ、everysec方式を使えばよい.
    利点:データの整合性と一貫性がより高い欠点:AOF記録の内容が多いため、ファイルはますます大きくなり、データ回復もますます遅くなる.
    RDBとAOFは同時に存在することができ、これによりデータのセキュリティが保証され、バックアップ操作が容易になり、RedisはAOFファイルを使用してデータを復元することができる.AOFの方法で失われたデータを永続化することはより少ないからである.
    参考書:『Redis入門ガイド』