SlideShare une entreprise Scribd logo
1  sur  37
Télécharger pour lire hors ligne
dotCloud,

use Perl;
What is dotCloud?
●   Platform as a Service
    –   Computing Platform
    –   Solution Stack
    –   Horizontally and vertically scalable
●   Sane defaults in a configurable platform.
●   Rapid deployment
    –   From create to live in a couple of minutes.
●   Hot-patching
    –   Changes can be pushed with zero-downtime.
●   Complexity and Reliability management.
    –   So you can sleep at night.
Why use a Cloud platform service?
●   Developers don't have to pretend to be system administrators.

●   Clients don't have to maintain an infrastructure or expand the IT
    department.

●   Start-ups don't have to waste limited funds on hardware and
    fiber into their garage.

●   Quickly and easily scale to meet popular demand.

●   Reliability, Availability.
Services
             Perl
            Python
             Ruby
            NodeJS
             Redis
            MySQL
           PostgreSQL
              SSL
           WebSocket
              Java
              PHP
            MongoDB
              Static
            RabbitMQ
            ApacheSolr
              SMTP
               Opa

              Custom
dotCloud services
●   Service types include
    –   Web services (Served by nginx)
        ●   Perl, Python, PHP, Ruby, Java, Opa, NodeJS (sans
            nginx), and static.
    –   Worker services
    –   Data services
        ●   MySQL, PostgreSQL, MongoDB, redis.
    –   Other services
        ●   Apache Solr, RabbitMQ, SSL, SMTP, WebSocket
Custom Stacks
●   Web/Database       ●   Select stack
    –   Perl               components to
                           match the
    –   PostgreSQL
                           application's needs.
    –   SSL
                       ●   As many or as few as
    –   Redis
                           necessary.
A dotCloud stack...
●   Mix and match services as you see fit.
    –   We're here to talk about Perl.
●   Hosted on EC2.
    –   Scaled apps get multiple availability zones.
●   Stack components fit together like building
    blocks.
●   Add or remove components as the application
    evolves.
A typical Perl stack...
●   A Perl web service.
    –   Plack sits on nginx. Your framework sits
        on Plack.
        ●   Catalyst, Dancer, Mojolicious, bare Plack...
            anything that can ride on Plack.
●   A database?
    –   MySQL, MongoDB, PostgreSQL, Redis.
    –   Multiple if necessary.
●   A “Perl Worker”?
    –   Daemons, and long-running processes.
    –   Custom webservers.
        ●   Websocket support.
●   Maybe an SSL service with custom
    domain.
●   It's up to you, and you can change at
    any time.
Perl services...
●   Web or worker.
●   Perl web services spawn four processes.
    –   If a process dies it is re-spawned.
    –   If an EC2 instance goes wonky dotCloud reboots it
        and restores from backup.
    –   “Scaled applications were not affected...”
●   Perl worker service is for long-running
    services that don't need nginx/Plack.
What is Scaling?
●   Horizontal
    –   Concurrency – Handle more requests.
    –   Redundancy – High availability.
    –   Master/Slave – Database Replication.
●   Vertical
    –   Memory – Breathing room.
    –   Storage – Persistent data.
    –   Processing – More CPU.
Horizontal Scaling with dotCloud
●   Horizontal:
    –   Multiple Perl services under the same application
        ●   Multiple EC2 availability zones: Automatic.
        ●   Load balancing: Automatic.
        ●   Failover: Automatic.
        ●   Dedicated cluster.
    –   Multiple Database Services
        ●   Multiple EC2 availability zones.
        ●   Replication: Automatic.
        ●   Failover and re-syncing: Automatic.
Vertical Scaling with dotCloud
●   Vertical scaling reserves more memory and storage.
    –   Scale memory in 32MB increments.
    –   Storage is allocated as 10x the RAM allotment.
●   Examples:
    –   A Perl service that needs 256MB to breathe in, and 2GB
        storage: Scale to 256MB.
    –   A database that needs 4GB storage: Scale to 416MB RAM.
●   CPU scaling isn't featured at this time.
What does it cost? – Sandbox
●   Sandbox Applications – FREE.
    –   dotCloud clearly wants to be friendly to developers.
        ●   Non-scaled applications without custom domains are free.
        ●   RAM, availability, and bandwidth are on a “best effort” basis.
        ●   Piggyback SSL is free.
        ●   Develop for free.
        ●   Test for free.
        ●   Deploy and use for free.
        ●   No time limitations.
        ●   No limited introductory periods.
        ●   Even multi-service stacks are free.
●   PLAY, enjoy!
What does it cost? – Live
●   When you need....
    –   Horizontal or vertical scaling.
    –   Reliability and performance guarantees.
    –   Custom domains.
    –   CA-certificate SSL.
●   $4.32/month per service-instance per 32MB
    RAM.
Pricing – Example
●   A Perl web service that needs 64MB RAM: $8.64/month.
    –   Four processes are spawned. An app consuming 16MB deploys in
        64MB RAM after four workers spawn.
●   Horizontally scale that same service to two service-instances
    for reliability and load balancing:
    –   $17.28.
