• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Deploying Perl apps on dotCloud
 

Deploying Perl apps on dotCloud

on

  • 2,348 views

Perl Mongers presentation on deploying Perl web applications on dotCloud. Examples use a minimal Mojolicious::Lite app.

Perl Mongers presentation on deploying Perl web applications on dotCloud. Examples use a minimal Mojolicious::Lite app.

Statistics

Views

Total Views
2,348
Views on SlideShare
2,345
Embed Views
3

Actions

Likes
4
Downloads
11
Comments
0

1 Embed 3

http://wiki.home.wols.org 3

Accessibility

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Deploying Perl apps on dotCloud Deploying Perl apps on dotCloud Presentation Transcript

    • 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 dont have to pretend to be system administrators.● Clients dont have to maintain an infrastructure or expand the IT department.● Start-ups dont 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 applications needs. – SSL ● As many or as few as – Redis necessary.
    • A dotCloud stack...● Mix and match services as you see fit. – Were 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.● Its 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 dont 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 isnt 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● Well 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 pathDeployment finished successfully. Yourapplication is available at thefollowing URLswww: 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 dont 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 structureproject_root/ dotcloud.yml app_root/ app.psgi Makefile.PL myapp.pl static/ ...
    • A more scalable directory structureproject_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 isnt simple enough.)
    • Other dotcloud.yml optionswww: 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.plworker: 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.● Its 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.orghttp://www.slideshare.net/daoswald/deploying-perl-apps-on-dotcloud
    • Experiment! Play! $ dotcloud push my_cool_ideaNext month lets look at what you deployed to dotCloud.