redis永続性の使用に関する簡単な説明

I.概要

Redis永続性は、メモリデータをハードディスクに保存することです。Redis永続ストレージは、AOFとRDBの2つのモードに分けられ、RDBはデフォルトで有効になっています。


二、RDB持久化

RDBは、特定の時点で一時ファイルdump.rdbにデータを書き込みます。永続性が終了した後、この一時ファイルを使用して、最後に永続化されたファイルを置き換え、データを回復し、バイナリファイルを保存に使用します。

2.1特徴
1)利点

  • 永続性のために別個の子プロセスを使用すると、メインプロセスはIO操作を実行せず、redisの高いパフォーマンスを保証します。

2)デメリット

  • RDBは一定の間隔で永続化されます。永続化中にredisが失敗すると、データが失われます。

上記の2つの特性を説明することで、RDB永続化方式がデータ要件が厳密でない場合の使用に適していることがわかります。

データが一時ファイルに書き込まれる時点は、構成によって決定できます。Redisは、n秒以内にm個を超えるキーが変更された場合にRDB操作を実行するように構成されます。この操作は、この時点でのredisのすべてのデータとデータのスナップショットを保存するのと似ています。したがって、永続化メソッドはスナップショットとも呼ばれます。

2.2オープン方法
RDBはデフォルトで有効になっており、redis.confの構成パラメーターは次のとおりです。

#dbfilename:持久化数据存储在本地的文件
dbfilename dump.rdb

#dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下
dir ./

##snapshot触发的时机,save    
##如900秒后,至少有一个变更操作,才会snapshot  
##对于此值的设置,需要谨慎,评估系统的变更操作密集程度  
##可以通过"save """来关闭snapshot功能  
#save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1
save 300 10
save 60 10000

##当snapshot时出现错误无法继续时,是否阻塞客户端"变更操作","错误"可能因为磁盘已满/磁盘故障/OS级别异常等  
stop-writes-on-bgsave-error yes  

##是否启用rdb文件压缩,默认为"yes",压缩往往意味着"额外的cpu消耗",同时也意味这较小的文件尺寸以及较短的网络传输时间  
rdbcompression yes

save 900 1の意味は、時間が900秒に達したときに、redisデータが少なくとも1回変更された場合、bgsaveが実行されます。save30010とsave 6010000は同じです。3つの保存条件のいずれかが満たされると、bgsaveが呼び出されます。

2.3
savemnの実現原理Redissave mnは、serverCron関数、ダーティカウンター、およびlastsaveタイムスタンプによって実現されます。

serverCronは、Redisサーバーの定期的な操作関数であり、デフォルトでは100ミリ秒ごとに実行されます。この関数は、サーバーのステータスを維持します。タスクの1つは、保存mn構成の条件が満たされているかどうかを確認することです。 bgsaveを実行します。

ダーティカウンターは、R​​edisサーバーによって維持される状態であり、bgsave / saveコマンドの最後の実行後、サーバーの状態が変更された回数(追加、削除、変更を含む)、およびsave / bgsaveの実行時刻を記録します。が完了すると、ダーティは0にリセットされます。

たとえば、Redisがset mykey helloworldを実行すると、ダーティ値は+1になります。saddmysetv1v2 v3を実行すると、ダーティ値は+3になります。dirtyは、サーバーによって行われた変更の数を記録します。クライアント。データを変更するコマンドの数。

lastsaveタイムスタンプは、Redisサーバーによって維持される状態でもあり、save / bgsaveが最後に正常に実行された時刻を記録します。

save mnの原則は次のとおりです。100msごとにserverCron関数を実行します。serverCron関数では、1つの条件が満たされている限り、savemn構成の保存条件をトラバースします。bgsaveが実行されます。保存mn条件ごとに、次の2つの条件のみが同時に満たされます。

(1)現在の時間-最後の保存> m

(2)ダーティ> = n

2.4 bgsave実行プロセス
ここに画像の説明を挿入
ステップ分析
(1)Redis親プロセスは、最初に、現在saveを実行しているか、bgsave / bgrewriteaofの子プロセスを実行しているかを判断します。実行中の場合、bgsaveコマンドは直接戻ります。bgsave / bgrewriteaofの子プロセスは、主にパフォーマンスの考慮事項に基づいて同時に実行することはできません。2つの同時子プロセスが同時に多数のディスク書き込み操作を実行するため、重大なパフォーマンスの問題が発生する可能性があります。
(2)親プロセスはfork操作を実行して子プロセスを作成します。このプロセスの間、親プロセスはブロックされ、Redisはクライアントからコマンドを実行できません。
(3)親プロセスがフォークした後、bgsaveコマンドは「バックグラウンド保存が開始されました」というメッセージを返し、親プロセスをブロックしなくなり、他のコマンドに応答できるようになります。
(4)子プロセスは、RDBファイルを作成し、親プロセスのメモリスナップショットに基づいて一時スナップショットファイルを生成し、完了後に元のファイルをアトミックに置き換えます。
(5)子プロセスは、完了を示すシグナルを親プロセスに送信し、親プロセスは統計を更新します。