●   Add a horizontally scaled (master/slave) database with 640MB
    storage allocation:
    –   Total cost: $34.56/month.
●   More breathing room:
    –   Scale Perl to 128MB and database to 1GB storage: $69.12/month.
Scale as needed


●   Hit by a swarm?
    –   Up-scale to as many as five Perl service-instances (20 total
        processes).
    –   Higher scaling levels are available by explicit arrangement.
●   Nobody clicks at night/weekends?
    –   Down-scale during low-volume times.
●   Usage is measured hourly.
●   Scaling adjustments are “one liners” with the CLI.
●   Nearly instant spin-up.
Getting started
●   Create an account
●   Download and configure the CLI
      $ sudo easy_install pip && sudo pip
      install dotcloud
      ●   Ubuntu required sudo apt-get install python-
          setuptools first... bleah!
      ●   Windows and MacOS versions also exist.
      $ dotcloud
      ●   Enter the API key from
          http://www.dotcloud.com/account/settings
Create an application
●   Set up a local application directory.
      $ mkdir myapp
      $ cd myapp
●   We'll use a Mojolicious “Lite-App”.
      $ mojo generate lite_app myapp
●   Plan, program,test, etc...
●   Initialize the dotCloud repo.
      $ dotcloud create myapp
Prepare the configuration files
●   Makefile.PL
          PREREQ_PM => {
                  Test::More => '0',
                  YAML       => '0',
                  Mojolicious => '3.0',
                  Plack      => '0.9974',
          };
Configuration files
●   app.psgi
      $ENV{MOJO_MODE} = 'production'
      require 'myapp.pl';


●   dotcloud.yml
      www:
        type: perl
Deploy!

$ dotcloud push myapp myapp/
–   dotcloud command name path


Deployment finished successfully. Your
application is available at the
following URLs
www: http://myapp-
daoswald.dotcloud.com/
What just happened?
●   Relevant files were uploaded.
    –   “rsync” “mercurial”, or “git push”.
    –   You do have some control over this process if necessary:
        ●   dotcloud push –all
        ●   .gitignore
        ●   .dotcloudignore
●   cpanm pulls in all dependencies.
●   Application is built per Makefile.PL.
●   A supervisor starts Plack and spawns the workers.
●   Zero-downtime upgrades.
dotcloud.yml
●   List all the services.
    –   Give each a unique name.
●   List dependencies that don't fit Makefile.PL.
    –   cpanm used internally.
         ● Even pull tarballs by URL and build them out.


●   List an application root directory (per service)
    –   Useful for apps that reside in a more scalable
        directory structure.
●   Set environment variables.
●   Define prebuild and postbuild actions.
A simple directory structure
project_root/
    dotcloud.yml
    app_root/
        app.psgi
        Makefile.PL
        myapp.pl
        static/
        ...
A more scalable directory structure
project_root/
                       dotcloud.yml
   dotcloud.yml
   database_init.sql      www:
   myapp/                    type: perl
      app.psgi               approot: myapp
      Makefile.PL            db:
      myapp.conf
                                   type: mysql
      lib/
         Model/
         MyApp.pm
         Controller/   app.psgi
      log/
      public/             $ENV{MOJO_MODE} = 'production';
      script/             require 'script/myapp.pl';
            myapp.pl
      t/
      templates/
The database connection
●   dotcloud.yml:
        www:
            type: Perl
            approot: myapp
        db:
            type: mysql
●   environment.json
    –   Readable by the application.
    –   Contains database host, port, login, password info, custom variables, etc.
        ●   Inside my app, I merge its contents into my configuration data-structure.
    $ dotcloud info myapp.db
    –   View service parameters.
    $ dotcloud run myapp.db – mysql
    –   Get a mysql> prompt.
environment.json
{
    "DOTCLOUD_WWW_HTTP_URL": "http://myapp-daoswald.dotcloud.com/",
    "DOTCLOUD_WWW_SSH_PORT": "XXXXX",
    "DOTCLOUD_WWW_SSH_URL": "ssh://dotcloud@myapp-daoswald.dotcloud.com:XXXXX",
    "DOTCLOUD_DB_MYSQL_LOGIN": "XXXXXX",
    "DOTCLOUD_WWW_SSH_HOST": "myapp-daoswald.dotcloud.com",
    "DOTCLOUD_PROJECT": "myapp",
    "DOTCLOUD_SERVICE_NAME": "www",
    "DOTCLOUD_WWW_HTTP_VHOSTS_LIST": "myapp-daoswald.dotcloud.com",
    "PORT_SSH": XXXXX,
    "DOTCLOUD_DB_SSH_PORT": "XXXXX",
    "DOTCLOUD_WWW_HTTP_HOST": "myapp-daoswald.dotcloud.com",
    "DOTCLOUD_DB_SSH_URL": "ssh://mysql@myapp-daoswald.dotcloud.com:XXXXX",
    "DOTCLOUD_ENVIRONMENT": "default",
    "DOTCLOUD_DB_SSH_HOST": "myapp-daoswald.dotcloud.com",
    "DOTCLOUD_DB_MYSQL_HOST": "myapp-daoswald.dotcloud.com",
    "DOTCLOUD_DB_MYSQL_PASSWORD": "some_passphrase",
    "DOTCLOUD_DB_MYSQL_PORT": "XXXXX",
    "DOTCLOUD_DB_MYSQL_URL": "mysql://USER:PASS_XXXXX@myapp-daoswald.dotcloud.com:XXXXX",
    "DOTCLOUD_SERVICE_ID": "0",
    "PORT_HTTP": 80
}
environment.json simplified

