Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Redisととあるシステム

9,992 views

Published on

  • Be the first to comment

Redisととあるシステム

  1. 1. Redisととあるシステムでの実例
  2. 2. 今日話すこと• Redisについて• とあるシステムで問題になっていること• いろいろ検証してみたこと
  3. 3. Redisってなに?• Cで書かれた高速なKVS• オンメモリなので超高速• 非同期でディスクにも書き出す(永続化機能)• 文字列以外にも、文字列のリストなどが利用 できる• マスター・スレーブによるレプリケーション機 能• 最新バージョンは「2.4.xx(2.4)系」
  4. 4. 文字列データの登録文字列データを登録します。set [キー] [値]値に指定可能な文字列の上限は1GB(1073741824bytes)です。redis> set key_t value_tOKこれで「key_t」というキーで「value_t」という値が登録されたことになります。
  5. 5. 文字列データの取得キーを指定して、データを取得します。get [キー]戻り値は、指定したキーが存在する場合は値、キーが存在しない場合はnilが返されます。redis> get key_t"value_t“redis> get key_a(nil)
  6. 6. その他のデータ• リスト• ハッシュなどなど・・・興味ある方はWEBで検索してください(^^;)
  7. 7. データの永続化• 定期的にメモリ上のデータセットのスナップショッ トをファイル(.rdb)にダンプ• 再起動時にはこのスナップショットの内容をメモ リに読み込むことにより,前回ダンプした状態ま でデータセットを復元• ただし、最後にダンプしてからクラッシュするまで の更新内容は消えてしまう(><) ↓追記専用ファイルモードで損失を抑えることができる
  8. 8. 追記専用ファイルモード• すべての更新コマンドをファイル(Append Only File)に随時追記• 再起動時にこれらのコマンドを再実行することにより,データを復元!Append Only File(AOF)$ ls -l-rw-r--r-- 1 cy_redis cy_redis 732 3月 29 14:10 appendonly.aof ただし、AOFの更新コマンドログが増加していくとパフォーマンスが落ちる(らしい) ↓ この回避として「 BGREWRITEAOF 」がある!
  9. 9. BGREWRITEAOF• AOFファイルをリビルドして、 AOFの中身を再 構成する ↓ この「 BGREWRITEAOF 」を定期実行することにより、パフォーマンス低下を防ぐ
  10. 10. とあるシステムでは?• Redisサーバは約20数台以上いる(らしい)• サーバのメモリは24GB• 使っているRedisのバージョンは「1.2.6」• 追記専用モードで運用
  11. 11. とあるシステムで問題になっているこ と• Redisのメモリ使用量が13GB以上になると、 「BGREWRITEAOF」が正常動作しない(らしい) ↓パフォーマンスが悪くなる(らしい)• メモリを24GB積んでいるのにRedisが13GB以上使え ない(T_T) ↓ 現状メモリを10GB以上使わないように運用している(らしい) ↓ Redisのサーバ台数が多くなっている(>_<) データが増えつづければサーバ台数がやばいことに・・・ ((((;゚Д゚)))
  12. 12. 問題の解決には?• Redisの使用メモリ量を増やすことができるか? ↓使用メモリ量が増やすことができれば・・・ ↓メモリいっぱい積んだサーバを用意すればサーバ台数減らせるかも(^^)
  13. 13. 検証• メモリ使用量が多くなったときの BGREWRITEAOFの挙動を確認• 最新バージョンとの挙動の違い• 最新バージョンとの性能比較• その他いろいろやってみた(^^)
  14. 14. BGREWRITEAOFの検証検証方法redisサーバに対して、データをSETしつづけ、メモリ使用量10GB,20GB以上達したときの「BGREWRITEAOF」の挙動を検証検証環境OS メモリCentOS5.4 64bit 32GB結果バージョン Redisの使用メモリ量 vm.overcommit_memory BGREWRITEAOFの実行結果Redis-1.2.6 14GB 0(デフォルト) Cannot allocate memory 14GB 1 successfully rewritten. 23GB 1 Out of memoryRedis-2.4.9 14GB 0(デフォルト) rewrite successful 22GB 0(デフォルト) Cannot allocate memory 22GB 1 rewrite successful
  15. 15. バージョンごとの性能検証方法1000万件のデータをSET/GETしたときの所用時間と使用メモリ量を測定1000万件のCSVデータを読み込ませてSETを実行CSVデータ内容(1000万件分)==============tokyo00001,09000001tokyo00002,09000002tokyo00003,09000003tokyo00004,09000004tokyo00005,09000005・・・・結果バージョン SET(秒) GET(秒) 使用メモリ(GB)Redis-1.2.6 1276 1249 1.54Redis-2.4.9 1253 1190 1.17
  16. 16. メモリの限界テスト検証環境OS メモリ RedisバージョンCentOS5.4 64bit 64GB 2.4.9検証方法---------------------Redisにデータを登録しつづけたときの挙動を確認結果------------サーバハングアップ※60GB以上のメモリを使いはたし、コンソールになにも映らない キーボードも反応なし syslog、redisのログにエラー出力なし 電源OFF/ONで復帰
  17. 17. 使用メモリ上限テスト検証方法100MB以上のデータをSETできないようにできるかテスト設定redis.conf--------------maxmemory 100mbmaxmemory-policy noeviction※書き込み操作でエラーを返す結果---------------クライアント側で以下エラー発生redis.exceptions.ResponseError: command not allowed when used memory > maxmemory
  18. 18. BGREWRITEAOFの実行上限検証方法メモリ使用量40GB,50GB以上達したときの「BGREWRITEAOF」の挙動を検証結果AOFファイルサイズ(GB) 使用メモリ量(GB) 結果20 44 rewrite successful24 50 サーバハングアップ考察メモリ40GB以上のとき成功したのは、AOFサイズ+使用メモリ量の合計が64GBだったからで、50GB以上のときハングしたのは合計が70GB以上になったからではないかと思われる※サーバで使用できるメモリ量は物理メモリ(64GB)+SWAP(2GB)=66GB

×