ec2 + s3 + simpledbで無限スケールアウトするサイトを目指す
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)
登録内容の配列