Top Banner
1 楽楽楽楽楽楽 楽楽楽 楽楽楽楽楽楽 G 楽楽 楽楽 2022楽7楽3楽 楽楽楽楽楽楽 WEB 楽楽楽楽楽楽楽 Cockatoo
84

Cockatoo

Jun 24, 2015

Download

Technology

Hiroaki Kubota

PHPカンファレンス資料の手直し
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Cockatoo

1楽天株式会社 開発部 アーキテクト G 窪田 博昭 |2023年4月13日

クラウド対応WEB フレームワーク

Cockatoo

Page 2: Cockatoo

2

目次

Page 3: Cockatoo

3

目次• WEB サイト・システム構成の変遷

– MVC キャスト– PHP の世界– クラスタ化の始まり– クラスタ化の始まり(並行処理)– API クラスタ– 分散 DB

– C10K

– そしてクラウドへ

• PHP クラウドへ• Cockatoo

– Cockatoo 概要– Cockatoo 構成例– Cockatoo シーケンス

Page 4: Cockatoo

4

WEB サイト・システム構成の編成

Page 5: Cockatoo

5

MVC モデル

Page 6: Cockatoo

6

MVC モデル

インターネットインターネット

サーバーController

View

Model

HTTP リクエスト

ロジック指示表示項目

表示指示

HTTP レスポンス

Page 7: Cockatoo

7

PHP の世界

Page 8: Cockatoo

8

PHP の世界

インターネットインターネット

サーバー

WEB

Controller

View

Model

HTTP リクエスト

ロジック指示表示項目

表示指示

HTTP レスポンス

DB

Page 9: Cockatoo

9

PHP の世界

• PHPに限らず大抵のWEBサイトはこの構成• PVが少なければ問題ない• 運用が楽

All in one 構成

PHP

• 非常に効率がいい• フレームワークの選択肢も豊富。ライバルは Rails のみ

Page 10: Cockatoo

10

PHP の世界

• PHPに限らず大抵のWEBサイトはこの構成• PVが少なければ問題ない• 運用が楽

All in one 構成

終焉

• PV が増えてくると簡単に限界に達する• でも1台で捌けなくなって来るとちょっと嬉しい

PHP

• 非常に効率がいい• フレームワークの選択肢も豊富。ライバルは Rails のみ

Page 11: Cockatoo

11

PHP の世界

インターネットインターネット

サーバー

WEB

Controller

View

Model

HTTP リクエスト

ロジック指示表示項目

表示指示

HTTP レスポンス

この辺りがボトルネック

DB

Page 12: Cockatoo

12

DB サーバ

PHP の世界

インターネットインターネット

サーバー

WEB

DB

Controller

View

Model

HTTP リクエスト

ロジック指示表示項目

表示指示

HTTP レスポンス

Page 13: Cockatoo

13

PHP の世界

• 手っ取り早く追い出せるDBを追い出した形• DB自体が重いのでこれだけでも効果的• 運用もそれ程変わらない• DB自体はまだまだ余裕

WEB + DB 構成

PHP

• スタンドアロン型フレームワークで楽出来るのはここまで

Page 14: Cockatoo

14

PHP の世界

• 手っ取り早く追い出せるDBを追い出した形• DB自体が重いのでこれだけでも効果的• 運用もそれ程変わらない• DB自体はまだまだ余裕

WEB + DB 構成

終焉

• PHP のロジックがボトルネックになってくる• この先は辛く厳しい道のり・・・

PHP

• スタンドアロン型フレームワークで楽出来るのはここまで

Page 15: Cockatoo

15

DB サーバDB

PHP の世界

インターネットインターネット

サーバー

WEB

Controller

View

Model

HTTP リクエスト

ロジック指示表示項目

表示指示

HTTP レスポンス

ボトルネック

Page 16: Cockatoo

16

クラスタ化の始まり

Page 17: Cockatoo

17

DB サーバDB

クラスタ化の始まり

インターネットインターネット

Page 18: Cockatoo

18

DB サーバDB

クラスタ化の始まり

インターネットインターネット

セッションDB

Page 19: Cockatoo

19

クラスタ化の始まり

• 並列化によりPHPロジックのボトルネックを克服• 同時にWEBサーバの冗長化も達成して安定化• だんだん運用が・・・

WEB クラスタ+ DB 構成

PHP

• セッションレプリケーションを自前で書く事になる• 大体のサイトはココ迄で事足りる

