こんちは。開発2部の吉岡です。
オーツーではKVSとしてRedisを使ってます。
なぜかというと、
- インストールと設定が簡単なので、開発環境を作りやすい。
- 柔軟なデータ型。ハッシュとソート済みセットにはお世話になってます。
- master-slaveのレプリケーションを作って、冗長構成も取ることが出来る。
という感じでしょうか。
ちなみにphpredis使って接続しています。
ランキングとRedis
ランキング機能はソーシャルゲームに付き物です。
なぜRedisでランキングで作成するのかというと、データベースでも実装を行うことは出来るのですが、順位付けの処理に非常に負荷がかかります。特に同点同位。これがクセモノです。
リアルタイムでこれを生成するのはかなり難しいかと思いますが、Redisのソート済みセット使えばこの処理は比較的楽に実装出来ます。
参考になるのは↓な記事でしょうか。
Redisでランキングを作ろうとしたんだ
Redisでランキングを作ろうとしたんだ(完結編)
zCountを使うのがミソかと思います。
また、オーツーでは、ランキングに使われるスコアはデータベースにも記録しています。
このデータを元に、いつでもRedisでランキングを再生成出来ます。
Redisの信頼性
Redisを業務で使われている方は、消えたらマズイデータも格納されているんでしょうかね…
ランキングの項でも書いたのですが、オーツーでは基本的にRedisには、再構築可能なデータしか格納していません。例えば、セッションデータや、キャッシュデータ等です。
色々と検証を行いたいところなのですが、まだ信頼性はデータベースの方が高い印象、という感じです。
Redisと負荷
Redisの使い方にも寄りますが、ソーシャルゲームの場合、ユーザーの爆発的な増加で、想定していなかった所に負荷がかかることがあります。
クライアントからのアクセス毎にソート済みセットを参照していたのですが、CPU負荷となってしまい、nagiosがぶちギレしたことがありました。
また、Redisは一定時間毎にデータをディスクに書き込みますが、これがio負荷になってしまったこともあります。
うちの会社でノウハウが十分に溜まっていないというのもあるのですが、あまりRedisを過信することなく、負荷も留意しておいた方がいいかなーと思います。
Redis Sentinel
今のところ、オーツーではRedis Sentinelは使っていません。
Redis Sentinelを運用してみたお話
で詳しく書かれていますが、フェイルオーバーが発生した場合、それをアプリケーション・サーバー側で取り回すことが難しいからです。
うちでSentinelを実装するならDNS方式かな…と思います。
Redisのslaveを何台も使うような事態になれば、実装の検討もしようかなーという感じです。
余談
RedisArray、結構役に立ちそうに思うんですが、あまり記事を見かけないです。
どっかでこっそり使って、テストしてみようかな。
余談2
MySQLでランキングというものが…
https://github.com/kazuho/mysql-ranking-engine
期待大です!