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の活用事例とトラブル事例
【株式会社グリフォン】 2015.03.12
自己紹介
[自己紹介]
- 川村猛(かわむら たける)
- 株式会社グリフォン
- サイバーエージェントとGREEのジョイントベンチャー
- 2013年2月設立
- CTO
- ソーシャルアプリの開発に関わって5年
- サーバーサイドのエンジニア
グリフォンのアプリ
グリフォンのアプリ
グリフォンのアプリ
環境
[環境]
環境
[環境]
Redisサーバー
[Redisサーバー]
- バージョン2.8.4
- master 1機、slave 1機
- 3プロセス起動(ただしほぼ1プロセスしか使用せず)
- 4core、20GB
- ハートビートで監視
- フェイルオーバーにSe...
活用事例
[活用事例]
- memcachedとの併用
- 文字列型
- ハッシュ型
- ソート済みセット型
- トランザクション
活用事例
[活用事例]
- memcachedとの併用
- 文字列型
- ハッシュ型
- ソート済みセット型
- トランザクション
活用事例
[memcachedとの併用]
- Redis/memcachedの使い分け
・永続化したい、もしくは長期間保持したいものはRedis
・DBの参照結果や一時的なトークン等はmemcached
- 単純なKVSとしての使用であればme...
活用事例
[活用事例]
- memcachedとの併用
- 文字列型
- ハッシュ型
- ソート済みセット型
- トランザクション
活用事例
[文字列型]
- 各種フラグの管理
・初回挙動
・アラートポップアップ等の表示
- カードの選択状況の管理
・強化
・限界突破
活用事例
[活用事例]
- memcachedとの併用
- 文字列型
- ハッシュ型
- ソート済みセット型
- トランザクション
活用事例
[ハッシュ型]
- 各ギルドにおける、ユーザー毎のデータ管理
KEY:guild_id
├user_id①
│ ├データ①
│ ├データ②
│ └データ③
├user_id②
│ ├データ①
│ ├データ②
│ └データ③
・
・
・
活用事例
[活用事例]
- memcachedとの併用
- 文字列型
- ハッシュ型
- ソート済みセット型
- トランザクション
活用事例
[ソート済みセット型]
- ソートが重いもの
・バトル中の戦況履歴
→1つのバトルで秒間数十件の書き込み
・バトルのマッチング
→強い順に並べてマッチング
・リアルタイムランキング
→イベントのポイントランキング等
→以前は難易度の高...
活用事例
[活用事例]
- memcachedとの併用
- 文字列型
- ハッシュ型
- ソート済みセット型
- トランザクション
活用事例
[トランザクション]
- RDBのトランザクションとは異なる
→ロールバックではない
→累積コマンドキューの全実行 or 全破棄
- あまり使ってはいないが、今後もっと活用していきたい
→MySQLのcommitが完了したらRedis...
トラブル事例
[トラブル事例]
- bgsaveによるパフォーマンス低下
- 容量オーバー
- MySQLとの併用による実装ミス
トラブル事例
[トラブル事例]
- bgsaveによるパフォーマンス低下
- 容量オーバー
- MySQLとの併用による実装ミス
トラブル事例
[bgsaveによるパフォーマンス低下]
- bgsaveが一定時間、一定件数のkeyが更新された際、
自動で実行される
- Redisが持っているデータを丸ごとファイルに書き込む
→ DISK I/O、CPU負荷の上昇
→ パフ...
トラブル事例
[bgsaveによるパフォーマンス低下]
- 【対策】
・master機でbgsave設定をOFFに
・slave機の設定はそのまま
トラブル事例
[トラブル事例]
- bgsaveによるパフォーマンス低下
- 容量オーバー
- MySQLとの併用による実装ミス
トラブル事例
[容量オーバー]
- maxmemory=0 にしていた
- LRU設定していない
→「勝手に消されるのはむしろ困る」的な
- 監視が甘かった
→容量オーバーで
更新出来ない
→アプリで不具合発生
トラブル事例
[容量オーバー]
- 【対策】
・各データのexpire見直し
→expireが未設定のものが見つかった
→expireの設定し直しと不要データの削除
・サーバーのスケールアップ
→ 20GB → 30GB
・zabbixで細かく...
トラブル事例
[トラブル事例]
- bgsaveによるパフォーマンス低下
- 容量オーバー
- MySQLとの併用による実装ミス
トラブル事例
[MySQLとの併用による実装ミス]
- Redis更新後にMySQLでロールバックが発生
try
{
ActiveRecord::begin();
・
・
(ここでredisのデータ更新)
・
・
ActiveRecord::c...
トラブル事例
[MySQLとの併用による実装ミス]
- 【対策】
・コードの修正と、Redisのトランザクション
try
{
ActiveRecord::begin();
・
・
ActiveRecord::commit();
(ここでredi...
グループその他事例
[グループその他事例]
- リアルタイムマルチプレイのゲームでpub/sub
→各クライアントでデータの同期
- Redisを一部機能でメインDBとして使用
・ロックの活用
・サーバー台数とプロセス数の増加
→管理コストが膨...
ご静聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

ソーシャルアプリにおけるRedisの活用事例とトラブル事例

8,606 views

Published on

2015年3月12日にヒカ☆ラボに登壇された
株式会社グリフォンの川村氏のスライド資料です。

Published in: Technology
  • Be the first to comment

ソーシャルアプリにおけるRedisの活用事例とトラブル事例

  1. 1. ソーシャルアプリにおける Redisの活用事例とトラブル事例 【株式会社グリフォン】 2015.03.12
  2. 2. 自己紹介 [自己紹介] - 川村猛(かわむら たける) - 株式会社グリフォン - サイバーエージェントとGREEのジョイントベンチャー - 2013年2月設立 - CTO - ソーシャルアプリの開発に関わって5年 - サーバーサイドのエンジニア
  3. 3. グリフォンのアプリ
  4. 4. グリフォンのアプリ
  5. 5. グリフォンのアプリ
  6. 6. 環境 [環境]
  7. 7. 環境 [環境]
  8. 8. Redisサーバー [Redisサーバー] - バージョン2.8.4 - master 1機、slave 1機 - 3プロセス起動(ただしほぼ1プロセスしか使用せず) - 4core、20GB - ハートビートで監視 - フェイルオーバーにSentinelは使用せず - phpredis - phpRedisAdmin
  9. 9. 活用事例 [活用事例] - memcachedとの併用 - 文字列型 - ハッシュ型 - ソート済みセット型 - トランザクション
  10. 10. 活用事例 [活用事例] - memcachedとの併用 - 文字列型 - ハッシュ型 - ソート済みセット型 - トランザクション
  11. 11. 活用事例 [memcachedとの併用] - Redis/memcachedの使い分け ・永続化したい、もしくは長期間保持したいものはRedis ・DBの参照結果や一時的なトークン等はmemcached - 単純なKVSとしての使用であればmemcachedの方が パフォーマンスが良かった
  12. 12. 活用事例 [活用事例] - memcachedとの併用 - 文字列型 - ハッシュ型 - ソート済みセット型 - トランザクション
  13. 13. 活用事例 [文字列型] - 各種フラグの管理 ・初回挙動 ・アラートポップアップ等の表示 - カードの選択状況の管理 ・強化 ・限界突破
  14. 14. 活用事例 [活用事例] - memcachedとの併用 - 文字列型 - ハッシュ型 - ソート済みセット型 - トランザクション
  15. 15. 活用事例 [ハッシュ型] - 各ギルドにおける、ユーザー毎のデータ管理 KEY:guild_id ├user_id① │ ├データ① │ ├データ② │ └データ③ ├user_id② │ ├データ① │ ├データ② │ └データ③ ・ ・ ・
  16. 16. 活用事例 [活用事例] - memcachedとの併用 - 文字列型 - ハッシュ型 - ソート済みセット型 - トランザクション
  17. 17. 活用事例 [ソート済みセット型] - ソートが重いもの ・バトル中の戦況履歴 →1つのバトルで秒間数十件の書き込み ・バトルのマッチング →強い順に並べてマッチング ・リアルタイムランキング →イベントのポイントランキング等 →以前は難易度の高い機能だったが、 redisのおかげで非常に容易になった
  18. 18. 活用事例 [活用事例] - memcachedとの併用 - 文字列型 - ハッシュ型 - ソート済みセット型 - トランザクション
  19. 19. 活用事例 [トランザクション] - RDBのトランザクションとは異なる →ロールバックではない →累積コマンドキューの全実行 or 全破棄 - あまり使ってはいないが、今後もっと活用していきたい →MySQLのcommitが完了したらRedisのEXEC
  20. 20. トラブル事例 [トラブル事例] - bgsaveによるパフォーマンス低下 - 容量オーバー - MySQLとの併用による実装ミス
  21. 21. トラブル事例 [トラブル事例] - bgsaveによるパフォーマンス低下 - 容量オーバー - MySQLとの併用による実装ミス
  22. 22. トラブル事例 [bgsaveによるパフォーマンス低下] - bgsaveが一定時間、一定件数のkeyが更新された際、 自動で実行される - Redisが持っているデータを丸ごとファイルに書き込む → DISK I/O、CPU負荷の上昇 → パフォーマンスの低下 → アプリが重くなる
  23. 23. トラブル事例 [bgsaveによるパフォーマンス低下] - 【対策】 ・master機でbgsave設定をOFFに ・slave機の設定はそのまま
  24. 24. トラブル事例 [トラブル事例] - bgsaveによるパフォーマンス低下 - 容量オーバー - MySQLとの併用による実装ミス
  25. 25. トラブル事例 [容量オーバー] - maxmemory=0 にしていた - LRU設定していない →「勝手に消されるのはむしろ困る」的な - 監視が甘かった →容量オーバーで 更新出来ない →アプリで不具合発生
  26. 26. トラブル事例 [容量オーバー] - 【対策】 ・各データのexpire見直し →expireが未設定のものが見つかった →expireの設定し直しと不要データの削除 ・サーバーのスケールアップ → 20GB → 30GB ・zabbixで細かくアラートを設定 (以前は容量を食いつぶしてからアラートが 投げられていた) ・インフラチーム体制、業務フロー改善
  27. 27. トラブル事例 [トラブル事例] - bgsaveによるパフォーマンス低下 - 容量オーバー - MySQLとの併用による実装ミス
  28. 28. トラブル事例 [MySQLとの併用による実装ミス] - Redis更新後にMySQLでロールバックが発生 try { ActiveRecord::begin(); ・ ・ (ここでredisのデータ更新) ・ ・ ActiveRecord::commit(); } catch (Exception $error) { ActiveRecord::rollback(); throw $error; }
  29. 29. トラブル事例 [MySQLとの併用による実装ミス] - 【対策】 ・コードの修正と、Redisのトランザクション try { ActiveRecord::begin(); ・ ・ ActiveRecord::commit(); (ここでredisのデータ更新) } catch (Exception $error) { ActiveRecord::rollback(); throw $error; }
  30. 30. グループその他事例 [グループその他事例] - リアルタイムマルチプレイのゲームでpub/sub →各クライアントでデータの同期 - Redisを一部機能でメインDBとして使用 ・ロックの活用 ・サーバー台数とプロセス数の増加 →管理コストが膨らむ
  31. 31. ご静聴ありがとうございました

×