Page 20: Cockatoo

20

クラスタ化の始まり

• 並列化によりPHPロジックのボトルネックを克服• 同時にWEBサーバの冗長化も達成して安定化• だんだん運用が・・・

WEB クラスタ+ DB 構成

終焉

• DB が悲鳴を上げ始める• キャッシュ DB ( memcached など)導入は延命治療に過ぎません

PHP

• セッションレプリケーションを自前で書く事になる• 大体のサイトはココ迄で事足りる

Page 21: Cockatoo

21

DB サーバDB

クラスタ化の始まり

インターネットインターネット

ボトルネック

セッションDB

Page 22: Cockatoo

22

DB サーバDB

クラスタ化の始まり

インターネットインターネット

ボトルネック

セッションDB

キャッシュDB

Page 23: Cockatoo

23

クラスタ化の始まり(並行処理)

Page 24: Cockatoo

24

クラスタ化の始まり(並行処理)

Page 25: Cockatoo

25

クラスタ化の始まり(並行処理)

Page 26: Cockatoo

26

クラスタ化の始まり(並行処理)

• 単一リクエストの処理速度が頭打ち・・・• 多くの処理が必要な複雑なページではレスポンスが確保できない• ポータルTOPページや、最初は非表示でJS制御するページなど

WEB クラスタ+ DB 構成

PHP

• そもそも PHP はコンパイル型の言語より処理能力が低い• PHP は並行処理が難しい(ワーカスレッドで解決できない)

Page 27: Cockatoo

27

クラスタ化の始まり(並行処理)

• 単一リクエストの処理速度が頭打ち・・・• 多くの処理が必要な複雑なページではレスポンスが確保できない• ポータルTOPページや、最初は非表示でJS制御するページなど

WEB クラスタ+ DB 構成

終焉

• レスポンスが遅いよ~~• というか PHP はここ迄の規模をスコープしてない気がする・・・

PHP

• そもそも PHP はコンパイル型の言語より処理能力が低い• PHP は並行処理が難しい(ワーカスレッドで解決できない)

Page 28: Cockatoo

28

DB サーバDB

クラスタ化の始まり(並行処理)

インターネットインターネット

セッションDB

キャッシュDB

ボトルネック ボトルネック ボトルネック

Page 29: Cockatoo

29

API クラスタ

Page 30: Cockatoo

30

DB サーバDB

API クラスタ

インターネットインターネット

セッションDB

キャッシュDB

API API API

Page 31: Cockatoo

31

API クラスタ

API API API API API API API API API API

Page 32: Cockatoo

32

API クラスタ

• ロジック部分を切り出しAPI化した形• 処理の共通化も同時に実施でき開発効率UP• WEBサーバの冗長化、ロジック並列化&冗長化を実現

WEB クラスタ+ API クラスタ+ DB 構成

PHP でやるの?

• PHP で非同期リクエストは一般的で無い( curl_multi とか?)• Java などでは一般的な構成( SOAP 、 JSON など)• フレームワークを使っててもレンダリングエンジンしか残らない?

Page 33: Cockatoo

33

API クラスタ

• ロジック部分を切り出しAPI化した形• 処理の共通化も同時に実施でき開発効率UP• WEBサーバの冗長化、ロジック並列化&冗長化を実現

WEB クラスタ+ API クラスタ+ DB 構成

終焉

• DB の限界まではイケるでしょう

PHP でやるの?

• PHP で非同期リクエストは一般的で無い( curl_multi とか?)• Java などでは一般的な構成( SOAP 、 JSON など)• フレームワークを使っててもレンダリングエンジンしか残らない?

Page 34: Cockatoo

34

DB サーバDB

API クラスタ

インターネットインターネット

ボトルネック

セッションDB

キャッシュDB

API API API

Page 35: Cockatoo

35

分散 DB

Page 36: Cockatoo

36

分散 DB

インターネットインターネット

セッションDB

API API API

分散DB

分散DB

分散DB

分散DB

Page 37: Cockatoo

37

分散 DB

• MongoDB , Cassandra , Redis, Hibari など• 極端なサーバ数じゃなければこれで大丈夫

WEB クラスタ+ API クラスタ+分散 DB 構成

とことん PHP

• かなり大規模なサイトの話• KVS や分散 DB の ORM など殆ど無い

Page 38: Cockatoo

38

分散 DB

