KVSがなくても十分スケール600億PVもMySQLで! モバゲーのインフラ底力 |
携帯向けサイト「モバゲータウン」の勢いが止まらない。2010年3月の会員数は約1800万人、月間ページビュー(PV)600億という"モンスターSNS"に成長している。意外なことに、これだけのアクセスをさばくのに、memcachedをはじめとするKVS(Key-Value Store)系のインフラ・ソフトはあまり使っておらず、MySQLで十分だという。モバゲータウンのインフラ担当者に話を聞いた。 |
1日6億PVがあっという間に2倍以上に |
||
|
DeNAでインフラ担当チームを統括するシステム統括本部IT基盤部チーフエンジニアの小野篤司氏 |
モバゲータウンを運営するDeNA(ディー・エヌ・エー)は、もともと1999年に開始したオークションサイト「ビッダーズ」で知られている。その後、オークションに加えてECサイトを開始し、auとの提携により「auショッピングモール」などで急速に成長した。
ビッダーズだけでも、数千万PV規模の大規模サービスだが、最近はモバゲータウンの成長が著しい。
「特に2009年9月から順次リリースした自社製のソーシャルアプリによって急激にアクセスが増えています。ほんの2、3カ月の間に1日6〜7億PVだったものが2倍以上になり、現在は20億PVに近づいているという状況です」。
こう話すのは、モバゲータウンのインフラ担当チームを統括する、システム統括本部IT基盤部チーフエンジニアの小野篤司氏だ。同社は2009年春頃から体制を強化し、モバゲータウン向けに自社製ゲームを順次リリース。「怪盗ロワイヤル」「ホシツク」「セトルリン」「モンスタートラップ」「海賊トレジャー」など次々にヒットを放ち、2010年3月には業績予想(営業利益)を25%も上方修正する発表を行っている。「ソーシャルゲームでは人と人が接触してアクセスするので、どんどんアクセス数が伸びるんですね」(小野氏)。
モバゲータウンのページビュー推移グラフ |
memcachedは使わずMySQLでスケール |
||
これほどのアクセス急増を想定はしていなかったという同社だが、サイト停止や大きなトラブルを経験することなく、運用を続けている。そして意外にも、インフラにはmemcachedのようなKVSをあまり使っておらず、基本的にMySQLでシャーディングしているという。ゲームタイトルごとにDBを切り分ける構成だ。
「同じ業界の他社に比べると、memcachedを使ってないのかなと思います。もしかしたら使えていないということかもしれませんけど、MySQLのInnoDBでも遅いわけではなく、大量のクエリをさばく能力はあります」(小野氏)
memcachedを使えばスループットは確実に高いが、InnoDBでも実績として1万qps程度はさばいていて、十分にスケールしているという。この背景にはハードウェアの進化と自社独特の運用技術の蓄積があるという。
ハードウェア進化では、特に過去半年はSSDの普及でディスクI/O性能が上がったことが大きいという。大雑把に言って1万5000RPMのSASに比べて4倍のリード性能を叩き出し、SASで 遅延が発生するwrite処理、具体的にはレプリケーション処理などでSSDが有効という。スレーブサーバへのレプリケーションが遅延すると、ユーザーが購入したはずのアイテムが、一瞬消えるなどの不具合となって現れる可能性がある。
全体に順調というモバゲーのインフラだが、過負荷によりパフォーマンス低下が見られるケースもないわけではない。このため、memcached導入のメリットも同社は認識しているという。ただ、memcachedを活用するには、キャッシュとDBの一貫性をアプリ側で意識して書くか、フレームワークで吸収して整合性を保つ必要がある。これにはシステムの複雑化を招くというマイナス面がある。障害時の問題の切り分けも難しくなる。
「memcached導入となれば当然開発工数の問題もありますし、インフラを見ているわれわれからすれば、InnoDBで、そこまで困ることがあるかな、という印象です」(小野氏)
特に、DeNAの場合は組織が大きくなり分業が進んでいるため、アプリ開発者が耐障害性や負荷についてあまり意識せずに済むよう心がけているという。アプリ開発者と情報交換を行いながら、どういうタイミングでテーブルを分割するかなどをインフラエンジニア主導で決定しているという。
モバゲーでは、明らかにKVSでいいというケースのために60台程度のmemcachedサーバも利用しているが、基本的にはそれぞれ600台程度のWebサーバ(Apache)とMySQLサーバを使ってサービスを運用しているという。
サーバ台数内訳Webサーバ | 500〜600台 |
---|---|
DB(MySQL)サーバ | 600台 |
memcachedサーバ | 30〜40台 |
LVS、MyDNSなど | 40〜50台 |
サーバ情報管理に独自DBのシステムを構築 |
||
モバゲーのインフラを支えているのはいわゆるLAMPスタック。CentOS系のLinuxにApache、MySQL、Perlという標準的な構成だ。フロントエンドのファイアウォールやロードバランサについてもメジャーなアプライアンスを利用している。
DeNAの技術が光るのは、MySQLを使い切る工夫の数々だ。
まず第1に、サーバ情報を独自にデータベース化して運用や監視の基礎ツールとしていることが挙げられる。Webブラウザで各種サーバについてその機能やグループ別にステータスやパフォーマンスを視覚的に確認できるほか、API経由で特定サービスを提供するサーバのホスト名をまとめて受け取ったり、複数サーバに対してスクリプトで設定変更をかけるようなことができるようになっているという。
サーバのリソース監視はNAGIOSを使った一般的なものだが、2000台のサーバ管理となると通知メッセージ1つにも工夫が必要だ。なぜなら、サーバのホスト名以外にも何のサーバであるか、そのサーバはアクティブかどうかなどの情報を併記しないと障害対策には役立たないからだ。ここでもDBベースでのサーバ情報管理が生きているという。
「モバゲーには秒間4万ものリクエストが来るので、ちょっとしたことで大惨事になり得ます。例えばあるテーブルのレコードを数千件増やして性能劣化を起こしたこともあるぐらいです。小規模なら管理が行き届いていなくても大丈夫というケースでも、大規模になると一気に露呈するんですよね。だから、こうした運用監視が重要なのです」(小野氏)
DNSラウンドロビンでDBサーバも分散 |
||
FastCGIを使っているモバゲーではWebサーバはアプリケーションサーバも兼ねている。この600台あるWebサーバ群から、やはり600台ほどあるMySQLサーバに対してクエリを出すわけだが、ここで問題となるのが、MySQLサーバの名前解決だ。
サーバ台数が多く、サーバリソースの空き具合や負荷によって、日常的に割り当てを動的に変更するため、アプリでDBサーバを一意に指定するわけにはいかない。このためモバゲーではDNSラウンドロビンによるDBサーバの負荷分散を行っている。スレーブとなるDBサーバの処理性能は均一ではないため、重み付けも行う。
このDNSラウンドロビンによるDBサーバ分散処理にはOSSの「MyDNS」を利用しているという。MyDNSはDNSのレコードをDBに保存する特徴があり、スクリプト経由で設定を変更したり、異常検知時にレコードから消すことで、応答しないスレーブサーバを切り離すといったことが簡単にできるという。
600億PVを支えるモバゲーのインフラシステム構成図 |
モバゲーぐらいの大規模になると、MyDNSの運用にも独自の工夫が必要だ。単にMyDNSサーバを1つ置くだけでは「たかがDNSでも負荷が高くなりすぎる」(小野氏)からだ。
このため、Linuxサーバをクラスタとして利用できるよう20〜30台のLinuxサーバで「LVS」(Linux Virtual Server)を構成。MyDNSサーバを利用する形とした。LVSによる負荷分散では、いわゆるDSR(Direct Server Return)構成とすることで応答のトラフィックはLVSをバイパス。スループットを高めた。
だが実際にはこの構成には2つの問題が起こってきた。1つはLVSが20Mbps程度でパケットロスが起きることが分かったこと、もう1つはMyDNSではスレーブの数が増えすぎてしまうことだという。ちなみに、通常20Mbps程度でパケットロスが発生することはないが、パケット数が多すぎたことが原因ではないかという。
こうした背景から同社では結局、コンシステント・ハッシングをPerl+XS(PerlのCバインディング)で実装したローカルキャッシュを利用しているという。
コンシステント・ハッシングをPerlで実装 |
||
resolve_ketama.pmはもともとアバター画像のレンダリングで負荷分散するために実装したもの(ketamaというmemcached向けクライアント・ライブラリと同名で目的も似ている)。
モバゲーではアバターをアニメーションGIFで表示しているが、アイテムの有無などで組み合わせが膨大なため、静的なGIF画像を事前にすべて用意することができない。このため、サーバ側でレンダリングし、その結果をCDN(アカマイ)のサーバから送出している。このとき、単純にラウンドロビンでサーバを分散してしまうとキャッシュのヒット率が落ちてしまう。あるユーザー向けにレンダリングしたある画像を持つサーバに、同じユーザーからのリクエストが来ると限らないためだ。
分散アルゴリズムのコンシステント・ハッシングを利用する。ユーザーIDをキーにしたハッシュを計算し、同一IDであれば同じサーバが割り当たるようにする。コンシステント・ハッシングは、分散ノード数が増減しても割り当て先がほとんど変わらないという一般的なハッシュにはない特徴がある。
アバター画像向けに実装したresolve_ketama.pmは、MyDNSでも使っている。1000万規模のユーザーが600台のMySQLにアクセスするため、やはりコンシステント・ハッシングによる分散処理は、サーバのメモリキャッシュのヒット率を上げる上でも有効なのだという。
コンテンツの監視でも分散処理 |
||
このほかにも、モバゲーのインフラではサポート業務向けのものや、コンテンツ監視用のものなどがあるという。
モバゲーでは、日記や掲示板へのコメントなどフリーコメントの書き込みができる箇所については、常時解析処理を受け付けるWebサーバにHTTPでデータを渡していて、アクセスログやユーザー行動分析データとして利用しているという。書き込みメッセージに関しては、機械学習の手法でフィルタし、最終的に人間がチェックするというプロセスを回している。「こうしたシステムにもサーバの台数は結構使っています」(小野氏)。やはりメッセージはMySQLに書き込んでいて、現在はログの増加に対応するため、Hadoop導入を検討しているところだという。
LAMPスタックといえば、お手軽OSSの組み合わせというイメージがあるかもしれない。MySQLといえばKVSやNoSQLと呼ばれる新興のストレージ技術に押されているイメージもあるかもしれない。しかし、実際にこれらを組み合わせ、分散処理のノウハウや独自開発の運用ツールを蓄積すれば、超大規模のWebサービスだって安定運用できるのだ。
規模がケタ違いである分、ほかに類を見ない技術的課題を自分たちの手で解決する必要はある。それが可能であり、やりがいもあることなのだということを、DeNAのエンジニアたちは現場で淡々と証明し続けている。そんな彼らこそ、紛れもなくWeb技術の最先端を走るトップランナーと言えるだろうと思う。
関連リンク |
---|
ディー・エヌ・エー | |
モバゲータウン(PC向け) | |
ビッダーズ |
提供:株式会社ディー・エヌ・エー
アイティメディア営業企画
制作:@IT 編集部
掲載内容有効期限:2010年05月25日
関連リンク |
---|
ディー・エヌ・エー | |
モバゲータウン(PC向け) | |
ビッダーズ |
関連記事 |
---|
600億PVもMySQLで! モバゲーのインフラ底力600億PVもMySQLで! モバゲーのインフラ底力エンジニアの働き方にはもっと 選択肢があっていい(@IT Special) |
|
600億PVもMySQLで! モバゲーのインフラ底力600億PVもMySQLで! モバゲーのインフラ底力モバゲーオープン化の裏にPerlアリ! (@IT Special) |
|
DeNA Technology Seminar #1 フォトレポート(@IT自分戦略研究所) | |
「下積み時代はない。 面白い仕事があるだけだ」「下積み時代はない。 面白い仕事があるだけだ」(@IT自分戦略研究所) |
|
何を作るべきか、エンジニアが考えられる会社を選べ(@IT自分戦略研究所) | |
「Perl技術者の雇用を増やす」、JPAが本格始動(@IT NewsInsight) | |
モバゲータウン、会員数1000万人突破(@IT NewsInsight) |