Upload
leveragesevent
View
823
Download
0
Embed Size (px)
Citation preview
ソーシャルアプリにおけるRedisの活用事例とトラブル事例
【株式会社グリフォン】 2015.03.12
自己紹介
[自己紹介]
- 川村猛(かわむら たける)- 株式会社グリフォン- サイバーエージェントとGREEのジョイントベンチャー- 2013年2月設立- CTO- ソーシャルアプリの開発に関わって5年- サーバーサイドのエンジニア
グリフォンのアプリ
グリフォンのアプリ
グリフォンのアプリ
環境
[環境]
環境
[環境]
Redisサーバー
[Redisサーバー]
- バージョン2.8.4- master 1機、slave 1機- 3プロセス起動(ただしほぼ1プロセスしか使用せず)- 4core、20GB- ハートビートで監視- フェイルオーバーにSentinelは使用せず- phpredis- phpRedisAdmin
活用事例
[活用事例]
- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション
活用事例
[活用事例]
- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション
活用事例
[memcachedとの併用]
- Redis/memcachedの使い分け・永続化したい、もしくは長期間保持したいものはRedis・DBの参照結果や一時的なトークン等はmemcached
- 単純なKVSとしての使用であればmemcachedの方がパフォーマンスが良かった
活用事例
[活用事例]
- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション
活用事例
[文字列型]
- 各種フラグの管理・初回挙動・アラートポップアップ等の表示
- カードの選択状況の管理・強化・限界突破
活用事例
[活用事例]
- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション
活用事例
[ハッシュ型]
- 各ギルドにおける、ユーザー毎のデータ管理
KEY:guild_id├user_id①│ ├データ①│ ├データ②│ └データ③├user_id②│ ├データ①│ ├データ②│ └データ③・・・
活用事例
[活用事例]
- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション
活用事例
[ソート済みセット型]
- ソートが重いもの・バトル中の戦況履歴
→1つのバトルで秒間数十件の書き込み
・バトルのマッチング→強い順に並べてマッチング
・リアルタイムランキング→イベントのポイントランキング等→以前は難易度の高い機能だったが、
redisのおかげで非常に容易になった
活用事例
[活用事例]
- memcachedとの併用- 文字列型- ハッシュ型- ソート済みセット型- トランザクション
活用事例
[トランザクション]
- RDBのトランザクションとは異なる→ロールバックではない→累積コマンドキューの全実行 or 全破棄
- あまり使ってはいないが、今後もっと活用していきたい→MySQLのcommitが完了したらRedisのEXEC
トラブル事例
[トラブル事例]
- 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::commit();}catch (Exception $error){
ActiveRecord::rollback();throw $error;
}
トラブル事例
[MySQLとの併用による実装ミス]
- 【対策】・コードの修正と、Redisのトランザクション
try{
ActiveRecord::begin();・・
ActiveRecord::commit();(ここでredisのデータ更新)
}catch (Exception $error){
ActiveRecord::rollback();throw $error;
}
グループその他事例
[グループその他事例]
- リアルタイムマルチプレイのゲームでpub/sub→各クライアントでデータの同期
- Redisを一部機能でメインDBとして使用・ロックの活用・サーバー台数とプロセス数の増加
→管理コストが膨らむ
ご静聴ありがとうございました