SlideShare a Scribd company logo
Develop	
  &	
  deploy	
  using	
  hybrid	
  cloud	
  strategies




Thijs	
  Feryn
Evangelist
+32	
  (0)9	
  218	
  79	
  06
thijs@combellgroup.com
Very	
  excited	
  to	
  be	
  here	
  !
THIJS
Hybrid Cloud PHPUK2012
TAZE
Evangelist
Hybrid Cloud PHPUK2012
Hybrid Cloud PHPUK2012
Hybrid Cloud PHPUK2012
@ThijsFeryn
Please	
  
   rate	
  my	
  talk	
  on	
  
       Joind.in




https://joind.in/4951
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
Hybrid Cloud PHPUK2012
Higher	
  up	
  the	
  stack
Economic	
  advantages
Less	
  money
 Less	
  effort
  Less	
  risk
Less	
  worries
Hybrid	
  let’s	
  you	
  do	
  that
Hybrid	
  is	
  just	
  a	
  fancy	
  way	
  of	
  saying
Pick	
  the	
  pieces	
  of	
  the	
  puzzle	
  yourself
Hybrid Cloud PHPUK2012
Amazon	
  web	
  services

 ✓CompuIng ✓Database
  –EC2       –RDS
  –ELB       –DynamoDB
  –Auto	
    –SimpleDB
   scaling   –ElasIcache
 ✓Storage    –SQS
  –S3       ✓CDN
  –EBS       –CloudFront
                 Self-­‐service	
  Iaas
Windows	
  Azure

               ✓CompuIng
               ✓Storage
                –Blog	
  storage
                –Table	
  storage
               ✓CDN
               ✓SQL	
  Azure
               ✓Data	
  sync
               ✓Service	
  Bus

                   Self-­‐service	
  Paas
Orchestra



            ✓CompuLng
            ✓Database
              –Memcached
              –MySQL	
  &	
  RDS
              –CouchDB
              –MongoDB
              –Redis
     PHP	
  Paas	
  on	
  top	
  of	
  AWS
CloudFlare



             ✓CDN
             ✓DNS
             ✓DDOS	
  security
             ✓Traffic	
  analyIcs


             ProtecIon	
  SaaS
Combell




Fully	
  customized	
  &	
  managed	
  soluIons
Easy	
  peasy,	
  right?
Hybrid Cloud PHPUK2012
Single	
  point	
  of	
  failure
Shared	
  nothing
Nothing	
  is	
  local
Distributed	
  systems
Easy	
  to	
  deploy	
  &	
  manage?
How	
  do	
  you	
  
  deal	
  with
$_SESSIONS?
ReplicaIon
R/W	
  splibng
Hybrid Cloud PHPUK2012
“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
                                                      What	
  
✓Amazon                                             about	
  the	
  
 –1	
  EC2	
  instance                               Cloud?
 –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
Separate	
  
 MySQL
Separate	
  MySQL


 ✓Developer
  –Change	
  connecIonstring(s)
 ✓Sysadmin
  –Sets	
  up	
  separate	
  server
  –Tunes	
  for	
  MySQL
Separate	
  MySQL
                                             What	
  
✓Amazon                                    about	
  the	
  
 –Extra	
  EC2	
  instance	
  for	
  MySQL  Cloud?
 –RDS
✓Azure
 –MySQL	
  deployment	
  with	
  worker	
  role
 –Doesn’t	
  scale	
  well
 –Use	
  SQL	
  Azure	
  instead
✓Orchestra
 –By	
  default	
  separate
 –Create	
  separate	
  MySQL	
  database
 –RDS
MulIple	
  
MySQL’s
MulIple	
  MySQL’s

✓Developer
 –Read	
  write	
  spliUng	
  in	
  code
 –Connect	
  to	
  loadbalanced	
  hostname
✓Sysadmin
 –Setup	
  servers
 –Configure	
  replicaLon
   •Master/master
   •Master/slave
 –Add	
  to	
  loadbalancing
MulIple	
  
   Use	
  mysqlnd_ms	
  for	
  R/W	
  
