ec2 + s3 + simpledbで無限スケールアウトするサイトを目指す

Post on 28-Jul-2015

379 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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

• @de_12345

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

MyOpenArchive

Whatʼs MyOA

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

世の中に出る研究成果

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

Whatʼs MyOA

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

• 2007.9 サイトオープン

• 2010.12 リニューアル

http://MyOpenArchive.org

http://MyOpenArchive.org

http://MyOpenArchive.org

Requirement

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

Requirement

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

Use AWS!

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

Use AWS!

• Amazon EC2

• Amazon SimpleDB

• Amazon S3

MyOA System

• PHP5.3

• Symfony 1.4

• AMI xxx

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

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

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

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

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

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

• トランザクション弱い

Policy

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

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

• Symfonyのmodelっぽく

Table

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

Table:UserIdUser_idUsernameProfileReal_namePictureUrlLocationEmailBioScribd_usernameScribd_session_keyTwitter_screen_nameTwitter_uidCount Facebook_uid

Table:UserIdUser_idUsernameProfileReal_namePictureUrlLocationEmailBioScribd_usernameScribd_session_keyTwitter_screen_nameTwitter_uidFacebook_uidCount

ユーザー基本情報

ログイン連携情報

PVカウンタ

Table:DocIdDoc_idUrlFilenameResource_kbnUser_idTitleCreatorSubjectDescriptionPublisherContributorDateType

TypeFormatIdentifierSourceLanguageRelationCoverageRightsScribd_doc_idAccess_keySecret_passwordUser_typeThumb_urlCount

Table:DocIdDoc_idUrlFilenameResource_kbnUser_idTitleCreatorSubjectDescriptionPublisherContributorDateType

TypeFormatIdentifierSourceLanguageRelationCoverageRightsScribd_doc_idAccess_keySecret_passwordUser_typeThumb_urlCount

文書メタデータ

Scribd連携情報

PVカウンタ

文書ファイル情報

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

Array

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

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

Symfony with AWS

• Symfonyのmodelっぽく

Symfony with AWS

• AWS for PHP version 2010.09.30

• Amazon S3 PHP class 0.4.0

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

• データ取得

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)

• データ取得

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

• データ取得

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

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

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

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に保存

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

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

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)

登録内容の配列

top related