●   DotCloud::Environment
    –   Easy handling of environment in dotcloud.
        ●   (In case a simple JSON file isn't simple enough.)
Other dotcloud.yml options
www:
   type: perl
   approot: helloperl
   requirements:
       http://example.com/something/not/on/cpan/yet.tar.gz
   config:
       perl_version: v5.16.x
       uwsgi_memory_report: true
       uwsgi_buffer_size: 8192
       uwsgi_processes: 4
   prebuild: ./prebuild.pl
   postbuild: ./postbuild.pl
worker:
   type: perl-worker
   …
Odds and ends
●   Static content will be served out of static/
●   nginx.conf: override the default nginx configuration.
●   Crontabs may be set in the Perl service, in a separate worker service,
    even in a database service.
    –   Beware of horizontal scaling and crontabs.
●   Off-site backups scheduled via crontabs.
●   dotCloud is the first PaaS with WebSocket support.
    –   Mojolicious is also WebSocket friendly.
The CLI tool
$ dotcloud create myapp
$ dotcloud create myapp -f live
$ dotcloud info myapp.www
$ dotcloud push myapp
$ dotcloud stats myapp.www
$ dotcloud scale myapp db:instances=2
$ dotcloud scale myapp www:instances=4
$ dotcloud scale myapp www:memory=512M
$ dotcloud destroy myapp
$ dotcloud logs myapp.www
$ dotcloud run myapp.db -- single-command
$ dotcloud ssh myapp.worker
A sample use-case
●   Client requires high availability web, and database redundancy:
    –   Perl web service scaled to two 256MB instances.
        ●   Load balancing, automatic failover, separate availability zones.
        ●   4 processes of 64MB each per service instance.
             –   Enough for Mojolicious, DBIx::Class, Moose, and some breathing room.
    –   Database scaled to two instances of 512MB (5GB storage).
        ●   Replication/syncing, automatic failover, separate availability zones.
    –   A single 64MB Perl worker for cron jobs (backups, etc.)
●   Cost: $216/month.
●   A custom domain with SSL certificate, add $21.60/month: total, $237.60.
    –   DotCloud configures a dedicated load balancer instance (since SSL requires at
        least one IP address per domain, or more accurately, per certificate).
●   Client and developer each get to sleep at night: Priceless.
    –   Sorry IT department – nothing to see here. ;)
Communications
●   @dotcloudstatus
    –   Exceptional events and are tweeted out.
    –   Get used to “Scaled applications were unaffected...”
●   http://status.dotcloud.com
    –   The same as the tweets.
●   http://platform-status.dotcloud.com
    –   A quick overview of cluster status.
●   $ dotcloud status myapp.www
●   irc://irc.freenode.net#dotcloud
●   support@dotcloud.com
    –   Real (useful) replies within a few hours – No dialog script.
●   http://support.dotcloud.com
●   http://help.dotcloud.com
Conclusions
●   Much more than bare EC2.
●   Supportive of the developer community.
●   Can-do attitude.
●   Innovative.
●   Reliable.
●   It's easy.
●   Deploying an application takes minutes.
●   Hot-patches take seconds, with no downtime.
A Working Example
●   The Perl Regex Tester
    –   http://retester-daoswald.dotcloud.com
    –   Uses a single dotCloud Perl service and less than 96MB RAM.
        ●   Deployed as a “Sandbox” app.
        ●   Configured for two uwsgi processes (low volume, so conserve memory)
        ●   If deployed “Live”, it would cost abpit $13/month.
    –   A Mojolicious::Lite application.
    –   Includes the application script, a model module, Twitter Bootstrap
        CSS/JS.
    –   Pulls in many CPAN dependencies (mostly to handle the paranoia of
        executing user-supplied regexes).
    –   Source on Github: https://github.com/daoswald/retester.git
David Oswald
                 daoswald@gmail.com
                   davido@cpan.org


http://www.slideshare.net/daoswald/deploying-perl-apps-on-dotcloud
Experiment! Play!

   $ dotcloud push my_cool_idea

Next month let's look at what you deployed to
                   dotCloud.

Contenu connexe

Tendances

The Parenscript Common Lisp to JavaScript compiler
The Parenscript Common Lisp to JavaScript compilerThe Parenscript Common Lisp to JavaScript compiler
The Parenscript Common Lisp to JavaScript compilerVladimir Sedach
 
parenscript-tutorial
parenscript-tutorialparenscript-tutorial
parenscript-tutorialtutorialsruby
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterZendCon
 
Hijacking Ruby Syntax in Ruby
Hijacking Ruby Syntax in RubyHijacking Ruby Syntax in Ruby
Hijacking Ruby Syntax in RubySATOSHI TAGOMORI
 
