Inside pixiv's infrastructure〜application cluster side〜

75
inside pixiv’s infrastructure application cluster side久保 達彦 [email protected]

description

Inside pixiv's infrastructure〜application cluster side〜 in PHPカンファレンス2013

Transcript of Inside pixiv's infrastructure〜application cluster side〜

Page 1: Inside pixiv's infrastructure〜application cluster side〜

inside pixiv’s infrastructure〜application cluster side〜

久保 達彦

 [email protected]

Page 2: Inside pixiv's infrastructure〜application cluster side〜

自己紹介

● 久保達彦([email protected])● @cubicdaiya(twitter, github)● シニアソフトウェアエンジニア@pixiv. Inc

Page 3: Inside pixiv's infrastructure〜application cluster side〜

自己紹介

◎ピクシブでの担当分野○ ミドルウェアの開発・運用○ インフラ運用・管理○ アプリケーション開発・メンテ○ 採用活動○ その他色々

Page 4: Inside pixiv's infrastructure〜application cluster side〜

自己紹介

◎開発・公開中のOSS○ mruby_nginx_module

■ Embed mruby into Nginx○ ngx_small_light

■ Dynamic Image Transformation with Nginx○ neoagent

■ Yet Another Memcached Proxy Server○ etc...

Page 5: Inside pixiv's infrastructure〜application cluster side〜

pixivについて

Page 6: Inside pixiv's infrastructure〜application cluster side〜

pixivについて

イラストコミュニケーションサービス

Page 7: Inside pixiv's infrastructure〜application cluster side〜

pixivについて

● Webサイト

○ www.pixiv.net○ m.pixiv.net○ touch.pixiv.net○ dic.pixiv.net○ comic.pixiv.net○ www.pixiv.com

● スマートフォンアプリ

○ iOS、Android● etc...

Page 8: Inside pixiv's infrastructure〜application cluster side〜

pixivについて

会員数 820万人

投稿作品数 38,000,000+ページビュー 38億/月

ネットワーク帯域 10Gbpsサーバ台数 400台

Page 9: Inside pixiv's infrastructure〜application cluster side〜

inside pixiv’s infrastructure

Page 10: Inside pixiv's infrastructure〜application cluster side〜

inside pixiv’s infrastructure

Front Front・・・

Internet

AP AP AP

LVS

DB DB

・・・ ・・・

・・・ DB・・・

・・・ LVS KVS

Other

KVS・・・

Front Front・・・

Cache Cache・・・ Cache・・・

Dispatcher Dispatcher・・・

Origin Origin・・・ Origin・・・

Other・・・

Other Other・・・

application cluster contents delivery cluster

Page 11: Inside pixiv's infrastructure〜application cluster side〜

今日は「application cluster」の話をします

Front Front・・・

Internet

AP AP AP

LVS

DB DB

・・・ ・・・

・・・ DB・・・

・・・ LVS KVS

Other

KVS・・・

Front Front・・・

Cache Cache・・・ Cache・・・

Dispatcher Dispatcher・・・

Origin Origin・・・ Origin・・・

contents delivery cluster

Other・・・

Other Other・・・

application cluster

Page 12: Inside pixiv's infrastructure〜application cluster side〜

画像アップロードのシステムは時間の都合で割愛するので詳しくは過去の資料を参照してください

● pixivの画像アップロードシステムhttp://www.slideshare.net/cubicdaiya/pixiv-6261780

● pixiv thumbnailshttp://www.slideshare.net/cubicdaiya/pixiv-thumbnails/

Page 13: Inside pixiv's infrastructure〜application cluster side〜

トピック

● 開発体制

● Inside application cluster● データストア&キャッシュ戦略

● API for pixiv

Page 14: Inside pixiv's infrastructure〜application cluster side〜

トピック

● 開発体制

● Inside application cluster● データストア&キャッシュ戦略

● API for pixiv

Page 15: Inside pixiv's infrastructure〜application cluster side〜

開発体制

● エンジニア30人くらい

○ インフラチームは5人● 所謂Webアプリケーションの開発はPHPがメイン

○ レガシーなものからモダン(?)なものまで

○ 最近はRuby(Rails)が増えてる

● ミドルウェアはC、C++、Python、Lua等色々

○ PHPで書かれたデーモンもあるよ!

Page 16: Inside pixiv's infrastructure〜application cluster side〜

開発体制

● ソースコードはGitで管理

