ec2 + s3 + simpledbで無限スケールアウトするサイトを目指す
TRANSCRIPT
![Page 1: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/1.jpg)
EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す
2011/2/19 Japan AWS User Group (JAWS) - Osaka勉強会 第1回
![Page 2: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/2.jpg)
Profile• 伊藤久彰(いとうひさあき)• エンジニア• 大阪勤務• 楽天株式会社(2007.10-)
• @de_12345
• http://www.facebook.com/hisa110
![Page 3: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/3.jpg)
MyOpenArchive
![Page 4: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/4.jpg)
Whatʼs MyOA
• 文書投稿サイト• 研究成果・論文を投稿する場を提供• 研究成果へのアクセスをオープンに• Creative Commons
![Page 5: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/5.jpg)
![Page 6: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/6.jpg)
世の中に出る研究成果
研究室の外に出ない研究成果
![Page 7: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/7.jpg)
Whatʼs MyOA
• メインメンバー3人、支援者何人か
• 2007.9 サイトオープン
• 2010.12 リニューアル
![Page 8: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/8.jpg)
http://MyOpenArchive.org
![Page 9: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/9.jpg)
http://MyOpenArchive.org
![Page 10: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/10.jpg)
http://MyOpenArchive.org
![Page 11: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/11.jpg)
Requirement
• 世界展開• スモールスタート• 大量の論文ファイル
![Page 12: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/12.jpg)
Requirement
• スケールアップ可能な仕組みに• ハードウェアの初期投資をなくす• データ保存用に大量のディスクが必要
![Page 13: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/13.jpg)
![Page 14: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/14.jpg)
Use AWS!
出典:http://aws.amazon.com/jp/economics/
![Page 15: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/15.jpg)
Use AWS!
• Amazon EC2
• Amazon SimpleDB
• Amazon S3
![Page 16: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/16.jpg)
MyOA System
• PHP5.3
• Symfony 1.4
• AMI xxx
Amazon SimpleDB文書メタデータユーザーデータ
Amazon S3pdfファイルユーザー画像等
![Page 17: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/17.jpg)
DB• スケールアウトで一番困るのはDB
• Amazon RDSのMySQLも魅力だけどインスタンスごとの増強になる
• レプリケーションとかテーブル分割も面倒• SimpleDBならその心配は無い
![Page 18: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/18.jpg)
Amazon Simple DB• 当面パフォーマンスは大丈夫• 可用性気にしなくていい• つかったリソース分だけ課金• JOINできない
• トランザクション弱い
![Page 19: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/19.jpg)
Policy
• テーブルはできるだけ分けない(User, Docの2テーブルのみ)
• マスタ系の情報は設定ファイルに書いて配列にしてテーブルはつかわない
• Symfonyのmodelっぽく
![Page 20: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/20.jpg)
Table
• テーブルはできるだけ分けない(User, Docの2テーブルのみ)
![Page 21: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/21.jpg)
Table:UserIdUser_idUsernameProfileReal_namePictureUrlLocationEmailBioScribd_usernameScribd_session_keyTwitter_screen_nameTwitter_uidCount Facebook_uid
![Page 22: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/22.jpg)
Table:UserIdUser_idUsernameProfileReal_namePictureUrlLocationEmailBioScribd_usernameScribd_session_keyTwitter_screen_nameTwitter_uidFacebook_uidCount
ユーザー基本情報
ログイン連携情報
PVカウンタ
![Page 23: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/23.jpg)
Table:DocIdDoc_idUrlFilenameResource_kbnUser_idTitleCreatorSubjectDescriptionPublisherContributorDateType
TypeFormatIdentifierSourceLanguageRelationCoverageRightsScribd_doc_idAccess_keySecret_passwordUser_typeThumb_urlCount
![Page 24: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/24.jpg)
Table:DocIdDoc_idUrlFilenameResource_kbnUser_idTitleCreatorSubjectDescriptionPublisherContributorDateType
TypeFormatIdentifierSourceLanguageRelationCoverageRightsScribd_doc_idAccess_keySecret_passwordUser_typeThumb_urlCount
文書メタデータ
Scribd連携情報
PVカウンタ
文書ファイル情報
![Page 25: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/25.jpg)
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で無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/26.jpg)
Array
• マスタ系の情報は設定ファイルに書いて配列に
![Page 27: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/27.jpg)
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で無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/28.jpg)
Symfony with AWS
• Symfonyのmodelっぽく
![Page 29: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/29.jpg)
Symfony with AWS
• AWS for PHP version 2010.09.30
• Amazon S3 PHP class 0.4.0
![Page 30: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/30.jpg)
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で無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/31.jpg)
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で無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/32.jpg)
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で無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/33.jpg)
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で無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/34.jpg)
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で無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/35.jpg)
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で無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/36.jpg)
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で無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/37.jpg)
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で無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/38.jpg)
![Page 39: EC2 + S3 + SimpleDBで無限スケールアウトするサイトを目指す](https://reader031.vdocuments.mx/reader031/viewer/2022020101/55720a23497959fc0b8bfff8/html5/thumbnails/39.jpg)