Getting started with Catalyst and extjs
Getting started with Catalyst and extjsGetting started with Catalyst and extjs
Getting started with Catalyst and extjsPeter Edwards
 
Practical catalyst
Practical catalystPractical catalyst
Practical catalystdwm042
 
Practical Testing of Ruby Core
Practical Testing of Ruby CorePractical Testing of Ruby Core
Practical Testing of Ruby CoreHiroshi SHIBATA
 
Doctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHPDoctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHPGuilherme Blanco
 

Tendances (20)

The Parenscript Common Lisp to JavaScript compiler
The Parenscript Common Lisp to JavaScript compilerThe Parenscript Common Lisp to JavaScript compiler
The Parenscript Common Lisp to JavaScript compiler
 
RubyGems 3 & 4
RubyGems 3 & 4RubyGems 3 & 4
RubyGems 3 & 4
 
Workin On The Rails Road
Workin On The Rails RoadWorkin On The Rails Road
Workin On The Rails Road
 
Hacking with hhvm
Hacking with hhvmHacking with hhvm
Hacking with hhvm
 
Php on Windows
Php on WindowsPhp on Windows
Php on Windows
 
parenscript-tutorial
parenscript-tutorialparenscript-tutorial
parenscript-tutorial
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life better
 
Till Vollmer Presentation
Till Vollmer PresentationTill Vollmer Presentation
Till Vollmer Presentation
 
Hijacking Ruby Syntax in Ruby
Hijacking Ruby Syntax in RubyHijacking Ruby Syntax in Ruby
Hijacking Ruby Syntax in Ruby
 
Debugging on rails
Debugging on railsDebugging on rails
Debugging on rails
 
Sinatra for REST services
Sinatra for REST servicesSinatra for REST services
Sinatra for REST services
 
Getting started with Catalyst and extjs
Getting started with Catalyst and extjsGetting started with Catalyst and extjs
Getting started with Catalyst and extjs
 
Practical catalyst
Practical catalystPractical catalyst
Practical catalyst
 
Modern Perl
Modern PerlModern Perl
Modern Perl
 
Practical Testing of Ruby Core
Practical Testing of Ruby CorePractical Testing of Ruby Core
Practical Testing of Ruby Core
 
Doctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHPDoctrine 2.0 Enterprise Persistence Layer for PHP
Doctrine 2.0 Enterprise Persistence Layer for PHP
 
CPAN Training
CPAN TrainingCPAN Training
CPAN Training
 
Fluentd meetup in japan
Fluentd meetup in japanFluentd meetup in japan
Fluentd meetup in japan
 
Plack - LPW 2009
Plack - LPW 2009Plack - LPW 2009
Plack - LPW 2009
 
Intro to PSGI and Plack
Intro to PSGI and PlackIntro to PSGI and Plack
Intro to PSGI and Plack
 

Similaire à Deploying Perl apps on dotCloud

Automating Complex Setups with Puppet
Automating Complex Setups with PuppetAutomating Complex Setups with Puppet
Automating Complex Setups with PuppetKris Buytaert
 