• MongoDB , Cassandra , Redis, Hibari など• 極端なサーバ数じゃなければこれで大丈夫

WEB クラスタ+ API クラスタ+分散 DB 構成

終焉

• C10K 問題(コネクション数の爆発)Apache ( 100 プロセス ×10 サーバ) ×API ( 100 プロセス ×10 サーバ)= 100万コネクション

とことん PHP

• かなり大規模なサイトの話• KVS や分散 DB の ORM など殆ど無い

Page 39: Cockatoo

39

分散 DB

インターネットインターネット

セッションDB

API API API

分散DB

分散DB

分散DB

分散DB

ボトルネック

Page 40: Cockatoo

40

C10K

Page 41: Cockatoo

41

C10K

インターネットインターネット

セッションDB

API API API

分散DB

分散DB

分散DB

分散DB

Gateway

WEB WEB WEB

Page 42: Cockatoo

42

C10K

• Gateway導入によってコネクション数を削減• GatewayはWebサーバ毎に設置しても十分効果的• API → 分散DBでも同様(MongoDBならばShardingで解決)

WEB クラスタ+ Gateway + API クラスタ+分散 DB 構成

とことん PHP

• ゲートウェイ実装NIO & Pipelining が理想

Page 43: Cockatoo

43

C10K

• Gateway導入によってコネクション数を削減• GatewayはWebサーバ毎に設置しても十分効果的• API → 分散DBでも同様(MongoDBならばShardingで解決)

WEB クラスタ+ Gateway + API クラスタ+分散 DB 構成

とことん PHP

• ゲートウェイ実装NIO & Pipelining が理想

終焉

• 運用が破綻する    各種 API サーバの管理は大変そう• システムのある限り、また新たな C10K がどこかに・・・

Page 44: Cockatoo

44

C10K

インターネットインターネット

セッションDB

API API API

分散DB

分散DB

分散DB

分散DB

Gateway

WEB WEB WEB

Page 45: Cockatoo

45

そしてクラウドへ

Page 46: Cockatoo

46

そしてクラウドへ(イメージ)

インターネットインターネット

WEBWEB

APIAPI

分散DB

分散DB

分散DB

分散DB

Controller

View

Model

Page 47: Cockatoo

47

そしてクラウドへ

• WEBクラウド、APIクラウド、の各ホストの事を考えたくない• WEBクラウド→APIクラウドの通信経路をどう解決するか?

WEB クラウド+ API クラウド+分散 DB 構成

PHP

• PHP でもクラウド出来るぜ!!てきな・・・

懸念

• 分散 DB はどうしよう?• 何処かの C10K

• ネットワークインフラの限界はあるのでそっちはそっちで頑張る

Page 48: Cockatoo

48

PHP クラウドへ

Page 49: Cockatoo

49

PHP クラウドへ

• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→APIクラウドの非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面

クラウド化への課題

Page 50: Cockatoo

50

PHP クラウドへ

• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→APIクラウドの非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面

クラウド化への課題

Page 51: Cockatoo

51

PHP クラウドへ

WEBクラウド→APIクラウドの通信経路をどう解決するか?• ZookeeperでAPIクラウドのノード管理を行う

WEB クラウド→ Zookeeper→API クラウド

Zookeeper

• プロセス監視と有効プロセス一覧の提供、通知ができる• プロセスが死亡した場合、自動的に一覧からも削除される• ネームサーバと同様の使い方が可能• 数千を超えるノード監視ができる• Zookeeper 自身もクラスタ構成

/API

|- API1

| |- node1

| |- node2

| -API2

|- node3

|- node4

Page 52: Cockatoo

52

PHP クラウドへ

インターネットインターネット

WEBWEB

APIAPI

分散DB

分散DB

分散DB

分散DB

Controller

View

Model

Zookeeper

Page 53: Cockatoo

53

PHP クラウドへ

• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面

クラウド化への課題

Page 54: Cockatoo

54

PHP クラウドへ

ØMQ で容易に実現できる。(バランシング込み)

WEBクラウド→並行リクエスト→ APIクラウド

ØMQ ( zoeromq )

• 非常に高速( length-value データ構造で高効率)• 特にデバイス( Gateway で利用)は C と同速度( extention内で完結)• N vs M 通信が簡潔に記述できる• 非同期通信(並行処理)が可能• リコネクト、リトライ、キューイングは勿論自動• 柔軟な通信配線が可能• 1メッセージがマルチパート