注:RDBモードを使用すると、次の2つのシャットダウンモードの効果が異なります
。1)redis-cliを直接シャットダウンし、シャットダウン後にdump.rdbを更新します。これは、メモリにredisプロセスが残っているため、自動的に行われます。シャットダウン時にバックアップされます
。2)ただし、プロセスを直接強制終了するか、直接シャットダウンすると、redisがメモリから消えたため、redisはdump.rdbを更新しません。


3、AOFの永続性

AOF(追加専用ファイル)の場合、フォーマット指示により操作ログファイルの末尾に「操作+データ」を追加します。追加操作が戻った後(ファイルに書き込まれた、または書き込まれる予定)、実際のデータが実行されます。変更すると、「ログファイル」はすべての履歴操作を保存します。サーバーでデータ回復が必要な場合は、このログファイルを直接再生して、すべての操作を復元できます。

AOFは比較的信頼性が高く、mysqlのbin.log、apache.log、およびzookeeperのtxn-logに似ています。AOFファイルの内容は文字列であり、非常に読みやすく、解析も簡単です。

3.1特徴
1)利点

  • より高いデータ整合性をサポートできます。ファイルを追加する時間が1秒に設定されている場合、redisが失敗すると、最大で1秒のデータが失われます。ログの書き込みが不完全な場合、ログの修復でredis-check-aofがサポートされます。aofファイルは書き換えられません。 before(ファイルが大きすぎる)コマンドはマージされて書き換えられることがあります)、これらのコマンドの一部は削除できます(誤って操作されたflushallなど)。

2)デメリット

  • AOFファイルはRDBファイルよりも大きく、回復速度は遅くなります。

私たちは簡単に考えることができます:

  • AOFファイルはログファイルであり、このファイルは「変更操作」(set、delなど)のみを記録します。
  • サーバーで多数の変更操作が続行されると、AOFファイルが非常に大きくなります。つまり、サーバーに障害が発生した後、データ回復プロセスが非常に長くなります。
  • 実際、データに複数の変更を加えると、複数のAOFレコードが生成されます。実際、AOFの永続性には「AOFの書き換え」が伴うため、現在の状態が保存されている限り、履歴操作レコードを破棄できます。

AOFの特性により、比較的安全であることがわかります。データ損失が少ないと予想される場合は、高AOFモードを使用できます。AOFファイルの書き込み中にサーバーに突然障害が発生した場合、ファイルの最後のレコードが不完全である可能性があります。不完全なレコードを手動またはプログラムで検出して修正できるため、AOFファイルを介した回復は正常です。同僚は次のことを行う必要があります。 redis永続化メソッドにAOFがある場合は、サーバーに障害が発生した後に再起動する前に、AOFファイルの整合性を確認する必要があります。

3.2開く方法
AOFはデフォルトで閉じられており、redis.conf構成ファイルを変更することで開くことができます

##此选项为aof功能的开关,默认为"no",可以通过"yes"来开启aof功能  
##只有在"yes"下,aof重写/文件同步等特性才会生效  
appendonly yes  
 
##指定aof文件名称  
appendfilename appendonly.aof  
 
##指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec  
appendfsync everysec  
##在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示"不暂缓","yes"表示"暂缓",默认为"no"  
no-appendfsync-on-rewrite no  
 
##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认"64mb",建议"512mb"  
auto-aof-rewrite-min-size 64mb  
 
##相对于"上一次"rewrite,本次rewrite触发时aof文件应该增长的百分比。  
##每一次rewrite之后,redis都会记录下此时"新aof"文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后  
##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。  
auto-aof-rewrite-percentage 100

一部の属性は、
AOFがファイル操作であることを示しています。集中的な変更操作を行うサーバーの場合、ディスクIOの負荷が増加します。さらに、Linuxはファイル操作に「遅延書き込み」方式を採用しています。すべての書き込み操作が実際のハードディスク操作をトリガーするわけではありませんが、バッファーに入ります。バッファーデータがしきい値に達すると、実際の書き込みがトリガーされます(他のタイミングがあります)。 。これはLinuxによるファイルシステムの最適化ですが、隠れた危険ももたらします。バッファがディスクにフラッシュされない場合、物理マシンに障害が発生し(電源障害など)、最後の1つ以上のAOFレコードが失われました。

