Your SlideShare is downloading. ×
Inside pixiv's infrastructure〜application cluster side〜
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Inside pixiv's infrastructure〜application cluster side〜

9,261
views

Published on

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

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

Published in: Technology

0 Comments
49 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
9,261
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
46
Comments
0
Likes
49
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. inside pixiv’s infrastructure 〜application cluster side〜 久保 達彦  bokko@pixiv.com
  • 2. 自己紹介 ● 久保達彦(bokko@pixiv.com) ● @cubicdaiya(twitter, github) ● シニアソフトウェアエンジニア@pixiv. Inc
  • 3. 自己紹介 ◎ピクシブでの担当分野 ○ ミドルウェアの開発・運用 ○ インフラ運用・管理 ○ アプリケーション開発・メンテ ○ 採用活動 ○ その他色々
  • 4. 自己紹介 ◎開発・公開中のOSS ○ mruby_nginx_module ■ Embed mruby into Nginx ○ ngx_small_light ■ Dynamic Image Transformation with Nginx ○ neoagent ■ Yet Another Memcached Proxy Server ○ etc...
  • 5. pixivについて
  • 6. pixivについて イラストコミュニケーションサービス
  • 7. pixivについて ● Webサイト ○ www.pixiv.net ○ m.pixiv.net ○ touch.pixiv.net ○ dic.pixiv.net ○ comic.pixiv.net ○ www.pixiv.com ● スマートフォンアプリ ○ iOS、Android ● etc...
  • 8. pixivについて 会員数 820万人 投稿作品数 38,000,000+ ページビュー 38億/月 ネットワーク帯域 10Gbps サーバ台数 400台
  • 9. inside pixiv’s infrastructure
  • 10. 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
  • 11. 今日は「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
  • 12. 画像アップロードのシステムは時間の都合で 割愛するので詳しくは過去の資料を参照してください ● pixivの画像アップロードシステム http://www.slideshare.net/cubicdaiya/pixiv-6261780 ● pixiv thumbnails http://www.slideshare.net/cubicdaiya/pixiv-thumbnails/
  • 13. トピック ● 開発体制 ● Inside application cluster ● データストア&キャッシュ戦略 ● API for pixiv
  • 14. トピック ● 開発体制 ● Inside application cluster ● データストア&キャッシュ戦略 ● API for pixiv
  • 15. 開発体制 ● エンジニア30人くらい ○ インフラチームは5人 ● 所謂Webアプリケーションの開発はPHPがメイン ○ レガシーなものからモダン(?)なものまで ○ 最近はRuby(Rails)が増えてる ● ミドルウェアはC、C++、Python、Lua等色々 ○ PHPで書かれたデーモンもあるよ!
  • 16. 開発体制 ● ソースコードはGitで管理 ○ gitosis and github有料プラン(GHE使いたい) ○ www.pixiv.netだけで30万行くらいある ● Redmineでタスク管理 with バックログ ● PHPUnitを活用したテストスイート ● IRC活用 ○ デプロイや自動テスト失敗時にbotがつぶやく ● 一日数回〜十数回くらい本番にデプロイされる
  • 17. トピック ● 開発体制 ● Inside application cluster ● データストア&キャッシュ戦略 ● API for pixiv
  • 18. Inside application cluster Front Front・・・ AP AP AP LVS DB DB ・・・ ・・・ ・・・ DB・・・ ・・・ LVS KVS Other KVS・・・ Other・・・ Internet
  • 19. Front Front Front・・・ AP AP AP LVS DB DB ・・・ ・・・ ・・・ DB・・・ ・・・ LVS KVS Other KVS・・・ Other・・・ Internet
  • 20. Front Internet Front ■Nginx ロードバランサー 兼 多目的リバースプロキシ
  • 21. AP Front Front・・・ AP AP AP LVS DB DB ・・・ ・・・ ・・・ DB・・・ ・・・ LVS KVS Other KVS・・・ Other・・・ Internet
  • 22. AP Internet AP ● アプリケーションサーバ ○ Apache&mod_php ○ Nginx&PHP-FPM ○ Unicorn&Rails ● ミドルウェア ○ APC ○ Fluentd ○ neoagent ○ etc..
  • 23. KVS Front Front・・・ AP AP AP LVS DB DB ・・・ ・・・ ・・・ DB・・・ ・・・ LVS KVS Other KVS・・・ Other・・・ Internet
  • 24. KVS Internet KVS ● KyotoTycoon ○ 半永続データストレージ ○ オンメモリキャッシュ ● MongoDB ○ APのFluetndからかき集めたデータ ■ エラーログ ■ スロークエリログ ■ アクティビティログ ■ etc
  • 25. DB Front Front・・・ AP AP AP LVS DB DB ・・・ ・・・ ・・・ DB・・・ ・・・ LVS KVS Other KVS・・・ Other・・・ Internet
  • 26. DB Internet DB ● MySQL ○ 5.1 or 5.5 ○ 永続データストレージ ● 前段にLVSがいる
  • 27. Other Front Front・・・ AP AP AP LVS DB DB ・・・ ・・・ ・・・ DB・・・ ・・・ LVS KVS Other KVS・・・ Other・・・ Internet
  • 28. Other Internet Other ● 監視系サーバ ○ Nagios ○ Munin ○ リソースモニタWebアプリ ■ written in PHP ● 定期実行バッチサーバ ○ almost written in PHP ● その他 ○ 検索(Apache Solr) ○ レコメンデーションシステム ○ スタックフィード(タイムライン) ○ etc...
  • 29. トピック ● 開発体制 ● Inside application cluster ● データストア&キャッシュ戦略 ● API for pixiv
  • 30. データストア&キャッシュ戦略 in pixiv ● MySQL ○ 永続データストレージ ■ ユーザー、イラスト等、 サービスの根幹に関わるデータを保存 ● KyotoTycoon ○ 半永続データストレージ ■ 消えても作り直せるデータのみ保存 ■ 負荷の大きい箇所や素早い応答が必要な場面で使う ○ オンメモリキャッシュ ■ MySQLから取得して構築したデータをキャッシュ
  • 31. データストア&キャッシュ戦略 in pixiv ● APC ○ ローカルデータキャッシュ(not オペコードキャッシュ) ● MongoDB ○ Capped Collection only ○ 一定期間のみ保存するログデータ用 ● KVSClient ○ 多段キャッシュ(APCとKyotoTycoon)へ 透過的にアクセスするためのライブラリ
  • 32. データストア/キャッシングレイヤー
  • 33. データストア/キャッシングレイヤー APC -> KyotoTycoon -> MySQLの順にアクセス
  • 34. べたに書くと、
  • 35. このコードの問題点 ● 複雑 ○ キャッシュが二段ある ● アプリケーション開発者が知らなければならない事項が多い ○ キャッシュの保持期限(expire) ○ 接続先ホスト ○ 接続先ポート番号 ● あとで変更するのが大変 ○ 複数箇所にコードが散らばる可能性がある
  • 36. KVSClient 〜The library for accessing to datastore transparently〜
  • 37. KVSClientを使うと、
  • 38. 元のコードと比較 べた書き KVSClientを使う
  • 39. 詳解KVSClient
  • 40. 多段キャッシュへの透過的なアクセス # 実はここでAPC -> KyotoTycoonの順にアクセスしてる
  • 41. 多段キャッシュへの透過的なアクセス # 実はここでAPC -> KyotoTycoonの順にアクセスしてる # APCにキャッシュがあればそれを返す
  • 42. 多段キャッシュへの透過的なアクセス # 実はここでAPC -> KyotoTycoonの順にアクセスしてる # APCにキャッシュがあればそれを返す # なければKyotoTycoonから取得してAPCにキャッシュ
  • 43. KVSClientはすべてを知っている # $keyに関する設定を探索
  • 44. 設定はこんな感じ # $keyに関する設定を探索
  • 45. トピック ● 開発体制 ● Inside application cluster ● データストア&キャッシュ戦略 ● API for pixiv
  • 46. 去年くらいからの話 ● Ruby(とRails)によるプロダクトが増え始める ○ 既存のPHPコードとの連携が問題に ○ Rubyで再実装とか㍉(行数的に) ● 提携企業向けにAPIを提供する機会がある ○ 昔はその都度イチから開発していた ○ 効率が悪いのでプラットフォーム化したい
  • 47. 去年くらいからの話 ● Ruby(とRails)によるプロダクトが増え始める ○ 既存のPHPコードとの連携が問題に ○ Rubyで再実装とか㍉(行数的に) ● 提携企業向けにAPIを提供する機会がある ○ 昔はその都度イチから開発していた ○ 効率が悪いのでプラットフォーム化したい API作ろう!
  • 48. api.pixiv.private
  • 49. api.pixiv.private ● pixivのデータを透過的に扱うためのRESTful API群 ○ written in PHP ● pixiv内部からのみアクセス可能 ● HTTP経由でほかの言語からでもアクセス可能 ● 単なるPHPのライブラリとして使うこともできる
  • 50. GET http://api.pixiv.private/v1/works.json
  • 51. 活用事例
  • 52. www.pixiv.comの場合
  • 53. www.pixiv.comの場合
  • 54. www.pixiv.comの場合 ここ
  • 55. Inside api.pixiv.private ● 全部PHPで書かれてる(過去の資産を活用するため) ○ 周辺ツールはRubyで書かれてたりする ● 高速な独自フレームワーク上に構築 ○ 当初はSilexを使っていた ○ パフォーマンスに問題があって担当のエンジニアが 開発・移行 ■ 現pixivチーム・リーダー
  • 56. うわ・・・私のAPIおそすぎ・・・? pixiv.net は 29ms ログインするだけの API が 90ms... 無料でできるプロファイリング ->今すぐチェック とある開発者の驚愕
  • 57. チューニング劇的ビフォーアフター
  • 58. 最適化前 平均 90ms 最適化後 平均 8ms
  • 59. プロファイラ(xhprof)で ボトルネックを調査しました。 xhprof master Cyrill
  • 60. Silexの初期化が遅い
  • 61. ルーティングしたコントローラ が1個だと 1.129ms ルーティングしたコントローラ が14個だと 29.178ms ルーティングが遅い
  • 62. 実際のところ、Silexが遅いというよりは ● Silex以外にもボトルネックはたくさんあった ● 当時、パフォーマンスは重視されてなかった ● スケジュールがタイトで書きやすさ重視だった ● フレームワークの用途が合ってなかった
  • 63. ● RESTful APIのための薄いフレームワーク ● 所謂Webアプリケーション向けである必要はない ● ルーティング以外のことはしなくていい ● もっと先へ、加速したく(ry 僕たちが本当に欲しかったもの
  • 64. ぼくがかんがえたさいきょうのAPI 専用PHPフレームワーク −> ルーティングが速い −> ルーティング以外のことをまっ たくしないので初期化が めっちょ速いフレームワーク 開発者曰く
  • 65. tateseta
  • 66. tateseta The accelerator, test-enough, simple, easy, tuned application-framework
  • 67. というのは建前で 本当は縦セーターの略だそうです
  • 68. 速度比較:初期化 Silex:12.848ms tateseta:1.98ms
  • 69. bootstrap tateseta
  • 70. Hello, World! by tateseta GET http://api.pixiv.private/v1/hello.json -> {“msg”: “Hello, World!”}
  • 71. HTTP使わなくてもAPIが使える HTTPリクエストを抽象化してるので HTTPプロトコルを使わずにAPIを叩くことができる。
  • 72. その他の工夫 ● require は最小限に抑える ○ ルートが確定したコントローラしか読み込まない ● file_existsなどのIO系は遅いので使わない ○ コントローラのphpのファイルの存在チェックしない ● できるかぎり正規表現に頼らない(例:preg_match) ○ strpos や explode などで頑張る
  • 73. api.pixiv.public
  • 74. api.pixiv.public ● api.pixiv.privateのラッパー ● これもtateseta上に構築 ● OAuth対応 ● スマートフォンアプリ用のAPI群 ● 3rd Party向けのAPIも提供中 ● publicという名前だけど一般公開はしてないです
  • 75. ● pixivのシステムはいろんな言語やツールでできてる ○ PHPは今でも一番使われてます ○ 用途や条件に合わせて最適なものを選ぶのがよい ● システムの巨大化・複雑化には抽象化で対抗 ○ インターフェースだけ決めて隠蔽する ● 近年はRuby(Rails)プロダクトも増えてきている ○ RESTful APIでハイブリッド言語開発 まとめ

×