Page 55: Cockatoo

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); }}

Page 56: Cockatoo

56

PHP クラウドへ

インターネットインターネット

WEBWEB

APIAPI

分散DB

分散DB

分散DB

分散DB

Controller

View

Model

ZookeeperφMQ

φMQ φMQ

Page 57: Cockatoo

57

PHP クラウドへ

• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面

クラウド化への課題

Page 58: Cockatoo

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 ?>

Page 59: Cockatoo

59

PHP クラウドへ

• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面

クラウド化への課題

Page 60: Cockatoo

60

PHP クラウドへ

MongoDB

• C++ で開発された高速 DB ( NoSQL )• 大量処理に特化• トランザクション不可• リレーション不可• Map/Reduce

• Sharding (パーテショニング)• ドキュメントベース• 1000 台規模を組む事ができ、勿論 C10K も対応( MongoOS )• Read が速い!=WEB向き

Page 61: Cockatoo

61

PHP クラウドへ

• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面

クラウド化への課題

Page 62: Cockatoo

62

PHP クラウドへ

Capistrano

• Ruby製のデプロイツール• Rails ではお馴染み• ターゲットサーバには SSH しか求めない(特別な準備が必要ない)• シェルベース処理ならなんでも来い

Capistrano サーバ

サーバ サーバ サーバ サーバ

オペレーション (on ssh)

Page 63: Cockatoo

63

そしてクラウドへ

• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面

クラウド化への課題

Page 64: Cockatoo

64

Cockatoo (開発名 Albatross )

Page 65: Cockatoo

65

Cockatoo 概要

Page 66: Cockatoo

66

Cockatoo

特徴

• PHP製WEB フレームワーク• シングルポイントを排除

– どのサーバ(1台)が落ちても即時運用は発生しない

• 並行処理でリクエストを高速化• WEB→API の呼び出しは RPC インターフェスで隠蔽• レイアウト(ページの構成)情報を外部ストレージ化( MongoDB )• 開発効率重視

– CMS を搭載( WebUI )– 配置周り(表示位置など)の HTML/CSS は記述不要( CMS で吸収)– マウス操作のレイアウトエディタ( wysiwyg )– All in one 環境 Apache(php)+ClearSilver

• Ajax,plain-text, バイナリをサポート

Page 67: Cockatoo

67

Cockatoo-webDeviceSelector

Cockatoo-action Cockatoo-action

Cockatoo-gateway

アプリケーション & デバイス

Cockatoo には複数の独立したアプリケーションが同居できるアプリケーションには複数の  デバイス(同一 URL でのコンテンツ出し分け)を設定できるこれらの振り分け処理は RequestParser,DeviceSelector で定義

RequestParser

Application ( wiki )

device (default)

device (android)

/news/wiki

/news

LayoutDB

SessionDB

zookeeperContentsDBApplication

( yslowview )

LayoutDB

SessionDB

ContentsDB

device (default)

Page 68: Cockatoo

68

Web ページ

ページは独立した複数処理に分割出来る

Page 69: Cockatoo

69

Page / Layout / Components

Page 1 : 1 Layout 1 : n Components

Page 70: Cockatoo

70

一般的な3層アーキテクチャ

InternetInternet

WEBWEB

APIAPI

DB

Request

Call APIs

Retrieve data

Page 71: Cockatoo

71

Cockatoo 概要

InternetInternet

WEBWEB

APIAPI

ContentsDB MongoDB ReplSet

RequestLayoutDB

MongoDB ReplSet Call APIs

Retrieve data

Get components

SessionDB

MongoDB ReplSet

Memcache

Gat page layout

Page 72: Cockatoo

72

Cockatoo 概要

InternetInternet

WEBWEB

APIAPI

ContentsDB MongoDB ReplSet

RequestLayoutDB

MongoDB ReplSet Call APIs

Retrieve data

Get components

SessionDB

MongoDB ReplSet

Memcache

Gat page layoutMongoDB は READ には強く WEB アクセスに十分耐える性能がある。

しかし WRITE それ程でも無いセッションなどは Memcached の方が無難

Page 73: Cockatoo

73

Cockatoo 概要

InternetInternet

WEBWEB

APIAPI

ContentsDB MongoDB ReplSet

RequestLayoutDB

MongoDB ReplSet Call APIs

Retrieve data

Get components

SessionDB

