39
EC2 + S3 + SimpleDB無限スケールアウトする サイトを目指す 2011/2/19 Japan AWS User Group (JAWS) - Osaka勉強会 1

EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Embed Size (px)

Citation preview

Page 1: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

2011/2/19 Japan AWS User Group (JAWS) - Osaka勉強会 第1回

Page 2: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Profile• 伊藤久彰(いとうひさあき)• エンジニア• 大阪勤務• 楽天株式会社(2007.10-)

• @de_12345

• http://www.facebook.com/hisa110

Page 3: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

MyOpenArchive

Page 4: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Whatʼs MyOA

• 文書投稿サイト• 研究成果・論文を投稿する場を提供• 研究成果へのアクセスをオープンに• Creative Commons

Page 5: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す
Page 6: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

世の中に出る研究成果

研究室の外に出ない研究成果

Page 7: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Whatʼs MyOA

• メインメンバー3人、支援者何人か

• 2007.9 サイトオープン

• 2010.12 リニューアル

Page 8: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

http://MyOpenArchive.org

Page 9: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

http://MyOpenArchive.org

Page 10: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

http://MyOpenArchive.org

Page 11: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Requirement

• 世界展開• スモールスタート• 大量の論文ファイル

Page 12: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Requirement

• スケールアップ可能な仕組みに• ハードウェアの初期投資をなくす• データ保存用に大量のディスクが必要

Page 13: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す
Page 14: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Use AWS!

出典:http://aws.amazon.com/jp/economics/

Page 15: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Use AWS!

• Amazon EC2

• Amazon SimpleDB

• Amazon S3

Page 16: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

MyOA System

• PHP5.3

• Symfony 1.4

• AMI xxx

Amazon SimpleDB文書メタデータユーザーデータ

Amazon S3pdfファイルユーザー画像等

Page 17: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

DB• スケールアウトで一番困るのはDB

• Amazon RDSのMySQLも魅力だけどインスタンスごとの増強になる

• レプリケーションとかテーブル分割も面倒• SimpleDBならその心配は無い

Page 18: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Amazon Simple DB• 当面パフォーマンスは大丈夫• 可用性気にしなくていい• つかったリソース分だけ課金• JOINできない

• トランザクション弱い

Page 19: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Policy

• テーブルはできるだけ分けない(User, Docの2テーブルのみ)

• マスタ系の情報は設定ファイルに書いて配列にしてテーブルはつかわない

• Symfonyのmodelっぽく

Page 20: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Table

• テーブルはできるだけ分けない(User, Docの2テーブルのみ)

Page 21: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Table:UserIdUser_idUsernameProfileReal_namePictureUrlLocationEmailBioScribd_usernameScribd_session_keyTwitter_screen_nameTwitter_uidCount Facebook_uid

Page 22: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Table:UserIdUser_idUsernameProfileReal_namePictureUrlLocationEmailBioScribd_usernameScribd_session_keyTwitter_screen_nameTwitter_uidFacebook_uidCount

ユーザー基本情報

ログイン連携情報

PVカウンタ

Page 23: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Table:DocIdDoc_idUrlFilenameResource_kbnUser_idTitleCreatorSubjectDescriptionPublisherContributorDateType

TypeFormatIdentifierSourceLanguageRelationCoverageRightsScribd_doc_idAccess_keySecret_passwordUser_typeThumb_urlCount

Page 24: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Table:DocIdDoc_idUrlFilenameResource_kbnUser_idTitleCreatorSubjectDescriptionPublisherContributorDateType

TypeFormatIdentifierSourceLanguageRelationCoverageRightsScribd_doc_idAccess_keySecret_passwordUser_typeThumb_urlCount

文書メタデータ

Scribd連携情報

PVカウンタ

文書ファイル情報

