こんにちは! onk です。
一昨日の 11/20 に RailsDevCon2010 にスピーカーとして参加してきました。場所はオラクル青山センターさん。
聞いていただいた皆さま,ありがとうございました。いやー,30 分も話すの初めてだったので緊張したw 実行委員の皆さまもお疲れさまでした!
プレゼン資料はこちら⇒とあるアプリの開発運用(トラブルシュート)
内容ですが,
ソーシャルならではの負荷分散、インフラ、ログ解析とかが聞けると夢が広がっていいかも。他セッションと絶対かぶらないし。大規模サービス作ろうとしている人にはありがたいと思います。
と @2celeb さんからリクエストがあったので,『聞くだけで運用した気になるソーシャルアプリ』を主題にしました。駆け足でしたが,伝えたいことは盛り込めたかなぁと思います。少しでも参考になれば幸いです。

sasata299タイトル画面ww #RailsDevCon
ikm一瞬見えたロゴがw #railsdevcon
sgtakeru@onk さんのセッション開始 #RailsDevCon
d6rkaiz#RailsDevCon とあるソーシャルアプリの開発運用 @onk さん
DiscoveryCoach3つ目のセッション、とあるアプリの運用開発。 (#railsdevcon live at http://ustre.am/qnNA)
ClockWorkStudioとあるソーシャルゲームの開発運用(トラブルシュート) #RailsDevCon
ikm意外と会場にソーシャルゲームを作った人が少ない #railsdevcon
oukayukaO・N・K! O・N・K!! #railsdevcon
話し始める前にソーシャルゲームを開発したことがある人に挙手してもらったんですがほとんど居ませんでした。遊んでる人で半分ぐらいだったかな。
ロゴはおなじみ http://to-a.ru/ ですね。名付け親は @youthk。

sgtakeruソーシャルアプリは、API利用、人口爆発、短納期 #RailsDevCon
DiscoveryCoachまずはソーシャルアプリのAPI利用の話 (#railsdevcon live at http://ustre.am/qnNA)
DiscoveryCoach開発はAPIを使った場合のデバックの仕方が肝。 (#railsdevcon live at http://ustre.am/qnNA)
ar1ハンゲームでけー #RailsDevCon つか、800万人いるのかドリコムのソーシャルゲー.
あ,p11 も p12 もアクティブユーザ数じゃなくて会員数です。念のため。適当にプレスリリースから拾ってきたので半年分ぐらい誤差があると思う。

cesare#RailsDevCon 「大安なのでリリース」w
ikm大安大事 #railsdevcon
agilekawabata大安でリリース #RailsDevCon
ar1大安なのでリリース(w #RailsDevCon
oukayukaソーシャルアプリは2ヶ月でリリースがデフォ #railsdevcon
sgtakeru大安でリリース&バージョンアップ #RailsDevCon
tyabe#RailsDevCon リリース日は大安
adzuki34「大安でリリース」 #RailsDevCon
hs9587#RailsDevCon 「とあるソーシャルアプリの開発運用」 大安なのでリリース
DiscoveryCoach2ヶ月でリリースは想定内。短納期をいかにこなすか。何を犠牲にして何を得るのか。。。が大事。 (#railsdevcon live at http://ustre.am/qnNA)
agilekawabata大安リリース駆動開発だな #RailsDevCon
ClockWorkStudio聴いたこともないgemがズラッと並んでた #RailsDevCon
ikmunicorn+nginx+rails3+ruby1.9.2など、今風の環境 #railsdevcon
oreradioドリコムさんもRedis使ってるのね。 #RailsDevCon
TrinityTミドルウェア、ことごとく最新だ。unicorn2, nginx0.7, Rails3, MySQL5.1, Ruby1.9.2, Redis.... やるなドリコム! #RailsDevCon
HexaRedis 使っているのか。 #RailsDevCon
d6rkaiz#RailsDevCon ドリコムさんでの環境一例 nginx+unicorn+mysql+memcached+redis+rails
「2ヶ月でリリースがデフォ」はさすがに言い過ぎっす……。
ミドルウェアは大体最新に合わせるようにしてますねー。「RailsConf 2010 に合わせてリリースされるだろう」と Rails3 beta で開発した挙句 rc4 の状態で本番投入したりとか,Passenger3 で地雷踏んだりとかしています(

ar1ドリコムのミドルウェア環境のversionはかなりあたらしいので揃えてるな。L5520 x2で32GBメモリの上に仮想化。8つくらいのVM #RailsDevCon
ar1#RailsDevCon リクエスト&レスポンスを確認しろ! HTTPのステータスコードをみろ!
cesare#RailsDevCon 「困ったら TCP まで降りる」基本ですなw
ikm困ったらリクエストとレスポンスを見る。TCPレイヤーで見るのが確実 #railsdevcon
DiscoveryCoachバグで3困ったらTCPレイヤまで降りてパケットを確認しよう。 (#railsdevcon live at http://ustre.am/qnNA)
sgtakeruデバックは、困ったら、request/resonseまでみる。TCPレイヤーまで降りてパケットを見る。 #RailsDevCon
arihhパケット監視マジ重要 #RailsDevCon
takaiTCPじゃなくてHTTPだよね
はい,HTTP でしたごめんなさい!
アプリの中から見ているだけだと oauth や jpmobile の挙動によく泣かされたので,API とやり取りするときは必ず WAF が処理する前の request を眺めるようにしています。
サーバ構成はあくまで基本構成で,本番は web がズラーっと横に並んだり cache や db の slave が並んだりします。

ar1#RailsDevCon Net::HTTPにloggerをしこむ net-http-spy. というかこれがrubyねた最初?
ClockWorkStudionet::httpにloggerをしこむnet-http-spy #RailsDevCon
TokyoIncidentsnet-http-spy #RailsDevCon
DiscoveryCoachかなり具体的ですごい。会場の文字入力のかちゃかちゃという音が今日最大かも。。ww (#railsdevcon live at http://ustre.am/qnNA)
ikmnet-http-spyでNet::HTTPにロガーを仕込む。超便利そう #railsdevcon
TrinityTnet-http-spy tcpflow #RailsDevCon
hs9587#RailsDevCon 「とあるソーシャルアプリの開発運用」 問題発見は request と response を見る、眺めてれば分かる事も多い。 net-http-spy Net::HTTP にログを仕込む
ar1#RailsDevCon tcpflowつかってんのか。。yumとかaptをみたり。gree行きのも見ると。。
d6rkaiz#RailsDevCon tcpflow // tcpdumpの保存しないバージョン
masaki925net-http-spy でTCPパケットロギングしてデバッグ #RailsDevCon
TokyoIncidentstcpflow #RailsDevCon
martinbtt's net-http-spy at master - GitHub ですね。外にアクセスしてるのが一目瞭然で便利なので,僕は .irbrc に
require "net-http-spy"
を書いています。
tcpflow は yum や apt で入れてください。ファイルに落としたいときってそんなに無いので flow で十分なんですよねー。

_shimadaタイトルに反して超実践的で参考になる (#railsdevcon live at http://bit.ly/a480k3
nog凄く具体的な話してるなー。 (#railsdevcon live at http://ustre.am/qnNA)
DiscoveryCoach巨大SNSのアプリだとスモールスタートできない。。。 (#railsdevcon live at http://ustre.am/qnNA)
nogRails1インスタンス200MB?多くね? (#railsdevcon live at http://ustre.am/qnNA)
ar1#RailsDevCon スモールスタートさせてくれない。1ヶ月で30万突破を視野にしておく。10万DAUで 1000万imp/day -> 230imp/s 。Railsは200MB workerだと かけ算で40G.
ar1#RailsDevCon m1.xlargeの限界は2300QPSくらい
ClockWorkStudio230imp/secだった場合の必要なマシンリソースの説明が具体的すぎてすげえ #RailsDevCon
tkawaスモールスタート機能(?)あるといいかも。招待制にするとかすればいいのかな? (#railsdevcon live at http://ustre.am/qnNA)
DiscoveryCoachマシンのスペックまでも。。。もう明日からはじめるソーシャルアプリ的な話ですね。 (#railsdevcon live at http://ustre.am/qnNA)
CPU 使用率はアプリによって違うだろうから,分かりやすくメモリ使用量で表現しています。150MB 超えることもあるので念のため 200 弱と言っておきました!

ikmデータ量の増加が著しいのでmaster/slave必須 #railsdevcon
sasata299ソーシャルゲームの規模感は凄いなぁー #RailsDevCon
ysakaki@onk の発表実践的で凄いな。こういう話がもっと聞きたい! #RailsDevCon
TokyoIncidentsこのスライドは絶対復習したい #RailsDevCon
ar1#RailsDevCon マイミク村. ともだちコレクションみたいなもの。質問を全て保存するのでしんどい。DBをなんとかする。
shinodoggソーシャルゲームのキャパシティプランニングの話。コレは参考になるなぁ。こういうのを大安の日ドリブンみたいなノリで継続してリリースし続けるのはカッコイイ。 #railsdevcon
DiscoveryCoachDBのmaster/slave分散を考える。 (#railsdevcon live at http://ustre.am/qnNA)
johnsmith0707スケールアウトか。puppetとかもあるように、最近はほんとにスケーラビリティの高さが求められるよね。 #RailsDevCon
ikmmaster/slaveはMasochism #railsdevcon
ar1#RailsDevCon master/slave分散。参照系だったらslaveを見にいく、updateはmasterに、とかはアプリで書く。ライブラリつかってない
_shimadaActiveRecordでmaster/slave分散は難しくない (#railsdevcon live at http://bit.ly/a480k3
DB 切り替えてる部分はどれも 100 行無いぐらいなので読んでみるといいです。使い方じゃなくて中身に言及している記事が増えると世界が面白くなる。

ar1#RailsDevCon JOINできないから、RDB関連は消す。habtmとか。
junyaゲームはEventually Consistentだとまずいデータがほとんどだから面倒くさそうだ。 #RailsDevCon
DiscoveryCoach更新系をmasterに、参照系をslaveにまわしてみたが、ゲームのアプリは更新系が多くて限界がくる。例:体力減る。 (#railsdevcon live at http://ustre.am/qnNA)
TrinityTマスタDBをテーブルごとに分割→has_manyやbelogs_toが使えなくなる→関連はAP側で実装か〜。 凄い試行錯誤だったんだろうな。 #RailsDevCon
すみません見栄張りました。分割はカテゴリごとなので,そのカテゴリ内では JOIN 可能です。なので自分でクエリ投げ直す処理はそんなに発生しないですね。

ar1#RailsDevCon rails3のshardingにはoctopus. 最近はいいハードなのでscaleupで対応
ikmshardingはdb-charmer, data_fabric, octopus #railsdevcon
hs9587#RailsDevCon 「とあるソーシャルアプリの開発運用」 Sharding 、DB のレプリケーションと分割、そういう gem もある
ar1#RailsDevCon MongoDBにするのは悩み中。AR捨てるのが..
sasata299master-slaveはmasochizm、shardingはoctopusを使ってやってるらしい #RailsDevCon
_shimadaテストデータはfakerで作成 (#railsdevcon live at http://bit.ly/a480k3
agilekawabataテストデータ生成に便利なgem faker #RailsDevCon
oukayuka負荷テスト用のダミーデータを作ってくれるgem > faker #railsdevcon
ClockWorkStudio50万ユーザが3ヶ月遊んだ想定のデータを作成した上でのアクセス負荷試験 #RailsDevCon
DiscoveryCoach負荷テストは50万ユーザが3ヶ月遊んだ想定のデータを作成してm本番想定と同じアクセス負荷をかけて行う。 (#railsdevcon live at http://ustre.am/qnNA)
RailsDevCon負荷テストのためにリリース前に50万ユーザが3ヶ月遊んだ想定のデータを突っ込む。 #RailsDevCon
sasata299"MongoDBを使えば解決するんじゃないか”w #RailsDevCon
ar1#RailsDevCon jmeter + fakerでデータ生成 で、負荷テスト.スループット,DiskIO、コネクション数に注目(webとdb)。
スケールアップで対応できちゃったので,octopus まだ使ってません。でも今使うならコレかなぁと考えています。
MongoDB は試してみたいんですが,Mongo 脳になって綺麗な設計が出来るようになるまでにまた 3 アプリぐらいかかるんだろうな。
負荷テストと監視については YAPC::Asia 2010 での myfinder さんの発表が良かったです。myfinder's blog: YAPC::Asia 2010 でソーシャルアプリのシステム監視運用について Talk してきました

DiscoveryCoach基本、最速でユーザにレスポンスを返す。後は裏で非同期。 (#railsdevcon live at http://ustre.am/qnNA)
ikmTOPへのアクセスをトリガーにして各種ページの準備を事前に実行する、とか #railsdevcon

nogメモ:Resque (#railsdevcon live at http://ustre.am/qnNA)
_shimada非同期処理は Resque。 管理画面あり (#railsdevcon live at http://bit.ly/a480k3
sasata299Resqueで非同期処理をガンガン使ってるみたい。マイページ開いたときにはデータが出来上がってる想定みたいだけど間に合わなかったときはどうするんだろう #RailsDevCon
ar1#RailsDevCon 5秒ルールのせいで、非同期を徹底活用。Resque gemをつかっている。管理画面がいい。バッチ処理も簡単。
ClockWorkStudio非同期実行のgem、rescue。管理画面が便利らしい #RailsDevCon
d6rkaiz#RailsDevCon 非同期で扱うためのgemにresque
ar1#RailsDevCon まとめた処理にactiverecord-importを使っている。
agilekawabata一括insert gem activerecord-import #RailsDevCon
sasata299activerecord-import使うとバルクインサートが楽?へー #RailsDevCon
ClockWorkStudioactiverecord-importでBULK INSERT!! #RailsDevCon
_shimadaResque Scheduler。毎回script/runnerを叩かなくていい (#railsdevcon live at http://bit.ly/a480k3
DiscoveryCoachゆーざーが100万人くらいになると「手抜きかな」と思いながら創った部分が必ず「ボトルネック (#railsdevcon live at http://ustre.am/qnNA)
ikmシビアだ #railsdevcon
oreradioユーザ数数万程度を想定しているコードは全てNG #RailsDevCon
n0tshttps://github.com/zdennis/activerecord-import RT @sasata299: activerecord-import使うとバルクインサートが楽?へー #RailsDevCon
TrinityT「ユーザ数、数万で想定しているコードは全てNG」→バッチで1ユーザあたり1秒かかってたら、一日86400ユーザ分しか処理できない! #RailsDevCon
d6rkaiz#RailsDevCon ユーザ数数万程度のコードは全てNG
そういえば Rails3 から route が Rack に載ったので,sinatra アプリである Resque の管理画面も一緒に動かせるようになりましたね。

ar1#RailsDevCon GAEの設計の意味がわかってくる(w
ikm巨大SNSのユーザ数で自分の技術力が向上 #railsdevcon
DiscoveryCoach巨大SNSから流れてくるユーザ数はエンジニアの甘えを許さない。 (#railsdevcon live at http://ustre.am/qnNA)
junyaURL設計図って rake routes で間に合う気もする #RailsDevCon
_shimada開発中はER図とURL設計書だけで進める (#railsdevcon live at http://bit.ly/a480k3
ysakaki迷ったらRailsっぽく書く。素晴らしい。 #RailsDevCon
ar1#RailsDevCon PDCAを早くするためドキュメントを削減。図の多用。Railsっぽいコードから外れないようなコード。
hs9587#RailsDevCon 「とあるソーシャルアプリの開発運用」 迷う時間を最小限にする: Railsぽいかどうかを考える
ikmRESTfulっていう前提はあるかなぁ RT @junya: URL設計図って rake routes で間に合う気もする #RailsDevCon
nogソーシャルゲームもこういう観点で見ると面白そうだよなー (#railsdevcon live at http://ustre.am/qnNA)
tkawa「正しくwebアプリを作る」それを「正しく」って言い切るのもなぁw (#railsdevcon live at http://ustre.am/qnNA)
johnsmith0707ペアプロで迷う時間を最小限に #RailsDevCon
DiscoveryCoach短納期に対応するひとつの方法。迷う時間を少なくする。=ペアプロ。そしてRailsっぽいかどうかを思考の指針できるように常に考える。 (#railsdevcon live at http://ustre.am/qnNA)
shinodoggドキュメンテーションなくても、RailsっぽいアプリならER図見りゃわかるし、RestっぽいインタフェースならURL見れば分かる。迷ったらRailsっぽくなってるかどうか。くぅー。シビれる。。 #railsdevcon
負荷対策をすればするほど GAE に近づいていっている気がしたので,なるほどあの制限は正しいなと思えるようになりました。一度しっかり RDBMS で戦うと NoSQL や GAE を使うための意識改革が出来るんじゃないかと思います。
URL 設計書は確かに rake routes と中身は同じなんですが,チーム全員で URL を考えるときに 200 行を超える routes.rb だけだと見通しが悪いので,はじめは Excel でやっています。設計が終わって一通り generate し終えたら routes.rb だけ管理で十分ですねー。

ar1#RailsDevCon Plan (常にかんがえる) Check (かってにデータがあつまってくる) 速度をあげる。
ちなみに,天井からぶら下がってるこのモニタのシステムは『グリゴリ』と言います。旧約聖書偽典『エノク書』 (みんな大好きイーノックさん) に出る堕天使の一団。「見張る者」という意味です。
「ユーザーの動きに応じて、PDCAサイクルを異様なほどの超高速で回すのが、ソーシャルゲームの運営だ」 といった話も紹介しようと思ったんですが残り時間が少なかったのでカット。

ar1#RailsDevCon ログの集約、収集にscribeを使ってる!
ikmscribe+messagepack #railsdevcon
ar1#RailsDevCon scribeにつっこむときにmessage-packで圧縮考えてる。
hs9587#RailsDevCon 「とあるソーシャルアプリの開発運用」 scribe 分散した多数のサーバのログの集約が大変
d6rkaiz#RailsDevCon 一日3gbのlogを見るために scribe -> messagepack にするか検討中?
sasata299複数台に分かれたログの収集はscribe使ってる http://d.hatena.ne.jp/perezvon/20100110/1263120529 #RailsDevCon
masaki925ログ転送ライブラリ scribe; scribeサーバに送っておけばscribe 間で転送・エラーハンドリングしてくれる #RailsDevCon
長々と失礼しました。また来年も発表できるよう頑張ります!!