Post on 01-Nov-2014
description
Is Your App Ready For The
(Hybrid) Cloud?Thijs Feryn
Very%excited%to%be%here%!
THIJS
TAZE
Evangelist
@ThijsFeryn
What%is%Cloud?
“That’s(where(rain(comes(from”
Andrei%Zmievski
Cloud=
Internet
DefiniIon
A%model%for%consumpIon%&%delivery%on%the%internet%where%flexibility%is%essenIal%&%can%be%
guaranteed%through%abstracIon
Internet%as%a%uIlity
Translated%to%what%we%know%&%need
Always%available
Fast%(enough)
Scalability
Up%&%down%vs%out%&%in
Focus%on%using,%do%what%you’re%good%at
Leave%the%rest%to%others
Higher%up%the%stack
Economic%advantages
Less%moneyLess%effortLess%risk
Less%worries
Hybrid%let’s%you%do%that
Hybrid%is%just%a%fancy%way%of%saying
Pick%the%pieces%of%the%puzzle%yourself
Amazon%web%services
✓CompuIng–EC2–ELB–Auto%scaling
✓Storage–S3–EBS
✓Database–RDS–DynamoDB–SimpleDB–ElasIcache–SQS✓CDN–CloudFront
Self\service%Iaas
Windows%Azure
✓CompuIng✓Storage–Blob%storage–Table%storage✓CDN✓SQL%Azure✓Data%sync✓Service%BusSelf\service%Paas
Orchestra
✓Compu5ng✓Database
–Memcached–MySQL&&&RDS–CouchDB–MongoDB–Redis
PHP%Paas%on%top%of%AWS
Combell
Fully%customized%&%managed%soluIons
Easy%peasy,%right?
Single%point%of%failure
Shared%nothing
Nothing%is%local
Distributed%systems
Easy%to%deploy%&%manage?
How%do%you%deal%with
$_SESSIONS?
ReplicaIonR/W%spliang
“Cloud(is(for(green(field(projects”
Maarten%Balliauw
Let’s%do%it%!
Infrastructure
✓Basics–Webservers–MySQL%servers–File%servers✓AddiIonal%servers–Caching%servers–Reverse%proxy%servers✓External%CDN
Single%server%setup
Single%server%setup
✓Developer–Everything%is%local•Files•Databases
✓Sysadmin–Sits%back,%drinks%some%coffee
Single%server%setup
✓Amazon–1%EC2%instance–Local%MySQL%or%RDS%(as%a%service)–Local%files✓Azure–Single%App%deployment–Include%PHP%&%MySQL%in%package%script✓Orchestra–Single%App%deployment–Request%MySQL%database%or%RDS
What%about%the%Cloud?
Separate%MySQL
Separate%MySQL
✓Developer–Change%connecIonstring(s)✓Sysadmin–Sets%up%separate%server–Tunes%for%MySQL
Separate%MySQL
✓Amazon–Extra%EC2%instance%for%MySQL–RDS✓Azure–MySQL%deployment%with%worker%role–Doesn’t%scale%well–Use%SQL%Azure%instead✓Orchestra–By%default%separate–Create%separate%MySQL%database–RDS
What%about%the%Cloud?
MulIple%MySQL’s
MulIple%MySQL’s
✓Developer–Read&write&spliEng&in&code–Connect&to&loadbalanced&hostname
✓Sysadmin–Setup&servers–Configure&replica5on•Master/master•Master/slave
–Add&to&loadbalancing
MulIple%MySQL’s
Use%mysqlnd_ms%for%R/W%spliang%in%case%of%crappy%code{%%%%"myapp":%{%%%%%%%%"master":%{%%%%%%%%%%%%"write_group":%{%%%%%%%%%%%%%%%%"host":%"master.db.myapp.ext",%%%%%%%%%%%%%%%%"port":%"3306"%%%%%%%%%%%%}%%%%%%%%},%%%%%%%%"slave":%{%%%%%%%%%%%%"read_group":%{%%%%%%%%%%%%%%%%"host":%"slave.db.myapp.ext",%%%%%%%%%%%%%%%%"port":%"3306"%%%%%%%%%%%%}%%%%%%%%}%%%%}}
mysqlnd_ms_plugin.ini
mysqlnd_ms.enable=1mysqlnd_ms.ini_file=/path/to/mysqlnd_ms_plugin.ini
php.ini
<?php$mysqli = new mysqli("myapp", "username", "password", "database");$pdo = new PDO('mysql:host=myapp;dbname=database', 'username', 'password');$mysql = mysql_connect("myapp", "username", "password");
ConnecIon%string
MulIple%MySQL’s
✓Amazon–Mul5ple&EC2&instances&with&replica5on&and&loadbalancing–RDS&with&read&replica
✓Azure–Include&PHP&&&MySQL&in&package&script–Doesn’t&scale–Use&SQL&Azure
✓Orchestra–RDS–Xeround
What%about%the%Cloud?
MulIple%web%
servers
MulIple%web%servers
✓Developer–Mul5ple&places&to&deploy–Where&are&my&sta5c&assets?–Sessions?
✓Sysadmin–Mul5ple&servers&behind&loadbalancer–$_SESSION&clustering&via&Memcached&or&s5cky&sessions–Shared&storage
Memcached%session%handler
session.save_handler&=&memcachedsession.save_path=&“mc1.myapp.ext:11211,mc2.myapp.ext:11211”
php.ini
MulIple%Web%servers
✓Amazon–Mul5ple&EC2&instances&–Use&ELB&for&loadbalancing–AMI&for&easy&setup–Config&management&(puppet,&chef,&...)
✓Azure–Out&of&the&box–Tuning&possible
✓Orchestra–Out&of&the&box
What%about%the%Cloud?
Offload%staIc%files
Offload%staIc%files
✓Developer–Sync¤t&assets–Store&new&files&on&external&servers–Use&external&hostname&when&referencing&files
✓Sysadmin–Tune&external&servers&for&sta5c&content–CDN,&perhaps?
Offload%staIc%files
✓Amazon–EC2&instances&for&storage&with&clustered&file&system–S3&buckets
✓Azure–Blob&storage
What%about%the%Cloud?
When%the%
pressure%is%on
Auto%scaling%&%load%balancing
CDN%&%asset%offloading
Reverse%(caching)%proxy
Memcached
Adaptyourcode
Storage
require_once*'Zend/Service/WindowsAzure/Storage/Blob.php';*
$storageClient*=*new*Zend_Service_WindowsAzure_Storage_Blob();$result*=*$storageClientE>putBlob(
'testcontainer',*'example.txt',*'/example.txt'
);*
echo*'Blob*name*is:*'*.*$resultE>Name;
require_once*'Zend/Service/Amazon/S3.php';*
$s3*=*new*Zend_Service_Amazon_S3($my_aws_key,*$my_aws_secret_key);*
$s3E>createBucket("myEownEbucket");*
$s3E>putObject("myEownEbucket/myobject",*"somedata");
echo*$s3E>getObject("myEownEbucket/myobject");
Azure%Blog%storage
Amazon%S3
<?php$storage = Zend_Cloud_StorageService_Factory::getAdapter(array( Zend_Cloud_StorageService_Factory::STORAGE_ADAPTER_KEY => 'Zend_Cloud_StorageService_Adapter_S3', Zend_Cloud_StorageService_Adapter_S3::AWS_ACCESS_KEY => $amazonKey, Zend_Cloud_StorageService_Adapter_S3::AWS_SECRET_KEY => $amazonSecret,));$data = file_get_contents('/my/local/dir/picture.jpg');$returnedData = $storage->storeItem('/my/remote/path/picture.jpg', $data);
Supports%Azure%&%AWS
<?php$storage = Zend_Cloud_StorageService_Factory::getAdapter(array( Zend_Cloud_StorageService_Factory::STORAGE_ADAPTER_KEY => 'Zend_Cloud_StorageService_Adapter_FileSystem', Zend_Cloud_StorageService_Adapter_FileSystem::LOCAL_DIRECTORY => $localDirectory,));$data = file_get_contents('/my/local/dir/picture.jpg');$returnedData = $storage->storeItem('/my/remote/path/picture.jpg', $data);
Even%supports%local%file%system
Put%opIons%in%config%file
Design%paoernse.g.
Dependency&injec5on
Modular&designAbstracIon%
layers
+%W3%Total%Cache
W3%Total%Cache
✓Page&caching&dMemcached&(loadbalanced)d Varnish&(loadbalanced)
✓Database&&&object&cachedMemcached&(loadbalanced)
✓CDNd Push&to&S3&or&Azure&Blob&storage&bucketsd Pull&from&CDN&(CloudFront(or(Azure)d Custom&hostnames
✓Scale&across&EC2&nodes&with&ELB
Deploy%your%code
Deploy%your%code
✓General%deployment%methods–Capistrano–Phing–Puppet%(config%is%code%too)–Version%control%tools
✓Amazon%specific–AMI’s
✓Azure%specific–Scaffolding%&%packaging%%command%line%tool–Upload%packages%in%control%panel
✓Orchestra%specific–Git
Mix%&%match
Management%models%(oAen(forgoBen)
Management%models%(oAen(forgoBen)
Managed%Cloud%is%the%new%dedicated%server
Unmanaged%Cloud%is%virtual%colocaIon
Management%models%(oAen(forgoBen)
Custom%soluIon%at%hoster%under%heavy%SLA
Burst%model%at%unmanaged%vendor
When%to%choose%what?