MongoDB ReplSet

Memcache

Gat page layout

Zookeeper

Page 74: Cockatoo

74

Cockatoo 概要

InternetInternet

WEBWEB

APIAPI

ContentsDB MongoDB ReplSet

RequestLayoutDB

MongoDB ReplSet Call APIs

Retrieve data

Get components

SessionDB

MongoDB ReplSet

Memcache

Gat page layout

Zookeeper Solr

Page 75: Cockatoo

75

CMS

Developer

Cockatoo 概要

API serversAPI servers

ContentsDB MongoDB ReplSet

Set page layoutHTML markup &API settings

LayoutDB

MongoDB ReplSet

Deploy API

Set components

Batch servers

Insert Data

Set static contents

Page 76: Cockatoo

76

CMS ー レイアウトエディタ

Layout editor

Page 77: Cockatoo

77

CMS - コンポーネントエディタ

Page 78: Cockatoo

78

CMS - ページエディタ

Page 79: Cockatoo

79

Cockatoo 構成例

Page 80: Cockatoo

80

LayoutDB(replset)

zookeeper cluster

API cloudAPI cloud

Zookeeper server

WEB cloudWEB cloud

Web server

apache

cockatoo-webφMQ

ClearSilver

php

cockatoo-gatewayφMQ

φMQ

API server

php

cockatoo-actionφMQ

Web server

apache

cockatoo-webφMQ

ClearSilver

php

cockatoo-gatewayφMQ

φMQ

API server

php

cockatoo-actionφMQ

Web server

apache

cockatoo-webφMQ

ClearSilver

php

cockatoo-gatewayφMQ

φMQ

API server

php

cockatoo-actionφMQ

Zookeeper serverZookeeper server

zookeeper

Mongo server

MongoDB

Mongo server

MongoDB

Mongo server

MongoDB

ContentsDB(replset)

Mongo server

MongoDB

Mongo server

MongoDB

Mongo server

MongoDB

SessionDB

Memcached server

Memcache

Memcached server

Memcache

Memcached server

Memcache

HTTP

page info

session data

API info

API call (RPC)

query

session data

regist

Load Balancer

business logics

Cockatoo クラスタ構成(サービス環境)

Page 81: Cockatoo

81

Local machine

LayoutDBapache

cockatoo-webClearSilver

cockatoo-action

Filesystem

ContentsDB

Filesystem

SessionDB

Filesystem

HTTP

page info

session data

API call (function call)

query session data

Blowser

business logics

Cockatoo スタンドアロン構成(開発環境)

API呼び出しの RPC 部分をショートカット( zmq,zookeeper 要らない)ストレージ処理も同様に簡素化( Mongo,memcached 要らない)

Page 82: Cockatoo

82

API cloudAPI cloud

WEB cloudWEB cloud

Web server

apache

cockatoo-webφMQ

ClearSilver

php

cockatoo-gatewayφMQ

φMQ

API server

php

cockatoo-actionφMQ

Web server

apache

cockatoo-webφMQ

ClearSilver

php

cockatoo-gatewayφMQ

φMQ

API server

php

cockatoo-actionφMQ

Web server

apache

cockatoo-webφMQ

ClearSilver

php

cockatoo-gatewayφMQ

φMQ

API server

php

cockatoo-actionφMQ

クラスタ構成

HTTP

page info

session data

API info

API call (RPC)

session data

Load Balancer Local machine

apache

cockatoo-webClearSilver

cockatoo-action

HTTP

page info

session data

API call (function call)

query session data

Blowser

開発環境

LayoutDB

Filesystem

SessionDB

ContentsDB

FilesystemFilesystem

zookeeper cluster

Zookeeper serverZookeeper server

Zookeeper server

zookeeper

ContentsDB(replset)

Mongo server

MongoDB

Mongo server

MongoDB

Mongo server

MongoDB

query regist

LayoutDB(replset)

Mongo server

MongoDB

Mongo server

MongoDB

Mongo server

MongoDB

SessionDB

Memcached server

Memcache

Memcached server

Memcache

Memcached server

Memcache

Tools

business logics

business logics

Capkg

Packaging

DeployExport

Import

Page 83: Cockatoo

83

Cockatoo シーケンス

Page 84: Cockatoo

84

Cockatoo シーケンス

シーケンス

並列 Action

事前 Action

事後 Action

リクエスト

レスポンス

レンダリング