上記の構成ファイルから、redisが3種類のAOFレコード同期オプションを提供していることがわかります。

  • 常にすべてのaofレコードは、ファイルにすぐに同期されます。これが最も安全な方法です。同時に、より多くのディスク操作とブロッキング遅延が必要であり、IOオーバーヘッドが大きくなります。
  • everysec1秒1回同期します。パフォーマンスとセキュリティは比較的中程度であり、redisの推奨方法でもあります。物理的な障害が発生した場合、最後の1秒間にAOFレコードが失われる可能性があります(部分的な損失の可能性があります)。
  • no:Redisはファイル同期を直接呼び出しませんが、それを処理するためにオペレーティングシステムに渡しますオペレーティングシステムは、バッファの充填状況やチャネルのアイドル時間などに応じて同期をトリガーできます。これは一般的なファイル操作方法です。パフォーマンスが向上します。物理サーバーに障害が発生した場合、データ損失の量はOS構成に関連します。

AOFファイルは増大し続け、そのサイズは「障害回復」時間に直接影響し、AOFファイルの履歴操作は破棄できます。
AOF書き換え操作は、AOFファイルを「圧縮」するプロセスです。もちろん、redisは「元のAOFファイル」方式を使用して書き換えを行いませんが、スナップショットのような方式を採用します。コピーオンライトに基づいて、メモリ内のデータ、そしてaofファイルに1つずつシーケンスします。
したがって、AOF書き換えは、メモリデータの現在の状態を正しく反映できます。これは、まさに必要なものです。
書き換えプロセス中、新しい変更は元のAOFファイルに書き込まれ、これらの新しい変更もredisによって収集されます(バッファー、コピーオンライト、最も極端な場合はすべてです。この期間中にキーが変更されます。これはメモリの2倍を消費します)メモリデータが新しいAOFファイルに書き込まれた後、収集された新しい変更も新しいAOFファイルに追加されます。新しいaofファイルの名前はappendonly.aofに変更され、以降のすべての操作が行われます。新しいaofファイルに書き込まれます。リライト処理中に障害が発生しても、元のAOFファイルの通常の作業には影響しません。リライト処理は比較的信頼性が高いため、ファイルはリライトが完了した後にのみ切り替えられます。

リライトをトリガーするタイミングは構成ファイルを介して宣言でき、bgrewriteaofコマンドを使用してredisに手動で介入できます。

redis-cli -h ip -p port bgrewriteaof

リライト操作/レコード同期/スナップショットはすべてディスクIOを消費するため、redisは「スケジュール」戦略を採用しています。「手動介入」であろうとシステムトリガーであろうと、スナップショットとリライトを1つずつ実行する必要があります。

AOF書き換えプロセスは、クライアント要求をブロックしません。システムは子プロセスを開始して完了します。


第四に、RDBとAOFの違い

1)AOFはより安全で、よりタイムリーにデータをファイルに同期できます。ただし、AOFはより多くのディスクIO費用を必要とします。AOFファイルサイズは大きく、ファイルコンテンツの回復データは比較的低速です。
2)RDBのセキュリティは不十分です。通常の期間中のデータバックアップとマスタースレーブデータの同期最適な方法です。ファイルサイズが小さく、データ回復が高速です。

選択戦略
1)適切に構造化された環境では、マスターは通常AOFを使用し、スレーブはRDBを使用します。その理由は、マスターが最初にデータの整合性を保証し、それがデータバックアップの最初の選択肢であるためです。スレーブは読み取り専用サービスを提供します。 、主な目的は、顧客の読み取り要求の終了に迅速に対応することです。

2)ネットワークの安定性が悪い/物理環境が悪い場合は、マスターとスレーブの両方でAOFを採用することをお勧めします。マスターとスレーブの役割を切り替えると、手動データバックアップ/手動ガイドデータリカバリの時間コストが減少。

3)環境内のすべてが非常に良好で、サービスが集中的な書き込み操作を受け取る必要がある場合は、マスターがRDBを採用し、スレーブがAOFを採用することをお勧めします。

Q:redisがダウンすると、redisの値は消えますか?
しない。RedisはデフォルトでRDBストレージをオンにします。
RDBの永続性では、redisの値は特定の時間に特定の変更量に達した場合にのみdump.rdbに永続化されますが、切断後、dump.rdbは自動的に更新され[ない場合は生成]、自動バックアップを実現します。プロセスを直接強制終了したり、サービスを直接シャットダウン/再起動したりすると、データが失われる可能性があることに注意してください。この場合、dump.rdbは自動的にバックアップされません。

おすすめ

転載: blog.csdn.net/locahuang/article/details/110921036