[HKOSCON][20180616][Containerized High Availability Virtual Hosting Deploymen...
[HKOSCON][20180616][Containerized High Availability Virtual Hosting Deploymen...[HKOSCON][20180616][Containerized High Availability Virtual Hosting Deploymen...
[HKOSCON][20180616][Containerized High Availability Virtual Hosting Deploymen...Wong Hoi Sing Edison
 
AWS DevOps - Terraform, Docker, HashiCorp Vault
AWS DevOps - Terraform, Docker, HashiCorp VaultAWS DevOps - Terraform, Docker, HashiCorp Vault
AWS DevOps - Terraform, Docker, HashiCorp VaultGrzegorz Adamowicz
 
Introduction to PaaS and Heroku
Introduction to PaaS and HerokuIntroduction to PaaS and Heroku
Introduction to PaaS and HerokuTapio Rautonen
 
Truemotion Adventures in Containerization
Truemotion Adventures in ContainerizationTruemotion Adventures in Containerization
Truemotion Adventures in ContainerizationRyan Hunter
 
I Just Want to Run My Code: Waypoint, Nomad, and Other Things
I Just Want to Run My Code: Waypoint, Nomad, and Other ThingsI Just Want to Run My Code: Waypoint, Nomad, and Other Things
I Just Want to Run My Code: Waypoint, Nomad, and Other ThingsMichael Lange
 
AWS (Hadoop) Meetup 30.04.09
AWS (Hadoop) Meetup 30.04.09AWS (Hadoop) Meetup 30.04.09
AWS (Hadoop) Meetup 30.04.09Chris Purrington
 
Ansible Automation to Rule Them All
Ansible Automation to Rule Them AllAnsible Automation to Rule Them All
Ansible Automation to Rule Them AllTim Fairweather
 
Introduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azureIntroduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azureColin Mackay
 
Automating complex infrastructures with Puppet
Automating complex infrastructures with PuppetAutomating complex infrastructures with Puppet
Automating complex infrastructures with PuppetKris Buytaert
 
DevEx | there’s no place like k3s
DevEx | there’s no place like k3sDevEx | there’s no place like k3s
DevEx | there’s no place like k3sHaggai Philip Zagury
 
Docker Swarm and Traefik 2.0
Docker Swarm and Traefik 2.0Docker Swarm and Traefik 2.0
Docker Swarm and Traefik 2.0Jakub Hajek
 
From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...Jérôme Petazzoni
 
Node.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scaleNode.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scaleDmytro Semenov
 
SCM Puppet: from an intro to the scaling
SCM Puppet: from an intro to the scalingSCM Puppet: from an intro to the scaling
SCM Puppet: from an intro to the scalingStanislav Osipov
 
OSDC 2018 | Three years running containers with Kubernetes in Production by T...
OSDC 2018 | Three years running containers with Kubernetes in Production by T...OSDC 2018 | Three years running containers with Kubernetes in Production by T...
OSDC 2018 | Three years running containers with Kubernetes in Production by T...NETWAYS
 
Terraforming your Infrastructure on GCP
Terraforming your Infrastructure on GCPTerraforming your Infrastructure on GCP
Terraforming your Infrastructure on GCPSamuel Chow
 
Netflix oss season 1 episode 3
Netflix oss season 1 episode 3 Netflix oss season 1 episode 3
Netflix oss season 1 episode 3 Ruslan Meshenberg
 

Similaire à Deploying Perl apps on dotCloud (20)

Automating Complex Setups with Puppet
Automating Complex Setups with PuppetAutomating Complex Setups with Puppet
Automating Complex Setups with Puppet
 
[HKOSCON][20180616][Containerized High Availability Virtual Hosting Deploymen...
[HKOSCON][20180616][Containerized High Availability Virtual Hosting Deploymen...[HKOSCON][20180616][Containerized High Availability Virtual Hosting Deploymen...
[HKOSCON][20180616][Containerized High Availability Virtual Hosting Deploymen...
 
AWS DevOps - Terraform, Docker, HashiCorp Vault
AWS DevOps - Terraform, Docker, HashiCorp VaultAWS DevOps - Terraform, Docker, HashiCorp Vault
AWS DevOps - Terraform, Docker, HashiCorp Vault
 
Introduction to PaaS and Heroku
Introduction to PaaS and HerokuIntroduction to PaaS and Heroku
Introduction to PaaS and Heroku
 
Truemotion Adventures in Containerization
Truemotion Adventures in ContainerizationTruemotion Adventures in Containerization
Truemotion Adventures in Containerization
 
I Just Want to Run My Code: Waypoint, Nomad, and Other Things
I Just Want to Run My Code: Waypoint, Nomad, and Other ThingsI Just Want to Run My Code: Waypoint, Nomad, and Other Things
I Just Want to Run My Code: Waypoint, Nomad, and Other Things
 
AWS (Hadoop) Meetup 30.04.09
AWS (Hadoop) Meetup 30.04.09AWS (Hadoop) Meetup 30.04.09
AWS (Hadoop) Meetup 30.04.09
 
Ansible Automation to Rule Them All
Ansible Automation to Rule Them AllAnsible Automation to Rule Them All
Ansible Automation to Rule Them All
 
Introduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azureIntroduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azure
 
Automating complex infrastructures with Puppet
Automating complex infrastructures with PuppetAutomating complex infrastructures with Puppet
Automating complex infrastructures with Puppet
 
Scaling PHP apps
Scaling PHP appsScaling PHP apps
Scaling PHP apps
 
DevEx | there’s no place like k3s
DevEx | there’s no place like k3sDevEx | there’s no place like k3s
DevEx | there’s no place like k3s
 
Docker Swarm and Traefik 2.0
Docker Swarm and Traefik 2.0Docker Swarm and Traefik 2.0
Docker Swarm and Traefik 2.0
 
From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...From development environments to production deployments with Docker, Compose,...
From development environments to production deployments with Docker, Compose,...
 
Node.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scaleNode.js Web Apps @ ebay scale
Node.js Web Apps @ ebay scale
 
SCM Puppet: from an intro to the scaling
SCM Puppet: from an intro to the scalingSCM Puppet: from an intro to the scaling
SCM Puppet: from an intro to the scaling
 
Scaling symfony apps
Scaling symfony appsScaling symfony apps
Scaling symfony apps
 
OSDC 2018 | Three years running containers with Kubernetes in Production by T...
OSDC 2018 | Three years running containers with Kubernetes in Production by T...OSDC 2018 | Three years running containers with Kubernetes in Production by T...
OSDC 2018 | Three years running containers with Kubernetes in Production by T...
 
Terraforming your Infrastructure on GCP
Terraforming your Infrastructure on GCPTerraforming your Infrastructure on GCP
Terraforming your Infrastructure on GCP
 
Netflix oss season 1 episode 3
Netflix oss season 1 episode 3 Netflix oss season 1 episode 3
Netflix oss season 1 episode 3
 

Plus de daoswald

Perl: Setting Up An Internal Darkpan
Perl: Setting Up An Internal DarkpanPerl: Setting Up An Internal Darkpan
Perl: Setting Up An Internal Darkpandaoswald
 
Speaking at Tech Events
Speaking at Tech EventsSpeaking at Tech Events
Speaking at Tech Eventsdaoswald
 
Perl one-liners
Perl one-linersPerl one-liners
Perl one-linersdaoswald
 
Whatsnew in-perl
Whatsnew in-perlWhatsnew in-perl
Whatsnew in-perldaoswald
 
Add Perl to Your Toolbelt
Add Perl to Your ToolbeltAdd Perl to Your Toolbelt
Add Perl to Your Toolbeltdaoswald
 
Think Like a Programmer
Think Like a ProgrammerThink Like a Programmer
Think Like a Programmerdaoswald
 
Regular Expressions: Backtracking, and The Little Engine that Could(n't)?
Regular Expressions: Backtracking, and The Little Engine that Could(n't)?Regular Expressions: Backtracking, and The Little Engine that Could(n't)?
Regular Expressions: Backtracking, and The Little Engine that Could(n't)?daoswald
 
Perls Functional functions
Perls Functional functionsPerls Functional functions
Perls Functional functionsdaoswald
 

Plus de daoswald (8)

Perl: Setting Up An Internal Darkpan
Perl: Setting Up An Internal DarkpanPerl: Setting Up An Internal Darkpan
Perl: Setting Up An Internal Darkpan
 
Speaking at Tech Events
Speaking at Tech EventsSpeaking at Tech Events
Speaking at Tech Events
 
Perl one-liners
Perl one-linersPerl one-liners
Perl one-liners
 
Whatsnew in-perl
Whatsnew in-perlWhatsnew in-perl
Whatsnew in-perl
 
Add Perl to Your Toolbelt
Add Perl to Your ToolbeltAdd Perl to Your Toolbelt
Add Perl to Your Toolbelt
 
Think Like a Programmer
Think Like a ProgrammerThink Like a Programmer
Think Like a Programmer
 
Regular Expressions: Backtracking, and The Little Engine that Could(n't)?
Regular Expressions: Backtracking, and The Little Engine that Could(n't)?Regular Expressions: Backtracking, and The Little Engine that Could(n't)?
Regular Expressions: Backtracking, and The Little Engine that Could(n't)?
 
Perls Functional functions
Perls Functional functionsPerls Functional functions
Perls Functional functions
 

Deploying Perl apps on dotCloud

  • 2. What is dotCloud? ● Platform as a Service – Computing Platform – Solution Stack – Horizontally and vertically scalable ● Sane defaults in a configurable platform. ● Rapid deployment – From create to live in a couple of minutes. ● Hot-patching – Changes can be pushed with zero-downtime. ● Complexity and Reliability management. – So you can sleep at night.
  • 3. Why use a Cloud platform service? ● Developers don't have to pretend to be system administrators. ● Clients don't have to maintain an infrastructure or expand the IT department. ● Start-ups don't have to waste limited funds on hardware and fiber into their garage. ● Quickly and easily scale to meet popular demand. ● Reliability, Availability.
  • 4. Services Perl Python Ruby NodeJS Redis MySQL PostgreSQL SSL WebSocket Java PHP MongoDB Static RabbitMQ ApacheSolr SMTP Opa Custom
  • 5. dotCloud services ● Service types include – Web services (Served by nginx) ● Perl, Python, PHP, Ruby, Java, Opa, NodeJS (sans nginx), and static. – Worker services – Data services ● MySQL, PostgreSQL, MongoDB, redis. – Other services ● Apache Solr, RabbitMQ, SSL, SMTP, WebSocket
  • 6. Custom Stacks ● Web/Database ● Select stack – Perl components to match the – PostgreSQL application's needs. – SSL ● As many or as few as – Redis necessary.
  • 7. A dotCloud stack... ● Mix and match services as you see fit. – We're here to talk about Perl. ● Hosted on EC2. – Scaled apps get multiple availability zones. ● Stack components fit together like building blocks. ● Add or remove components as the application evolves.
  • 8. A typical Perl stack... ● A Perl web service. – Plack sits on nginx. Your framework sits on Plack. ● Catalyst, Dancer, Mojolicious, bare Plack... anything that can ride on Plack. ● A database? – MySQL, MongoDB, PostgreSQL, Redis. – Multiple if necessary. ● A “Perl Worker”? – Daemons, and long-running processes. – Custom webservers. ● Websocket support. ● Maybe an SSL service with custom domain. ● It's up to you, and you can change at any time.
  • 9. Perl services... ● Web or worker. ● Perl web services spawn four processes. – If a process dies it is re-spawned. – If an EC2 instance goes wonky dotCloud reboots it and restores from backup. – “Scaled applications were not affected...” ● Perl worker service is for long-running services that don't need nginx/Plack.
  • 10. What is Scaling? ● Horizontal – Concurrency – Handle more requests. – Redundancy – High availability. – Master/Slave – Database Replication. ● Vertical – Memory – Breathing room. – Storage – Persistent data. – Processing – More CPU.
  • 11. Horizontal Scaling with dotCloud ● Horizontal: – Multiple Perl services under the same application ● Multiple EC2 availability zones: Automatic. ● Load balancing: Automatic. ● Failover: Automatic. ● Dedicated cluster. – Multiple Database Services ● Multiple EC2 availability zones. ● Replication: Automatic. ● Failover and re-syncing: Automatic.
  • 12. Vertical Scaling with dotCloud ● Vertical scaling reserves more memory and storage. – Scale memory in 32MB increments. – Storage is allocated as 10x the RAM allotment. ● Examples: – A Perl service that needs 256MB to breathe in, and 2GB storage: Scale to 256MB. – A database that needs 4GB storage: Scale to 416MB RAM. ● CPU scaling isn't featured at this time.
  • 13. What does it cost? – Sandbox ● Sandbox Applications – FREE. – dotCloud clearly wants to be friendly to developers. ● Non-scaled applications without custom domains are free. ● RAM, availability, and bandwidth are on a “best effort” basis. ● Piggyback SSL is free. ● Develop for free. ● Test for free. ● Deploy and use for free. ● No time limitations. ● No limited introductory periods. ● Even multi-service stacks are free. ● PLAY, enjoy!
  • 14. What does it cost? – Live ● When you need.... – Horizontal or vertical scaling. – Reliability and performance guarantees. – Custom domains. – CA-certificate SSL. ● $4.32/month per service-instance per 32MB RAM.
  • 15. Pricing – Example ● A Perl web service that needs 64MB RAM: $8.64/month. – Four processes are spawned. An app consuming 16MB deploys in 64MB RAM after four workers spawn. ● Horizontally scale that same service to two service-instances for reliability and load balancing: – $17.28. ● Add a horizontally scaled (master/slave) database with 640MB storage allocation: – Total cost: $34.56/month. ● More breathing room: – Scale Perl to 128MB and database to 1GB storage: $69.12/month.
  • 16. Scale as needed ● Hit by a swarm? – Up-scale to as many as five Perl service-instances (20 total processes). – Higher scaling levels are available by explicit arrangement. ● Nobody clicks at night/weekends? – Down-scale during low-volume times. ● Usage is measured hourly. ● Scaling adjustments are “one liners” with the CLI. ● Nearly instant spin-up.
  • 17. Getting started ● Create an account ● Download and configure the CLI $ sudo easy_install pip && sudo pip install dotcloud ● Ubuntu required sudo apt-get install python- setuptools first... bleah! ● Windows and MacOS versions also exist. $ dotcloud ● Enter the API key from http://www.dotcloud.com/account/settings
  • 18. Create an application ● Set up a local application directory. $ mkdir myapp $ cd myapp ● We'll use a Mojolicious “Lite-App”. $ mojo generate lite_app myapp ● Plan, program,test, etc... ● Initialize the dotCloud repo. $ dotcloud create myapp
  • 19. Prepare the configuration files ● Makefile.PL PREREQ_PM => { Test::More => '0', YAML => '0', Mojolicious => '3.0', Plack => '0.9974', };
  • 20. Configuration files ● app.psgi $ENV{MOJO_MODE} = 'production' require 'myapp.pl'; ● dotcloud.yml www: type: perl
  • 21. Deploy! $ dotcloud push myapp myapp/ – dotcloud command name path Deployment finished successfully. Your application is available at the following URLs www: http://myapp- daoswald.dotcloud.com/
  • 22. What just happened? ● Relevant files were uploaded. – “rsync” “mercurial”, or “git push”. – You do have some control over this process if necessary: ● dotcloud push –all ● .gitignore ● .dotcloudignore ● cpanm pulls in all dependencies. ● Application is built per Makefile.PL. ● A supervisor starts Plack and spawns the workers. ● Zero-downtime upgrades.
  • 23. dotcloud.yml ● List all the services. – Give each a unique name. ● List dependencies that don't fit Makefile.PL. – cpanm used internally. ● Even pull tarballs by URL and build them out. ● List an application root directory (per service) – Useful for apps that reside in a more scalable directory structure. ● Set environment variables. ● Define prebuild and postbuild actions.
  • 24. A simple directory structure project_root/ dotcloud.yml app_root/ app.psgi Makefile.PL myapp.pl static/ ...
  • 25. A more scalable directory structure project_root/ dotcloud.yml dotcloud.yml database_init.sql www: myapp/ type: perl app.psgi approot: myapp Makefile.PL db: myapp.conf type: mysql lib/ Model/ MyApp.pm Controller/ app.psgi log/ public/ $ENV{MOJO_MODE} = 'production'; script/ require 'script/myapp.pl'; myapp.pl t/ templates/
  • 26. The database connection ● dotcloud.yml: www: type: Perl approot: myapp db: type: mysql ● environment.json – Readable by the application. – Contains database host, port, login, password info, custom variables, etc. ● Inside my app, I merge its contents into my configuration data-structure. $ dotcloud info myapp.db – View service parameters. $ dotcloud run myapp.db – mysql – Get a mysql> prompt.
  • 27. environment.json { "DOTCLOUD_WWW_HTTP_URL": "http://myapp-daoswald.dotcloud.com/", "DOTCLOUD_WWW_SSH_PORT": "XXXXX", "DOTCLOUD_WWW_SSH_URL": "ssh://dotcloud@myapp-daoswald.dotcloud.com:XXXXX", "DOTCLOUD_DB_MYSQL_LOGIN": "XXXXXX", "DOTCLOUD_WWW_SSH_HOST": "myapp-daoswald.dotcloud.com", "DOTCLOUD_PROJECT": "myapp", "DOTCLOUD_SERVICE_NAME": "www", "DOTCLOUD_WWW_HTTP_VHOSTS_LIST": "myapp-daoswald.dotcloud.com", "PORT_SSH": XXXXX, "DOTCLOUD_DB_SSH_PORT": "XXXXX", "DOTCLOUD_WWW_HTTP_HOST": "myapp-daoswald.dotcloud.com", "DOTCLOUD_DB_SSH_URL": "ssh://mysql@myapp-daoswald.dotcloud.com:XXXXX", "DOTCLOUD_ENVIRONMENT": "default", "DOTCLOUD_DB_SSH_HOST": "myapp-daoswald.dotcloud.com", "DOTCLOUD_DB_MYSQL_HOST": "myapp-daoswald.dotcloud.com", "DOTCLOUD_DB_MYSQL_PASSWORD": "some_passphrase", "DOTCLOUD_DB_MYSQL_PORT": "XXXXX", "DOTCLOUD_DB_MYSQL_URL": "mysql://USER:PASS_XXXXX@myapp-daoswald.dotcloud.com:XXXXX", "DOTCLOUD_SERVICE_ID": "0", "PORT_HTTP": 80 }
  • 28. environment.json simplified ● DotCloud::Environment – Easy handling of environment in dotcloud. ● (In case a simple JSON file isn't simple enough.)
  • 29. Other dotcloud.yml options www: type: perl approot: helloperl requirements: http://example.com/something/not/on/cpan/yet.tar.gz config: perl_version: v5.16.x uwsgi_memory_report: true uwsgi_buffer_size: 8192 uwsgi_processes: 4 prebuild: ./prebuild.pl postbuild: ./postbuild.pl worker: type: perl-worker …
  • 30. Odds and ends ● Static content will be served out of static/ ● nginx.conf: override the default nginx configuration. ● Crontabs may be set in the Perl service, in a separate worker service, even in a database service. – Beware of horizontal scaling and crontabs. ● Off-site backups scheduled via crontabs. ● dotCloud is the first PaaS with WebSocket support. – Mojolicious is also WebSocket friendly.
  • 31. The CLI tool $ dotcloud create myapp $ dotcloud create myapp -f live $ dotcloud info myapp.www $ dotcloud push myapp $ dotcloud stats myapp.www $ dotcloud scale myapp db:instances=2 $ dotcloud scale myapp www:instances=4 $ dotcloud scale myapp www:memory=512M $ dotcloud destroy myapp $ dotcloud logs myapp.www $ dotcloud run myapp.db -- single-command $ dotcloud ssh myapp.worker
  • 32. A sample use-case ● Client requires high availability web, and database redundancy: – Perl web service scaled to two 256MB instances. ● Load balancing, automatic failover, separate availability zones. ● 4 processes of 64MB each per service instance. – Enough for Mojolicious, DBIx::Class, Moose, and some breathing room. – Database scaled to two instances of 512MB (5GB storage). ● Replication/syncing, automatic failover, separate availability zones. – A single 64MB Perl worker for cron jobs (backups, etc.) ● Cost: $216/month. ● A custom domain with SSL certificate, add $21.60/month: total, $237.60. – DotCloud configures a dedicated load balancer instance (since SSL requires at least one IP address per domain, or more accurately, per certificate). ● Client and developer each get to sleep at night: Priceless. – Sorry IT department – nothing to see here. ;)
  • 33. Communications ● @dotcloudstatus – Exceptional events and are tweeted out. – Get used to “Scaled applications were unaffected...” ● http://status.dotcloud.com – The same as the tweets. ● http://platform-status.dotcloud.com – A quick overview of cluster status. ● $ dotcloud status myapp.www ● irc://irc.freenode.net#dotcloud ● support@dotcloud.com – Real (useful) replies within a few hours – No dialog script. ● http://support.dotcloud.com ● http://help.dotcloud.com
  • 34. Conclusions ● Much more than bare EC2. ● Supportive of the developer community. ● Can-do attitude. ● Innovative. ● Reliable. ● It's easy. ● Deploying an application takes minutes. ● Hot-patches take seconds, with no downtime.
  • 35. A Working Example ● The Perl Regex Tester – http://retester-daoswald.dotcloud.com – Uses a single dotCloud Perl service and less than 96MB RAM. ● Deployed as a “Sandbox” app. ● Configured for two uwsgi processes (low volume, so conserve memory) ● If deployed “Live”, it would cost abpit $13/month. – A Mojolicious::Lite application. – Includes the application script, a model module, Twitter Bootstrap CSS/JS. – Pulls in many CPAN dependencies (mostly to handle the paranoia of executing user-supplied regexes). – Source on Github: https://github.com/daoswald/retester.git
  • 36. David Oswald daoswald@gmail.com davido@cpan.org http://www.slideshare.net/daoswald/deploying-perl-apps-on-dotcloud
  • 37. Experiment! Play! $ dotcloud push my_cool_idea Next month let's look at what you deployed to dotCloud.