splibng	
  in	
  case	
  of	
  crappy	
  code


MySQL’s
{
	
  	
  	
  	
  "myapp":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "master":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "write_group":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "host":	
  "master.db.myapp.ext",
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "port":	
  "3306"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }                                                 mysqlnd_ms_plugin.ini
	
  	
  	
  	
  	
  	
  	
  	
  },
	
  	
  	
  	
  	
  	
  	
  	
  "slave":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "read_group":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "host":	
  "slave.db.myapp.ext",
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "port":	
  "3306"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  }
}
mysqlnd_ms.enable=1
mysqlnd_ms.ini_file=/path/to/mysqlnd_ms_plugin.ini


                                              php.ini
<?php
$mysqli = new mysqli("myapp", "username", "p
assword", "database");
$pdo = new PDO('mysql:host=myapp;dbname=data
base', 'username', 'password');
$mysql = mysql_connect("myapp", "username", 
"password");


                                 ConnecIon	
  
                                   string
MulIple	
  MySQL’s
                                                         What	
  
✓Amazon                                                about	
  the	
  
 –MulLple	
  EC2	
  instances	
                         Cloud?
  with	
  replicaLon	
  and	
  loadbalancing
 –RDS	
  with	
  read	
  replica
✓Azure
 –Include	
  PHP	
  &	
  MySQL	
  in	
  package	
  script
 –Doesn’t	
  scale
 –Use	
  SQL	
  Azure
✓Orchestra
 –RDS
 –Xeround
MulIple	
  
 web	
  
servers
MulIple	
  web	
  servers

✓Developer
 –MulLple	
  places	
  to	
  deploy
 –Where	
  are	
  my	
  staLc	
  assets?
 –Sessions?
✓Sysadmin
 –MulLple	
  servers	
  behind	
  loadbalancer
 –$_SESSION	
  clustering	
  via	
  Memcached	
  or	
  
  sLcky	
  sessions
 –Shared	
  storage
Memcached	
  session	
  handler

session.save_handler	
  =	
  memcached
session.save_path=	
  “mc1.myapp.ext:
11211,mc2.myapp.ext:11211”
                                php.ini
MulIple	
  Web	
  servers
                                                   What	
  
✓Amazon                                          about	
  the	
  
 –MulLple	
  EC2	
  instances	
                   Cloud?
 –Use	
  ELB	
  for	
  loadbalancing
 –AMI	
  for	
  easy	
  setup
 –Config	
  management	
  (puppet,	
  chef,	
  ...)
✓Azure
 –Out	
  of	
  the	
  box
 –Tuning	
  possible
✓Orchestra
 –Out	
  of	
  the	
  box
Offload	
  
 staIc	
  
  files
Offload	
  staIc	
  files

✓Developer
 –Sync	
  current	
  assets
 –Store	
  new	
  files	
  on	
  external	
  servers
 –Use	
  external	
  hostname	
  when	
  referencing	
  
  files
✓Sysadmin
 –Tune	
  external	
  servers	
  for	
  staLc	
  content
 –CDN,	
  perhaps?
Offload	
  staIc	
  files
                                                     What	
  
✓Amazon                                            about	
  the	
  
 –EC2	
  instances	
  for	
  storage	
  with	
      Cloud?
  clustered	
  file	
  system
 –S3	
  buckets
✓Azure
 –Blog	
  storage
When	
  
     the	
  
pressure	
  
       is	
  
      on
Auto	
  scaling	
  &	
  load	
  balancing
CDN	
  &	
  asset	
  offloading
Reverse	
  (caching)	
  proxy
Memcached
Adapt
 your
code
Storage
require_once	
  'Zend/Service/WindowsAzure/Storage/Blob.php';	
  
$storageClient	
  =	
  new	
  Zend_Service_WindowsAzure_Storage_Blob();
$result	
  =	
  $storageClient-­‐>putBlob(
'testcontainer',	
  'example.txt',	
  '/example.txt'
);	
  
echo	
  'Blob	
  name	
  is:	
  '	
  .	
  $result-­‐>Name;
                                                              Azure	
  
                                                          Blog	
  storage
require_once	
  'Zend/Service/Amazon/S3.php';	
  
$s3	
  =	
  new	
  Zend_Service_Amazon_S3($my_aws_key,	
  
$my_aws_secret_key);	
  
$s3-­‐>createBucket("my-­‐own-­‐bucket");	
  
$s3-­‐>putObject("my-­‐own-­‐bucket/myobject",	
  "somedata");
echo	
  $s3-­‐>getObject("my-­‐own-­‐bucket/myobject");
                                                                 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_DIRECT
ORY   => $localDirectory,
));
$data = file_get_contents('/my/local/dir/picture.jpg');
$returnedData = $storage->storeItem('/my/remote/path/
picture.jpg', $data);

                                                   Even	
  
      Put	
                                   supports	
  local	
  
   opIons	
  in	
                               file	
  system
   config	
  file
Design	
  
     pajerns
                                  Modular	
  
    e.g.
                 AbstracIon	
      design
Dependency	
  
 injecLon          layers
+	
  
W3	
  Total	
  
 Cache
W3	
  Total	
  Cache

✓Page	
  caching	
  
 -­‐ Memcached	
  (loadbalanced)
 -­‐ Varnish	
  (loadbalanced)
✓Database	
  &	
  object	
  cache
 -­‐ Memcached	
  (loadbalanced)
✓CDN
 -­‐ Push	
  to	
  S3	
  or	
  Azure	
  Blog	
  storage	
  buckets
 -­‐ Pull	
  from	
  CDN	
  (CloudFront	
  or	
  Azure)
 -­‐ Custom	
  hostnames
✓Scale	
  across	
  EC2	
  nodes	
  with	
  ELB
Hybrid Cloud PHPUK2012
Hybrid Cloud PHPUK2012
Hybrid Cloud PHPUK2012
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
About	
  Azure	
  deployment
About	
  Azure	
  deployment
scaffolder	
  run	
  -­‐out="c:tempHelloAzureProject"

package	
  create	
  -­‐in="C:tempHelloAzureProject"	
  
-­‐out="C:tempHelloAzureDeployDev"	
  -­‐dev=true

                package	
                  package	
  
         for	
  deployment                and	
  run	
  on	
  
                                           emulator
package	
  create	
  -­‐in="C:tempHelloAzureProject"	
  
-­‐out="C:tempHelloAzureDeployProduction"	
  -­‐
dev=false
About	
  Azure	
  deployment
                           Sebngs.ini


Certificate=XXXXXXXX
SubscriptionId=XXXXX
Passphrase=XXXXXXXXX
StorageAccount=XXXXX
PackageLocation=_filesPhpOnAzure.cspkg
ServiceConfigLocation=_files
ServiceConfiguration.cscfg
About	
  Azure	
  deployment

deployment.php	
  CreateFromLocal	
  -­‐-­‐
ConfigFile="settings.ini"	
  -­‐-­‐Name="mysubdomain"	
  
-­‐-­‐DeploymentName="testdeploy"	
  -­‐-­‐
Label="testdeploy"	
  -­‐-­‐BySlot="staging"	
  -­‐-­‐
StartImmediately	
  -­‐-­‐WaitFor


                                    Deploy	
  
                                   to	
  staging
About	
  Azure	
  deployment

deployment.php	
  Swap	
  -­‐-­‐ConfigFile="settings.ini"	
  
-­‐-­‐Name="mysubdomain"	
  -­‐-­‐WaitFor

                  Scale	
                         Swap	
  
                   out                     to	
  producLon

deployment.php	
  EditInstanceNumber	
  -­‐-­‐
ConfigFile="settings.ini"	
  -­‐-­‐Name="subdomain"	
  -­‐-­‐
ByName="testdeploy"	
  -­‐-­‐RoleName="PhpOnAzure.Web"	
  
-­‐-­‐NewInstanceNumber=2
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?
Hybrid Cloud PHPUK2012
Hybrid Cloud PHPUK2012

More Related Content

Hybrid Cloud PHPUK2012