○ gitosis and github有料プラン(GHE使いたい)○ www.pixiv.netだけで30万行くらいある

● Redmineでタスク管理 with バックログ

● PHPUnitを活用したテストスイート

● IRC活用

○ デプロイや自動テスト失敗時にbotがつぶやく

● 一日数回〜十数回くらい本番にデプロイされる

Page 17: Inside pixiv's infrastructure〜application cluster side〜

トピック

● 開発体制

● Inside application cluster● データストア&キャッシュ戦略

● API for pixiv

Page 18: Inside pixiv's infrastructure〜application cluster side〜

Inside application cluster

Front Front・・・

AP AP AP

LVS

DB DB

・・・ ・・・

・・・ DB・・・

・・・ LVS KVS

Other

KVS・・・

Other・・・

Internet

Page 19: Inside pixiv's infrastructure〜application cluster side〜

Front

Front Front・・・

AP AP AP

LVS

DB DB

・・・ ・・・

・・・ DB・・・

・・・ LVS KVS

Other

KVS・・・

Other・・・

Internet

Page 20: Inside pixiv's infrastructure〜application cluster side〜

Front Internet

Front

■Nginx

ロードバランサー

多目的リバースプロキシ

Page 21: Inside pixiv's infrastructure〜application cluster side〜

AP

Front Front・・・

AP AP AP

LVS

DB DB

・・・ ・・・

・・・ DB・・・

・・・ LVS KVS

Other

KVS・・・

Other・・・

Internet

Page 22: Inside pixiv's infrastructure〜application cluster side〜

AP Internet

AP

● アプリケーションサーバ○ Apache&mod_php○ Nginx&PHP-FPM○ Unicorn&Rails

● ミドルウェア○ APC○ Fluentd○ neoagent○ etc..

Page 23: Inside pixiv's infrastructure〜application cluster side〜

KVS

Front Front・・・

AP AP AP

LVS

DB DB

・・・ ・・・

・・・ DB・・・

・・・ LVS KVS

Other

KVS・・・

Other・・・

Internet

Page 24: Inside pixiv's infrastructure〜application cluster side〜

KVS Internet

KVS

● KyotoTycoon○ 半永続データストレージ○ オンメモリキャッシュ

● MongoDB○ APのFluetndからかき集めたデータ

■ エラーログ■ スロークエリログ■ アクティビティログ■ etc

Page 25: Inside pixiv's infrastructure〜application cluster side〜

DB

Front Front・・・

AP AP AP

LVS

DB DB

・・・ ・・・

・・・ DB・・・

・・・ LVS KVS

Other

KVS・・・

Other・・・

Internet

Page 26: Inside pixiv's infrastructure〜application cluster side〜

DB Internet

DB

● MySQL○ 5.1 or 5.5○ 永続データストレージ

● 前段にLVSがいる

Page 27: Inside pixiv's infrastructure〜application cluster side〜

Other

Front Front・・・

AP AP AP

LVS

DB DB

・・・ ・・・

・・・ DB・・・

・・・ LVS KVS

Other

KVS・・・

Other・・・

Internet

Page 28: Inside pixiv's infrastructure〜application cluster side〜

Other Internet

Other

● 監視系サーバ○ Nagios○ Munin○ リソースモニタWebアプリ

■ written in PHP● 定期実行バッチサーバ

○ almost written in PHP● その他

○ 検索(Apache Solr)○ レコメンデーションシステム○ スタックフィード(タイムライン)○ etc...

Page 29: Inside pixiv's infrastructure〜application cluster side〜

トピック

● 開発体制

● Inside application cluster● データストア&キャッシュ戦略

● API for pixiv

Page 30: Inside pixiv's infrastructure〜application cluster side〜

データストア&キャッシュ戦略 in pixiv

● MySQL○ 永続データストレージ

■ ユーザー、イラスト等、 サービスの根幹に関わるデータを保存

● KyotoTycoon○ 半永続データストレージ

■ 消えても作り直せるデータのみ保存

■ 負荷の大きい箇所や素早い応答が必要な場面で使う

○ オンメモリキャッシュ

■ MySQLから取得して構築したデータをキャッシュ

Page 31: Inside pixiv's infrastructure〜application cluster side〜

データストア&キャッシュ戦略 in pixiv

● APC○ ローカルデータキャッシュ(not オペコードキャッシュ)

● MongoDB○ Capped Collection only○ 一定期間のみ保存するログデータ用

