Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
ソーシャルアプリにおける
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として使用
・ロックの活用
・サーバー台数とプロセス数の増加
→管理コストが膨...
ご静聴ありがとうございました
Prochain SlideShare
Chargement dans…5
×

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

10 160 vues

Publié le

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

Publié dans : Technologie
  • Soyez le premier à commenter

ソーシャルアプリにおける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. ご静聴ありがとうございました

×