31
ソーシャルアプリにおける Redisの活用事例とトラブル事例 【株式会社グリフォン】 2015.03.12

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

Embed Size (px)

Citation preview

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

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

【株式会社グリフォン】 2015.03.12

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

自己紹介

[自己紹介]

- 川村猛(かわむら たける)- 株式会社グリフォン- サイバーエージェントとGREEのジョイントベンチャー- 2013年2月設立- CTO- ソーシャルアプリの開発に関わって5年- サーバーサイドのエンジニア

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

グリフォンのアプリ

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

グリフォンのアプリ

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

グリフォンのアプリ

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

環境

[環境]

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

環境

[環境]

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

Redisサーバー

[Redisサーバー]

- バージョン2.8.4- master 1機、slave 1機- 3プロセス起動(ただしほぼ1プロセスしか使用せず)- 4core、20GB- ハートビートで監視- フェイルオーバーにSentinelは使用せず- phpredis- phpRedisAdmin

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

活用事例

[活用事例]

- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション

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

活用事例

[活用事例]

- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション

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

活用事例

[memcachedとの併用]

- Redis/memcachedの使い分け・永続化したい、もしくは長期間保持したいものはRedis・DBの参照結果や一時的なトークン等はmemcached

- 単純なKVSとしての使用であればmemcachedの方がパフォーマンスが良かった

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

活用事例

[活用事例]

- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション

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

活用事例

[文字列型]

- 各種フラグの管理・初回挙動・アラートポップアップ等の表示

- カードの選択状況の管理・強化・限界突破

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

活用事例

[活用事例]

- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション

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

活用事例

[ハッシュ型]

- 各ギルドにおける、ユーザー毎のデータ管理

KEY:guild_id├user_id①│ ├データ①│ ├データ②│ └データ③├user_id②│ ├データ①│ ├データ②│ └データ③・・・

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

活用事例

[活用事例]

- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション

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

活用事例

[ソート済みセット型]

- ソートが重いもの・バトル中の戦況履歴

→1つのバトルで秒間数十件の書き込み

・バトルのマッチング→強い順に並べてマッチング

・リアルタイムランキング→イベントのポイントランキング等→以前は難易度の高い機能だったが、

redisのおかげで非常に容易になった

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

活用事例

[活用事例]

- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション

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

活用事例

[トランザクション]

- RDBのトランザクションとは異なる→ロールバックではない→累積コマンドキューの全実行 or 全破棄

- あまり使ってはいないが、今後もっと活用していきたい→MySQLのcommitが完了したらRedisのEXEC

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

トラブル事例

[トラブル事例]

- bgsaveによるパフォーマンス低下- 容量オーバー- MySQLとの併用による実装ミス

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

トラブル事例

[トラブル事例]

- bgsaveによるパフォーマンス低下- 容量オーバー- MySQLとの併用による実装ミス

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

トラブル事例

[bgsaveによるパフォーマンス低下]

- bgsaveが一定時間、一定件数のkeyが更新された際、自動で実行される

- Redisが持っているデータを丸ごとファイルに書き込む

→ DISK I/O、CPU負荷の上昇→ パフォーマンスの低下

→ アプリが重くなる

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

トラブル事例

[bgsaveによるパフォーマンス低下]

- 【対策】・master機でbgsave設定をOFFに・slave機の設定はそのまま

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

トラブル事例

[トラブル事例]

- bgsaveによるパフォーマンス低下- 容量オーバー- MySQLとの併用による実装ミス

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

トラブル事例

[容量オーバー]

- maxmemory=0 にしていた- LRU設定していない

→「勝手に消されるのはむしろ困る」的な- 監視が甘かった

→容量オーバーで更新出来ない→アプリで不具合発生

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

トラブル事例

[容量オーバー]

- 【対策】・各データのexpire見直し

→expireが未設定のものが見つかった→expireの設定し直しと不要データの削除

・サーバーのスケールアップ→ 20GB → 30GB

・zabbixで細かくアラートを設定(以前は容量を食いつぶしてからアラートが

投げられていた)・インフラチーム体制、業務フロー改善

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

トラブル事例

[トラブル事例]

- bgsaveによるパフォーマンス低下- 容量オーバー- MySQLとの併用による実装ミス

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

トラブル事例

[MySQLとの併用による実装ミス]

- Redis更新後にMySQLでロールバックが発生

try{

ActiveRecord::begin();・・

(ここでredisのデータ更新)・・

ActiveRecord::commit();}catch (Exception $error){

ActiveRecord::rollback();throw $error;

}

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

トラブル事例

[MySQLとの併用による実装ミス]

- 【対策】・コードの修正と、Redisのトランザクション

try{

ActiveRecord::begin();・・

ActiveRecord::commit();(ここでredisのデータ更新)

}catch (Exception $error){

ActiveRecord::rollback();throw $error;

}

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

グループその他事例

[グループその他事例]

- リアルタイムマルチプレイのゲームでpub/sub→各クライアントでデータの同期

- Redisを一部機能でメインDBとして使用・ロックの活用・サーバー台数とプロセス数の増加

→管理コストが膨らむ

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

ご静聴ありがとうございました