● KVSClient○ 多段キャッシュ(APCとKyotoTycoon)へ

透過的にアクセスするためのライブラリ

Page 32: Inside pixiv's infrastructure〜application cluster side〜

データストア/キャッシングレイヤー

Page 33: Inside pixiv's infrastructure〜application cluster side〜

データストア/キャッシングレイヤー

APC -> KyotoTycoon -> MySQLの順にアクセス

Page 34: Inside pixiv's infrastructure〜application cluster side〜

べたに書くと、

Page 35: Inside pixiv's infrastructure〜application cluster side〜

このコードの問題点

● 複雑

○ キャッシュが二段ある● アプリケーション開発者が知らなければならない事項が多い

○ キャッシュの保持期限(expire)○ 接続先ホスト

○ 接続先ポート番号

● あとで変更するのが大変

○ 複数箇所にコードが散らばる可能性がある

Page 36: Inside pixiv's infrastructure〜application cluster side〜

KVSClient〜The library for accessing to datastore transparently〜

Page 37: Inside pixiv's infrastructure〜application cluster side〜

KVSClientを使うと、

Page 38: Inside pixiv's infrastructure〜application cluster side〜

元のコードと比較

べた書き KVSClientを使う

Page 39: Inside pixiv's infrastructure〜application cluster side〜

詳解KVSClient

Page 40: Inside pixiv's infrastructure〜application cluster side〜

多段キャッシュへの透過的なアクセス

# 実はここでAPC -> KyotoTycoonの順にアクセスしてる

Page 41: Inside pixiv's infrastructure〜application cluster side〜

多段キャッシュへの透過的なアクセス

# 実はここでAPC -> KyotoTycoonの順にアクセスしてる# APCにキャッシュがあればそれを返す

Page 42: Inside pixiv's infrastructure〜application cluster side〜

多段キャッシュへの透過的なアクセス

# 実はここでAPC -> KyotoTycoonの順にアクセスしてる# APCにキャッシュがあればそれを返す# なければKyotoTycoonから取得してAPCにキャッシュ

Page 43: Inside pixiv's infrastructure〜application cluster side〜

KVSClientはすべてを知っている

# $keyに関する設定を探索

Page 44: Inside pixiv's infrastructure〜application cluster side〜

設定はこんな感じ

# $keyに関する設定を探索

Page 45: Inside pixiv's infrastructure〜application cluster side〜

トピック

● 開発体制

● Inside application cluster● データストア&キャッシュ戦略

● API for pixiv

Page 46: Inside pixiv's infrastructure〜application cluster side〜

去年くらいからの話

● Ruby(とRails)によるプロダクトが増え始める

○ 既存のPHPコードとの連携が問題に

○ Rubyで再実装とか㍉(行数的に)● 提携企業向けにAPIを提供する機会がある

○ 昔はその都度イチから開発していた

○ 効率が悪いのでプラットフォーム化したい

Page 47: Inside pixiv's infrastructure〜application cluster side〜

去年くらいからの話

● Ruby(とRails)によるプロダクトが増え始める

○ 既存のPHPコードとの連携が問題に

○ Rubyで再実装とか㍉(行数的に)● 提携企業向けにAPIを提供する機会がある

○ 昔はその都度イチから開発していた

○ 効率が悪いのでプラットフォーム化したい

API作ろう!

Page 48: Inside pixiv's infrastructure〜application cluster side〜

api.pixiv.private

Page 49: Inside pixiv's infrastructure〜application cluster side〜

api.pixiv.private

● pixivのデータを透過的に扱うためのRESTful API群○ written in PHP

● pixiv内部からのみアクセス可能

● HTTP経由でほかの言語からでもアクセス可能

● 単なるPHPのライブラリとして使うこともできる

Page 50: Inside pixiv's infrastructure〜application cluster side〜

GET http://api.pixiv.private/v1/works.json

Page 51: Inside pixiv's infrastructure〜application cluster side〜

活用事例

Page 52: Inside pixiv's infrastructure〜application cluster side〜

www.pixiv.comの場合

Page 53: Inside pixiv's infrastructure〜application cluster side〜

www.pixiv.comの場合

Page 54: Inside pixiv's infrastructure〜application cluster side〜

www.pixiv.comの場合

ここ

Page 55: Inside pixiv's infrastructure〜application cluster side〜

Inside api.pixiv.private

