Redis持続化メカニズム

3687 ワード

テキストリンク:https://www.cnblogs.com/justinli/p/10810297.html
Redisは2つの方式の持続化をサポートし,1つはRDB方式,1つはAOF方式である.どちらかを単独で使用したり、両方を組み合わせて使用したりすることができます.
一、RDB
RDB方式の永続化はスナップショットによるものである(snapshotting)が完了すると、Redisは、一定の条件を満たすと、メモリ内のすべてのデータを自動的にスナップショットしてハードディスクに格納します.スナップショットを行う条件は、ユーザがプロファイル内でカスタマイズすることができ、時間と変更されたキーの個数の2つのパラメータから構成されます.指定された時間内に変更されたキーの個数が指定された数値より大きい場合、スナップショットが行われます.RDBはRedisのデフォルトで採用されている永続化方式であり、プロファイルにはすでに3つの条件が予め設定されている.
save 900 1

save 300 10

save 60 10000

saveパラメータは、スナップショット条件を指定します.複数の条件が存在し、条件間は「または」の関係です.
上述したように、save 900 1は、15分(900秒)以内に少なくとも1つのキーが変更された場合にスナップショットを行うことを意味する.自動スナップショットを無効にするには、あるsaveパラメータを削除するだけでよい.
Redisはデフォルトでスナップショットファイルを現在のディレクトリのdumpに格納する.rdbファイルでは、dirとdbfilenameの2つのパラメータを構成して、スナップショットファイルの格納径とファイル名をそれぞれ指定できます.
スナップショットを実現するメカニズムの流れは次の通りです.
(1)Redisはfork関数を使用して現在のプロセス(親プロセス)のコピー(サブプロセス)をコピーする.
(2)親プロセスはクライアントからのコマンドを受信して処理し続け、サブプロセスはメモリ内のデータをハードディスク内の一時ファイルに書き込むことを開始する.
(3)サブプロセスがすべてのデータを書き込むと、古いRDBファイルがその一時ファイルに置き換えられ、このスナップショット操作が完了する.
forkが実行されると、オペレーティングシステム(クラスUnixオペレーティングシステム)は書き込み時レプリケーション(copy-on-write)ポリシーを使用します.すなわち、fork関数が発生した瞬間に親子プロセスが同じメモリデータを共有し、親プロセスがデータを変更するときに(書き込みコマンドが実行される場合)オペレーティングシステムは、そのスライスデータをコピーしてサブプロセスのデータが影響を受けないようにするため、新しいRDBファイルにはforkを実行するためのメモリデータが格納されている.自動スナップショットのほか、SAVEまたはBGSAVEコマンドを手動で送信してRedisにスナップショットを実行させることもできる.2つのコマンドの違いは、前者はメインプロセスによるスナップショット操作であり、ブロックされることである他のリクエストに泊まり、forkサブプロセスでスナップショット操作を行います.
RDB方式で永続化を実現し、Redisが異常終了すると、最後のスナップショット以降に変更されたすべてのデータが失われ、必要に応じてスナップショットの自動保存時間を設定する必要があります.
 
 
二、AOF
デフォルトではRedisはAOF(append only file)方式の持続化をオンにせず、appendonlyパラメータで
オン:
appendonly yes
AOF永続化をオンにすると、Redisのデータを変更するコマンドが実行されるたびに、Redisはそのコマンドをハードディスク(HDD)のAOFファイルに書き込みます.[書き込みデータのみの命令]AOFファイルの保存場所はRDBファイルの場所と同じで、dirパラメータによって設定されており、デフォルトのファイル名はappendonlyである.aof,appendfilenameパラメータで修正できる:appendfilename appendonly.aof
 
実行されるコマンドが多くなるにつれて、AOFファイルのサイズも大きくなり、メモリ内の実際のデータがあまりない場合でも、一定の条件に達するたびにRedisはAOFファイルを自動的に書き換えます.
auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

Autoaof-aof-rewrite-percentageパラメータの意味は、現在のAOFファイルサイズが前回の書き換え時のAOFファイルサイズの何パーセントを超えると書き換えが再開され、以前に書き換えたことがない場合は、起動時のAOFファイルサイズに基づいています.Autoaof-aof-rewrite-min-sizeパラメータは、書き換えを許可する最小のAOFファイルサイズを制限し、通常、AOFファイルが小さい場合、冗長なコマンドが多くてもあまり関心を持っていません.Redisが自動的に書き換えを実行するほか、BGREWRITEAOFコマンドを使用してAOF書き換えを手動で実行することもできます.
 
AOFは、データベースの内容を変更する操作を実行するたびにAOFファイルにコマンドを記録するが、実際には、オペレーティングシステムのキャッシュメカニズムのため、データがハードディスクに実際に書き込まれるのではなく、システムのハードディスクキャッシュに入る.デフォルトでは、システムは30秒ごとに同期操作を実行し、ハードディスクキャッシュの内容をハードディスクに実際に書き込みます.この30秒の間にシステムが異常に終了すると、ハードディスクキャッシュのデータが失われます.一般的にAOF永続化を有効にするアプリケーションでは、このような損失は許容できません.これは、RedisがAOFファイルに書き込みた後、システムにキャッシュ内容をハードディスクに同期するようにアクティブに要求する必要があります.Redisでは、appendfsyncパラメータを使用して同期のタイミングを設定できます.
# appendfsync always

appendfsync everysec

# appendfsync no

デフォルトでは、Redisはeverysecルールを使用します.つまり、同期操作は1秒に1回実行されます.Alwaysは、書き込みを実行するたびに同期を実行することを示します.これは最も安全で最も遅い方法です.Noは、同期操作をアクティブに行わないで、オペレーティングシステムに完全に任せる(すなわち30秒ごとに行う)ことを示す.これは最も速いが最も安全ではない方法である.一般的にはデフォルト値everysecを使用すれば十分であり、性能と安全を両立させることができる.
Redisでは、AOFとRDBを同時にオンにすることができ、データのセキュリティが保証され、バックアップなどの操作が容易になります.このときRedisを再起動すると、AOF方式の永続化で失われる可能性のあるデータがより少ないため、AOFファイルを使用してデータを復元します.
 
まとめ
AOF(Append only file)は、redisのすべての変更(増加、削除、変更)操作をログファイルに追加します.メリット:比較的安全で、redisがダウンタイムしても、元のデータのデメリットを迅速に復元できます:redisの性能RDBメモリスナップショットに影響し、redisで設定できます
save 900 1(900 s内で1回のredis操作で1回の持続化)save 300 10(300 s内で10回のredis操作で1回の持続化)save 60 10000(60 s内で10000回のredis操作で1回の持続化)メリット:性能的にaofより多くのデメリットがある:データ損失がある可能性がある.例えば、11:05分に1回持続化し、redisが11:04に死んだら、この4分間のデータは失われます.