Page 25: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Tableclass DocObject extends ObjectBase{ public function setId($value){$this->Ary['id']=$value;} public function setDoc_id($value){$this->Ary['doc_id']=$value;}

・・・・・省略・・・・・

public function getAccess_key(){ return $this->getValue('access_key'); } public function getSecret_password(){ return $this->getValue('secret_password'); } public function getUser_type(){ return $this->getValue('user_type'); }

Page 26: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Array

• マスタ系の情報は設定ファイルに書いて配列に

Page 27: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Arrayapp.yml

license: list: by: name: by cccode: by url: http://creativecommons.org/licenses/by/3.0/ picurl: /img/cc/by.png by-nc: name: by-nc cccode: by-nc url: http://creativecommons.org/licenses/by-nc/3.0/ picurl: /img/cc/by-nc.png by-nc-nd: name: by-nc-nd cccode: by-nc-nd url: http://creativecommons.org/licenses/by-nc-nd/3.0/ picurl: /img/cc/by-nc-nd.png by-nc-sa: name: by-nc-sa cccode: by-nc-sa url: http://creativecommons.org/licenses/by-nc-sa/3.0/ picurl: /img/cc/by-nc-sa.png by-sa: name: by-sa cccode: by-sa url: http://creativecommons.org/licenses/by-sa/3.0/ picurl: /img/cc/by-sa.png

Page 28: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Symfony with AWS

• Symfonyのmodelっぽく

Page 29: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

Symfony with AWS

• AWS for PHP version 2010.09.30

• Amazon S3 PHP class 0.4.0

Page 30: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

How to useactions.class.php

<?php

class dActions extends sfActions{ public function executeIndex(sfWebRequest $request) {

・・・・・省略・・・・・

$doc = new Doc(); $this->doc=$doc->getAttr(array("doc_id"=>$doc_id,"user_id"=>$user_id));

• データ取得

Page 31: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

How to useactions.class.php

<?php

class dActions extends sfActions{ public function executeIndex(sfWebRequest $request) {

・・・・・省略・・・・・

$doc = new Doc(); $this->doc=$doc->getAttr(array("doc_id"=>$doc_id,"user_id"=>$user_id));

Modelのインスタンスつくる検索条件(文書IDとユーザーID)

• データ取得

Page 32: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

How to useDoc.class.php

<?phpclass Doc extends SimpledbBase{

SimpledbBase.class.php

<?phpclass SimpledbBase { public function getAttr($where=array(),$ConsistentRead=false){

・・・・・省略(引数からSQL組み立て)・・・・・

$sdb = new AmazonSDB(キー,シークレットキー); $response = $sdb->select($sql);

• データ取得

Page 33: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

How to useDoc.class.php

<?phpclass Doc extends SimpledbBase{

SimpledbBase.class.php

<?phpclass SimpledbBase { public function getAttr($where=array(),$ConsistentRead=false){

・・・・・省略(引数からSQL組み立て)・・・・・

$sdb = new AmazonSDB(キー,シークレットキー); $response = $sdb->select($sql);

• データ取得

AWS for PHP

Page 34: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

How to useactions.class.php

<?php

class doceditActions extends sfActions{ public function executeEditfinish(sfWebRequest $request) {

・・・・・省略・・・・・

$docObject->setId($values['doc_id']); $docObject->setTitle($values['title']); $docObject->setCreator($values['creator']); $docObject->setIdentifier($values['identifier']); $docObject->setRights($values['rights']); $docObject->setDoc_id($values['doc_id']); $doc->save($docObject);

• インサート・アップデート

Page 35: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

How to useactions.class.php

<?php

class doceditActions extends sfActions{ public function executeEditfinish(sfWebRequest $request) {

・・・・・省略・・・・・

$docObject->setId($values['doc_id']); $docObject->setTitle($values['title']); $docObject->setCreator($values['creator']); $docObject->setIdentifier($values['identifier']); $docObject->setRights($values['rights']); $docObject->setDoc_id($values['doc_id']); $doc->save($docObject);

• インサート・アップデート

登録内容をオブジェクトにつめこむ

SimpleDBに保存

Page 36: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

How to useDoc.class.php

<?phpclass Doc extends SimpledbBase{

SimpledbBase.class.php

<?phpclass SimpledbBase { public function save($Obj,$replace_flg=true){

・・・・・省略(Objから登録する配列を組み立てる)・・・・・

$sdb = new AmazonSDB(キー,シークレットキー); $domain=get_called_class(); $response_put = $sdb->put_attributes($domain,$Obj->getId(),$put_arr,$replace_flg );

• インサート・アップデート

Page 37: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す

How to useDoc.class.php

<?phpclass Doc extends SimpledbBase{

SimpledbBase.class.php

<?phpclass SimpledbBase { public function save($Obj,$replace_flg=true){

・・・・・省略(Objから登録する配列を組み立てる)・・・・・

$sdb = new AmazonSDB(キー,シークレットキー); $domain=get_called_class(); $response_put = $sdb->put_attributes($domain,$Obj->getId(),$put_arr,$replace_flg );

• インサート・アップデート

呼び出し元クラス名取得(Doc)

登録内容の配列

Page 38: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す
Page 39: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す