● 全部PHPで書かれてる(過去の資産を活用するため)○ 周辺ツールはRubyで書かれてたりする

● 高速な独自フレームワーク上に構築

○ 当初はSilexを使っていた

○ パフォーマンスに問題があって担当のエンジニアが

開発・移行

■ 現pixivチーム・リーダー

Page 56: Inside pixiv's infrastructure〜application cluster side〜

うわ・・・私のAPIおそすぎ・・・?

pixiv.net は 29ms

ログインするだけの API が 90ms...無料でできるプロファイリング->今すぐチェック

とある開発者の驚愕

Page 57: Inside pixiv's infrastructure〜application cluster side〜

チューニング劇的ビフォーアフター

Page 58: Inside pixiv's infrastructure〜application cluster side〜

最適化前 平均 90ms

最適化後 平均 8ms

Page 59: Inside pixiv's infrastructure〜application cluster side〜

プロファイラ(xhprof)でボトルネックを調査しました。

xhprof masterCyrill

Page 60: Inside pixiv's infrastructure〜application cluster side〜

Silexの初期化が遅い

Page 61: Inside pixiv's infrastructure〜application cluster side〜

ルーティングしたコントローラが1個だと 1.129ms

ルーティングしたコントローラが14個だと 29.178ms

ルーティングが遅い

Page 62: Inside pixiv's infrastructure〜application cluster side〜

実際のところ、Silexが遅いというよりは

● Silex以外にもボトルネックはたくさんあった

● 当時、パフォーマンスは重視されてなかった

● スケジュールがタイトで書きやすさ重視だった

● フレームワークの用途が合ってなかった

Page 63: Inside pixiv's infrastructure〜application cluster side〜

● RESTful APIのための薄いフレームワーク● 所謂Webアプリケーション向けである必要はない● ルーティング以外のことはしなくていい

● もっと先へ、加速したく(ry

僕たちが本当に欲しかったもの

Page 64: Inside pixiv's infrastructure〜application cluster side〜

ぼくがかんがえたさいきょうのAPI専用PHPフレームワーク

−> ルーティングが速い

−> ルーティング以外のことをまったくしないので初期化がめっちょ速いフレームワーク

開発者曰く

Page 65: Inside pixiv's infrastructure〜application cluster side〜

tateseta

Page 66: Inside pixiv's infrastructure〜application cluster side〜

tatesetaThe accelerator, test-enough, simple, easy, tuned application-framework

Page 67: Inside pixiv's infrastructure〜application cluster side〜

というのは建前で本当は縦セーターの略だそうです

Page 68: Inside pixiv's infrastructure〜application cluster side〜

速度比較:初期化

Silex:12.848ms tateseta:1.98ms

Page 69: Inside pixiv's infrastructure〜application cluster side〜

bootstrap tateseta

Page 70: Inside pixiv's infrastructure〜application cluster side〜

Hello, World! by tateseta

GET http://api.pixiv.private/v1/hello.json -> {“msg”: “Hello, World!”}

Page 71: Inside pixiv's infrastructure〜application cluster side〜

HTTP使わなくてもAPIが使える

HTTPリクエストを抽象化してるのでHTTPプロトコルを使わずにAPIを叩くことができる。

Page 72: Inside pixiv's infrastructure〜application cluster side〜

その他の工夫

● require は最小限に抑える

○ ルートが確定したコントローラしか読み込まない● file_existsなどのIO系は遅いので使わない

○ コントローラのphpのファイルの存在チェックしない● できるかぎり正規表現に頼らない(例:preg_match)

○ strpos や explode などで頑張る

Page 73: Inside pixiv's infrastructure〜application cluster side〜

api.pixiv.public

Page 74: Inside pixiv's infrastructure〜application cluster side〜

api.pixiv.public

● api.pixiv.privateのラッパー

● これもtateseta上に構築

● OAuth対応

● スマートフォンアプリ用のAPI群● 3rd Party向けのAPIも提供中

● publicという名前だけど一般公開はしてないです

Page 75: Inside pixiv's infrastructure〜application cluster side〜

● pixivのシステムはいろんな言語やツールでできてる○ PHPは今でも一番使われてます○ 用途や条件に合わせて最適なものを選ぶのがよい

● システムの巨大化・複雑化には抽象化で対抗○ インターフェースだけ決めて隠蔽する

● 近年はRuby(Rails)プロダクトも増えてきている○ RESTful APIでハイブリッド言語開発

まとめ