生産中のRedis

戦闘サーバーで使用されるRedisの機能のいくつかについてお話ししたいと思います。 データをディスクに保存する際に代替手段を検討し、障害が発生した場合にさまざまな程度の信頼性を実現できるようにします。 バックアップと監視の構成例も提供されます。 Ubuntu 10.10がインストールされたAmazon EC2でRedis 2.2.11を使用しました。







バックアップ





Redisを使用してカスタムフィードを作成します。 データが失われた場合にすべてのフィードを最初から復旧するにはかなり時間がかかるため、バックアップを作成します。 キャッシュサーバーとしてRedisを使用している場合でも、場合によっては、キャッシュのウォームアップに時間がかかることがあります。 したがって、常にバックアップを作成することをお勧めします。



Redisは、 redis.confの次のパラメーターに基づいてRDBスナップショットを作成します。



save 900 100 save 300 1000 save 60 100000 dir /var/redis/ dbfilename dump.rdb rdbcompression yes
      
      







永続モードにはRDBAOFの 2つがあります。 どちらのモードでも、ディスクに情報を書き込むための非常に信頼性の高い方法が使用され、ハードウェア障害中のデータ損失の状況を実質的に排除することに注意してください。 失われるデータの量は、永続モードの選択にのみ依存します。 RDBを使用すると、このパラメーターを柔軟に調整できますが、平均すると、失敗すると約1時間で失われる可能性があります。 このモードでは、 Redisは最初に完全なデータベーススナップショットを一時ファイルに書き込みますが、ディスクへの書き込みが完了すると、名前が変更されます。 これにより、 rename()システムコールの原子性によるデータ損失がなくなります。



AOFの場合、Redisはクライアントが実行した操作のログを保持し、それらをファイルに書き込みます(デフォルトでは毎秒)。 AOFはAppend Only Fileの略語です。つまり、 Redisはすでに記録されているデータを変更せず、最後に新しいデータのみを追加します。 AOFを使用する場合、 Redisはデフォルトで毎秒ディスクにデータを書き込むため、このモードの使用時に障害が発生した場合に失われる最大値は1秒です。



私たちのプロジェクトでは、1時間のデータを失うことは重要ではないため、 RDBを使用しています。 さらに、最悪の場合、メインのDBMSからデータを回復できます。



Redisの永続性の詳細:



http://redis.io/topics/persistence

http://antirez.com/post/redis-persistence-demystified.html



バックアップには、 Redisをサポートする素晴らしいバックアップgemを使用します。



 # encoding: utf-8 Backup::Model.new(:my_backup, 'My Backup') do split_into_chunks_of 500 database Redis do |db| db.name = "dump" db.path = "/var/redis" db.host = "localhost" db.additional_options = [] db.invoke_save = false end compress_with Gzip do |compression| compression.best = true compression.fast = false end notify_by Mail do |mail| # ... end store_with S3 do |s3| # ... end end
      
      







バックアップごとにディスクに書き込むことでメインのRedisストリームがブロックされないように、configでinvoke_saveを具体的に無効にします。



モニタリング





Monitは監視に使用され、発生するすべてのイベントを通知するように構成されています。 設定は非常に簡単です:



 set mailserver localhost set mail-format { from: monit-app1@example.com } set alert support@example.ru but not on { action pid ppid } check process redis with pidfile /var/run/redis.pid start program = "/usr/bin/redis-server /etc/redis/redis.conf" stop program = "/usr/bin/redis-cli -p 6379 shutdown" group redis
      
      







BGSAVEでメモリ不足





大量のデータが保存されている場合、 RDBスナップショットを使用すると問題が発生する可能性があります。 記録には、 BGSAVEコマンドが使用されます 。これにより、現在のプロセスのフォークが作成され、このフォークでデータがディスクに書き込まれます。 したがって、メインストリームはブロックされず、記録は非同期に行われます。 問題は、UNIXシステムでは、 fork()が呼び出されると、親プロセスが使用するメモリの内容も子プロセスにコピーされることです。 Redisが現在2Gbのメモリを占有し、システムに1Gbの空きメモリしか残っていない場合、 BGSAVEコマンドの実行時に次のエラーが発生する可能性があるとします。



 [18696] 28 Mar 12:26:54#バックグラウンドで保存できません:fork:メモリを割り当てることができません




最新のシステムでは、フォークのメモリをコピーするときに、 Copy on Writeメソッドが使用されます。 メモリは、録音が対応するセクションにある場合にのみコピーされます。 Redisはデータを非同期に保存するためだけにプロセスの分岐を作成します。この分岐はデータをまったく変更しません。 つまり 、システムパラメーターvm.overcommit_memoryを1に安全に設定できます。 /etc/sysctl.confに次の行を追加します



 vm.overcommit_memory = 1
      
      







そして設定を読み直します:



 # sysctl -p
      
      







この問題の詳細:



http://groups.google.com/group/redis-db/browse_thread/thread/dc4876861b174358

Linuxでたくさんの空きRAMがあったとしても、バックグラウンド保存はfork()エラーで失敗します!



All Articles