Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Cockatoo

PHPカンファレンス資料の手直し

  • Be the first to comment

Cockatoo

  1. 1. クラウド対応 WEBフレームワーク Cockatoo楽天株式会社 開発部 アーキテクトG窪田 博昭 |2013年3月28日 1
  2. 2. 目次 2
  3. 3. 目次• WEBサイト・システム構成の変遷 – MVCキャスト – PHPの世界 – クラスタ化の始まり – クラスタ化の始まり(並行処理) – APIクラスタ – 分散DB – C10K – そしてクラウドへ• PHPクラウドへ• Cockatoo – Cockatoo概要 – Cockatoo構成例 – Cockatooシーケンス 3
  4. 4. WEBサイト・システム構成の編成 4
  5. 5. MVCモデル 5
  6. 6. MVCモデル インターネット インターネット HTTPレスポンス HTTPリクエストサーバー Controller 表示指示 View ロジック指示 表示項目 Model 6
  7. 7. PHPの世界 7
  8. 8. PHPの世界 インターネット インターネット HTTPレスポンス HTTPリクエストサーバー Controller 表示指示 WEB View ロジック指示 表示項目 Model DB 8
  9. 9. PHPの世界All in one 構成• PHPに限らず大抵のWEBサイトはこの構成• PVが少なければ問題ない• 運用が楽PHP• 非常に効率がいい• フレームワークの選択肢も豊富。ライバルはRailsのみ 9
  10. 10. PHPの世界All in one 構成• PHPに限らず大抵のWEBサイトはこの構成• PVが少なければ問題ない• 運用が楽PHP• 非常に効率がいい• フレームワークの選択肢も豊富。ライバルはRailsのみ終焉• PVが増えてくると簡単に限界に達する• でも1台で捌けなくなって来るとちょっと嬉しい 10
  11. 11. PHPの世界 インターネット インターネット HTTPレスポンス HTTPリクエストサーバー Controller 表示指示 WEB View ロジック指示 表示項目 Model この辺りが ボトルネック DB 11
  12. 12. PHPの世界 インターネット インターネット HTTPレスポンス HTTPリクエストサーバー Controller 表示指示 WEB View ロジック指示 表示項目 ModelDBサーバ DB 12
  13. 13. PHPの世界WEB+DB 構成• 手っ取り早く追い出せるDBを追い出した形• DB自体が重いのでこれだけでも効果的• 運用もそれ程変わらない• DB自体はまだまだ余裕PHP• スタンドアロン型フレームワークで楽出来るのはここまで 13
  14. 14. PHPの世界WEB+DB 構成• 手っ取り早く追い出せるDBを追い出した形• DB自体が重いのでこれだけでも効果的• 運用もそれ程変わらない• DB自体はまだまだ余裕PHP• スタンドアロン型フレームワークで楽出来るのはここまで終焉• PHPのロジックがボトルネックになってくる• この先は辛く厳しい道のり・・・ 14
  15. 15. PHPの世界 インターネット インターネット HTTPレスポンス HTTPリクエストサーバー Controller 表示指示 WEB View ロジック指示 表示項目 Model ボトルネックDBサーバ DB 15
  16. 16. クラスタ化の始まり 16
  17. 17. クラスタ化の始まり インターネット インターネットDBサーバ DB 17
  18. 18. クラスタ化の始まり インターネット インターネットセッション DB DBサーバ DB 18
  19. 19. クラスタ化の始まりWEBクラスタ+DB 構成• 並列化によりPHPロジックのボトルネックを克服• 同時にWEBサーバの冗長化も達成して安定化• だんだん運用が・・・PHP• セッションレプリケーションを自前で書く事になる• 大体のサイトはココ迄で事足りる 19
  20. 20. クラスタ化の始まりWEBクラスタ+DB 構成• 並列化によりPHPロジックのボトルネックを克服• 同時にWEBサーバの冗長化も達成して安定化• だんだん運用が・・・PHP• セッションレプリケーションを自前で書く事になる• 大体のサイトはココ迄で事足りる終焉• DBが悲鳴を上げ始める• キャッシュDB(memcachedなど)導入は延命治療に過ぎません 20
  21. 21. クラスタ化の始まり インターネット インターネットセッション DB DBサーバ DB ボトルネック 21
  22. 22. クラスタ化の始まり インターネット インターネットセッション DBキャッシュ DB DBサーバ DB ボトルネック 22
  23. 23. クラスタ化の始まり(並行処理) 23
  24. 24. クラスタ化の始まり(並行処理) 24
  25. 25. クラスタ化の始まり(並行処理) 25
  26. 26. クラスタ化の始まり(並行処理)WEBクラスタ+DB 構成• 単一リクエストの処理速度が頭打ち・・・• 多くの処理が必要な複雑なページではレスポンスが確保できない• ポータルTOPページや、最初は非表示でJS制御するページなどPHP• そもそもPHPはコンパイル型の言語より処理能力が低い• PHPは並行処理が難しい(ワーカスレッドで解決できない) 26
  27. 27. クラスタ化の始まり(並行処理)WEBクラスタ+DB 構成• 単一リクエストの処理速度が頭打ち・・・• 多くの処理が必要な複雑なページではレスポンスが確保できない• ポータルTOPページや、最初は非表示でJS制御するページなどPHP• そもそもPHPはコンパイル型の言語より処理能力が低い• PHPは並行処理が難しい(ワーカスレッドで解決できない)終焉• レスポンスが遅いよ~~• というかPHPはここ迄の規模をスコープしてない気がする・・・ 27
  28. 28. クラスタ化の始まり(並行処理) インターネット インターネットセッション DBキャッシュ DB ボトルネック ボトルネック ボトルネック DBサーバ DB 28
  29. 29. APIクラスタ 29
  30. 30. APIクラスタ インターネット インターネットセッション DBキャッシュ DB API API API DBサーバ DB 30
  31. 31. APIクラスタAPI API API API API API API API API API 31
  32. 32. APIクラスタWEBクラスタ+APIクラスタ+DB 構成• ロジック部分を切り出しAPI化した形• 処理の共通化も同時に実施でき開発効率UP• WEBサーバの冗長化、ロジック並列化&冗長化を実現PHPでやるの?• PHPで非同期リクエストは一般的で無い(curl_multiとか?)• Javaなどでは一般的な構成(SOAP、JSONなど)• フレームワークを使っててもレンダリングエンジンしか残らない? 32
  33. 33. APIクラスタWEBクラスタ+APIクラスタ+DB 構成• ロジック部分を切り出しAPI化した形• 処理の共通化も同時に実施でき開発効率UP• WEBサーバの冗長化、ロジック並列化&冗長化を実現PHPでやるの?• PHPで非同期リクエストは一般的で無い(curl_multiとか?)• Javaなどでは一般的な構成(SOAP、JSONなど)• フレームワークを使っててもレンダリングエンジンしか残らない?終焉• DBの限界まではイケるでしょう 33
  34. 34. APIクラスタ インターネット インターネットセッション DBキャッシュ DB API API API DBサーバ DB ボトルネック 34
  35. 35. 分散DB 35
  36. 36. 分散DB インターネット インターネットセッション DB API API API 分散 分散 分散 分散 DB DB DB DB 36
  37. 37. 分散DBWEBクラスタ+APIクラスタ+分散DB 構成• MongoDB , Cassandra , Redis, Hibari など• 極端なサーバ数じゃなければこれで大丈夫とことんPHP• かなり大規模なサイトの話• KVSや分散DBのORMなど殆ど無い 37
  38. 38. 分散DBWEBクラスタ+APIクラスタ+分散DB 構成• MongoDB , Cassandra , Redis, Hibari など• 極端なサーバ数じゃなければこれで大丈夫とことんPHP• かなり大規模なサイトの話• KVSや分散DBのORMなど殆ど無い終焉• C10K問題(コネクション数の爆発)Apache(100プロセス×10サーバ)×API (100プロセス×10サーバ)= 100万コネクション 38
  39. 39. 分散DB インターネット インターネットセッション DB ボトルネック API API API 分散 分散 分散 分散 DB DB DB DB 39
  40. 40. C10K 40
  41. 41. C10K インターネット インターネットセッション DB WEB WEB WEB Gateway API API API 分散 分散 分散 分散 DB DB DB DB 41
  42. 42. C10KWEBクラスタ+Gateway+APIクラスタ+分散DB 構成• Gateway導入によってコネクション数を削減• GatewayはWebサーバ毎に設置しても十分効果的• API → 分散DBでも同様(MongoDBならばShardingで解決)とことんPHP• ゲートウェイ実装 NIO & Pipelining が理想 42
  43. 43. C10KWEBクラスタ+Gateway+APIクラスタ+分散DB 構成• Gateway導入によってコネクション数を削減• GatewayはWebサーバ毎に設置しても十分効果的• API → 分散DBでも同様(MongoDBならばShardingで解決)とことんPHP• ゲートウェイ実装 NIO & Pipelining が理想終焉• 運用が破綻する    各種APIサーバの管理は大変そう• システムのある限り、また新たなC10Kがどこかに・・・ 43
  44. 44. C10K インターネット インターネットセッション DB WEB WEB WEB Gateway API API API 分散 分散 分散 分散 DB DB DB DB 44
  45. 45. そしてクラウドへ 45
  46. 46. そしてクラウドへ(イメージ) インターネット インターネット Controller WEB WEB ViewModel API API 分散 分散 分散 分散 DB DB DB DB 46
  47. 47. そしてクラウドへWEBクラウド+APIクラウド+分散DB 構成• WEBクラウド、APIクラウド、の各ホストの事を考えたくない• WEBクラウド→APIクラウドの通信経路をどう解決するか?PHP• PHPでもクラウド出来るぜ!!てきな・・・懸念• 分散DBはどうしよう?• 何処かのC10K• ネットワークインフラの限界はあるのでそっちはそっちで頑張る 47
  48. 48. PHPクラウドへ 48
  49. 49. PHPクラウドへクラウド化への課題• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→APIクラウドの非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面 49
  50. 50. PHPクラウドへクラウド化への課題• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→APIクラウドの非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面 50
  51. 51. PHPクラウドへWEBクラウド→Zookeeper→APIクラウドWEBクラウド→APIクラウドの通信経路をどう解決するか?• ZookeeperでAPIクラウドのノード管理を行うZookeeper• プロセス監視と有効プロセス一覧の提供、通知ができる• プロセスが死亡した場合、自動的に一覧からも削除される• ネームサーバと同様の使い方が可能 /API• 数千を超えるノード監視ができる |- API1 | |- node1• Zookeeper自身もクラスタ構成 | |- node2 | -API2 |- node3 |- node4 51
  52. 52. PHPクラウドへ インターネット インターネット Controller WEB WEBZookeeper View Model API API 分散 分散 分散 分散 DB DB DB DB 52
  53. 53. PHPクラウドへクラウド化への課題• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面 53
  54. 54. PHPクラウドへWEBクラウド→並行リクエスト→APIクラウドØMQで容易に実現できる。(バランシング込み)ØMQ (zoeromq)• 非常に高速(length-value データ構造で高効率)• 特にデバイス(Gatewayで利用)はCと同速度(extention内で完結)• N vs M 通信が簡潔に記述できる• 非同期通信(並行処理)が可能• リコネクト、リトライ、キューイングは勿論自動• 柔軟な通信配線が可能• 1メッセージがマルチパート 54
  55. 55. PHPクラウドへØMQ (zoeromq)class GatewayDaemon { public function __construct($frontDSN,$backDSNs){ $this->frontDSN = $frontDSN; $this->backDSNs = $backDSNs; $this->zmqCtx = new ZMQContext(); $this->zmqSockFront = new ZMQSocket($this->zmqCtx, ZMQ::SOCKET_XREP); $this->zmqSockBack = new ZMQSocket($this->zmqCtx, ZMQ::SOCKET_XREQ); } public function main(){ $this->zmqSockFront->bind($this->frontDSN); foreach($this->backDSNs as $backDSN ) { $this->zmqSockBack->connect($backDSN); } new ZMQDevice(ZMQ::DEVICE_QUEUE,$this->zmqSockFront,$this->zmqSockBack); }} 55
  56. 56. PHPクラウドへ インターネット インターネット Controller WEB WEB φMQZookeeper View Model API API φMQ φMQ 分散 分散 分散 分散 DB DB DB DB 56
  57. 57. PHPクラウドへクラウド化への課題• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面 57
  58. 58. PHPクラウドへClearSilver• Viewでは余計な仕事はしたくない人向け• 高速でシンプルなレンダリングエンジン(C言語)• if / else , for , function call 辺りまでなら十分 <?cs if: S.wiki.login.name ?> <a href="/wiki/default/a/login">Logout</a> <?cs else ?> <a href="/wiki/default/a/signup">Sign up</a> <?cs /if ?> 58
  59. 59. PHPクラウドへクラウド化への課題• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面 59
  60. 60. PHPクラウドへMongoDB• C++で開発された高速DB (NoSQL)• 大量処理に特化• トランザクション不可• リレーション不可• Map/Reduce• Sharding (パーテショニング)• ドキュメントベース• 1000台規模を組む事ができ、勿論C10Kも対応(MongoOS)• Readが速い!=WEB向き 60
  61. 61. PHPクラウドへクラウド化への課題• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面 61
  62. 62. PHPクラウドへCapistrano• Ruby製のデプロイツール• Railsではお馴染み• ターゲットサーバにはSSHしか求めない(特別な準備が必要ない)• シェルベース処理ならなんでも来い Capistranoサーバ オペレーション(on ssh) サーバ サーバ サーバ サーバ 62
  63. 63. そしてクラウドへクラウド化への課題• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面 63
  64. 64. Cockatoo(開発名Albatross) 64
  65. 65. Cockatoo概要 65
  66. 66. Cockatoo特徴• PHP製WEBフレームワーク• シングルポイントを排除 – どのサーバ(1台)が落ちても即時運用は発生しない• 並行処理でリクエストを高速化• WEB→APIの呼び出しはRPCインターフェスで隠蔽• レイアウト(ページの構成)情報を外部ストレージ化(MongoDB)• 開発効率重視 – CMSを搭載(WebUI) – 配置周り(表示位置など)のHTML/CSSは記述不要(CMSで吸収) – マウス操作のレイアウトエディタ(wysiwyg) – All in one 環境 Apache(php)+ClearSilver• Ajax,plain-text,バイナリをサポート 66
  67. 67. アプリケーション&デバイス /wiki /news /news Cockatoo-web RequestParser DeviceSelector LayoutDB LayoutDB device device device (default) (android) (default) SessionDBSessionDB Cockatoo-gateway Cockatoo-action Cockatoo-actionContentsDB Application Application ContentsDB ( wiki ) zookeeper ( yslowview ) Cockatooには複数の独立したアプリケーションが同居できる アプリケーションには複数の   デバイス(同一URLでのコンテンツ出し分け)を設定できる これらの振り分け処理はRequestParser,DeviceSelectorで定義 67
  68. 68. Webページページは独立した複数処理に分割出来る 68
  69. 69. Page / Layout / ComponentsLayout 1:n Components 69
  70. 70. 一般的な3層アーキテクチャInternet Internet Request WEB WEB Call APIs API API Retrieve data DB 70
  71. 71. Cockatoo概要 Internet Internet Request SessionDBLayoutDB Gat page layout MongoDB WEB WEB ReplSetMongoDBReplSet Get components Call APIs Memcache API API Retrieve data ContentsDB MongoDB ReplSet 71
  72. 72. Cockatoo概要 Internet Internet Request SessionDBLayoutDB Gat page layout MongoDBはREADには強く MongoDB WEBアクセスに十分耐える WEB WEB ReplSetMongoDB 性能がある。ReplSet Get components しかしWRITEそれ程でも無いCall APIs Memcache セッションなどは API Memcachedの方が無難 API Retrieve data ContentsDB MongoDB ReplSet 72
  73. 73. Cockatoo概要 Internet Internet Request SessionDBLayoutDB Gat page layout MongoDB WEB WEB ReplSetMongoDBReplSet Get components Call APIs Memcache API APIZookeeper Retrieve data ContentsDB MongoDB ReplSet 73
  74. 74. Cockatoo概要 Internet Internet Request SessionDBLayoutDB Gat page layout MongoDB WEB WEB ReplSetMongoDBReplSet Get components Call APIs Memcache API APIZookeeper Solr Retrieve data ContentsDB MongoDB ReplSet 74
  75. 75. Cockatoo概要 Developer HTML markupLayoutDB Set page layout & Deploy API API settings CMS Batch serversMongoDBReplSet Set components Insert Data API servers API servers Set static contents ContentsDB MongoDB ReplSet 75
  76. 76. CMS ー レイアウトエディタLayout editor 76
  77. 77. CMS - コンポーネントエディタ 77
  78. 78. CMS - ページエディタ 78
  79. 79. Cockatoo構成例 79
  80. 80. Cockatooクラスタ構成(サービス環境) Load Balancer HTTP WEB cloud WEB cloud Web server Web server Web server ClearSilver apache ClearSilver apache ClearSilver apache LayoutDB(replset) cockatoo-web cockatoo-web cockatoo-web φMQ Mongo server φMQ page info Mongo server φMQ Mongo server φMQ php φMQ php MongoDB MongoDB φMQ php cockatoo-gateway cockatoo-gateway MongoDB cockatoo-gateway φMQ φMQ φMQ session data API info API cloudAPI call (RPC) SessionDB API cloud API server API server Memcached server API server Memcached server φMQ php Memcached server φMQ php φMQ php cockatoo-action cockatoo-action session data Memcache Memcache cockatoo-action Memcache business logics query regist ContentsDB(replset) zookeeper cluster Mongo server Zookeeper server Mongo server Zookeeper server Mongo server Zookeeper server MongoDB MongoDB MongoDB zookeeper 80
  81. 81. Cockatooスタンドアロン構成(開発環境) Local machine Blowser HTTP apache LayoutDB ClearSilver cockatoo-web info page API call (function call) Filesystem cockatoo-action session data business logics SessionDB query session data ContentsDB Filesystem FilesystemAPI呼び出しのRPC部分をショートカット(zmq,zookeeper要らない)ストレージ処理も同様に簡素化(Mongo,memcached要らない) 81
  82. 82. クラスタ構成 開発環境 Load Balancer Local machine HTTP Blowser WEB cloud WEB cloud HTTP Web server Web server Web server ClearSilver ClearSilver apache apache LayoutDB ClearSilver apache LayoutDB(replset) ClearSilver apache cockatoo-web cockatoo-web cockatoo-web φMQ Mongo server cockatoo-web info page φMQ page info Mongo server φMQ Mongo server φMQ php φMQ php MongoDB MongoDB Filesystem φMQ php API call (function call) cockatoo-gateway cockatoo-gateway MongoDB cockatoo-gateway φMQ φMQ φMQ session data cockatoo-action session data business logics API info SessionDB API call (RPC) API cloud SessionDB query session data API cloud API server API server Memcached server ContentsDB API server Memcached server φMQ php Memcached server φMQ php φMQ cockatoo-action php Memcache Filesystem session data cockatoo-action cockatoo-action Memcache Memcache Filesystem business logics Deploy query Export registContentsDB(replset) zookeeper cluster Import Tools Mongo server Zookeeper server Mongo server Zookeeper server Mongo server Zookeeper server Packaging MongoDB MongoDB MongoDB zookeeper Capkg 82
  83. 83. Cockatooシーケンス 83
  84. 84. Cockatooシーケンスシーケンス リクエスト 事前Action並列Action 事後Action レンダリング レスポンス 84

    Be the first to comment

    Login to see the comments

  • sma_so

    Feb. 9, 2012
  • TakeshiWatanabe2

    Feb. 9, 2012
  • nntsugu

    Jan. 19, 2013
  • nemurin

    Feb. 18, 2013

PHPカンファレンス資料の手直し

Views

Total views

3,518

On Slideshare

0

From embeds

0

Number of embeds

28

Actions

Downloads

12

Shares

0

Comments

0

Likes

4

×